Ответ 1
Как (подробно) внедрить Microsoft как Intellisense вашего типа?
Я могу описать его на любой уровень детализации, который вы хотите назвать, но у меня нет времени для более чем краткого объяснения. Я объясню, как мы это делаем в Рослине.
Сначала мы создаем неизменяемую модель потока токенов, используя структуру данных, которая может эффективно представлять редактирование, поскольку, очевидно, редактирование - это именно то, что будет много.
Ключевым понятием, чтобы сделать его эффективным для постоянного повторного использования, является представление длины символов токенов, но не их позиций символов в буфере редактирования; помните, что токен в конце файла будет менять позицию при каждом редактировании, но длина токена не изменяется. Вы должны во что бы то ни стало минимизировать количество полных повторных лексиков, если вы хотите быть эффективными в чрезвычайно больших файлах.
Как только у вас есть неизменяемая модель, которая может обрабатывать вставки и удаления для создания неизменяемого потока токенов без повторного lexing всего файла каждый раз, вы должны делать то же самое, но для грамматического анализа. На практике это значительно сложнее. Я рекомендую вам получить степень бакалавра или аспирантуру по информатике с акцентом на теорию парсера, если вы еще этого не сделали. Мы получили помощь людей с PhD, которые сделали свои тезисы по теории парсеров, чтобы спроектировать этот конкретный бит алгоритма.
Затем, очевидно, постройте грамматический анализатор, который может анализировать С#. Помните, что он должен анализировать сломанные С#, а не С#; IntelliSense должен работать, пока программа находится в состоянии без компиляции. Поэтому начните с внесения изменений в грамматику с хорошими характеристиками восстановления ошибок.
Итак, теперь у вас есть синтаксический анализатор, который может эффективно выполнять грамматический анализ без повторного лексирования или повторного анализа всего, кроме отредактированного региона, большую часть времени, что означает, что вы можете выполнять работу между нажатиями клавиш. Я забыл упомянуть, конечно, вам нужно будет придумать какой-то механизм, чтобы не блокировать поток пользовательского интерфейса при выполнении всех этих анализов, если анализ будет длиться дольше, чем время между двумя нажатиями клавиш. Новая функция "async/await" на С# 5 должна помочь в этом. (Я могу рассказать вам по личному опыту: будьте осторожны с распространением заданий и токенов отмены. Если вы небрежны, можно попасть в состояние, в котором ожидаются десятки тысяч отмененных задач, и это не быстро. )
Теперь, когда у вас есть грамматический анализ, вам нужно построить семантический анализатор. Поскольку вы используете IntelliSense, вам не нужно быть особенно сложным семантическим анализатором. (Наш семантический анализатор должен провести анализ, подходящий для генерации кода из правильных программ и корректного анализа ошибок из неправильных программ.) Но, разумеется, снова он должен сделать хороший семантический анализ на сломанных программах, что значительно увеличивает сложность.
Мой совет - начать с создания семантического анализатора "верхнего уровня", снова используя неизменяемую модель, которая может сохранять состояние типов с объявленным в исходном коде из edit для редактирования. Анализатор верхнего уровня имеет дело со всем, что не является выражением или выражением: объявления типов, директивы, пространства имен, объявления методов, конструкторы, деструкторы и т.д. Материал, который составляет "форму" программы, когда компилятор генерирует метаданные.
Metadata! Я забыл о метаданных. Вам понадобится считыватель метаданных. Очевидно, вы должны иметь возможность производить IntelliSense в выражениях, которые относятся к типам в библиотеках. Я рекомендую использовать библиотеки CCI в качестве считывателя метаданных, а не Reflection. Поскольку вы только делаете IntelliSense, вам явно не нужен писатель метаданных.
В любом случае, как только у вас есть семантический анализатор верхнего уровня, вы можете написать семантический анализатор выражения оператор-выражение, который анализирует типы выражений в заданном выражении. Обратите особое внимание на алгоритмы поиска имен и перегрузки. Вывод типа метода будет особенно сложным, особенно внутри запросов LINQ.
Как только у вас все получится, движок IntelliSense должен быть легким; просто выработайте тип выражения в текущей позиции курсора и соответствующим образом отобразите выпадающий список.
Насколько тяжело мне было бы создать свой собственный тот же стандарт?
Хорошо, у нас есть команда, назовите это десятью людьми, и это, вероятно, займет, назовите это пять лет вместе, чтобы все это было сделано от начала до конца. Но у нас есть гораздо больше дел, чем просто движок IntelliSense. Это может быть только 40% работы. О, и половина этих людей работает на VB, теперь, когда я думаю об этом. Но эти люди имеют в среднем, вероятно, пять или десять лет опыта в выполнении такого рода работ, поэтому они быстрее в этом, чем вы, если вы никогда этого не делали раньше.
Итак, скажем, вам понадобится от десяти до двадцати лет полной работы, работая в одиночку, чтобы создать механизм IntelliSense для уровня C Roslyn, который может делать приемлемый и близкий к правильному анализ больших программ за время между нажатиями клавиш.
Дольше, если вам нужно сделать это PhD первым, очевидно.
Или вы могли бы просто использовать Roslyn, так как это для. Это займет у вас, вероятно, несколько часов, но вы не получите удовольствие от этого. И это весело!
Вы можете скачать предварительный релиз здесь: