Как (подробно) Microsoft реализует свой Intellisense типа «как вы»?
I может описать его с любым уровнем детализации, который вы хотите назвать, но у меня нет времени для более краткого объяснения.Я объясню, как мы это делаем в Roslyn.
Во-первых, мы строим неизменную модель потока токенов, используя структуру данных, которая может эффективно представлять правки , поскольку очевидно, что правки - это именно то, чтоих будет много.
Ключевым моментом для повышения его эффективности для постоянного повторного использования является представление длины символов токенов, но не их позиций символов в буфере редактирования;помните, что токен в конце файла будет менять положение при каждом редактировании, но длина токена не меняется. Вы должны любой ценой минимизировать количество полных повторений, если хотите работать с очень большими файлами.
Как только у вас есть неизменяемая модель, которая может обрабатывать вставки и удаления для построениявверх по неизменяемому потоку токенов без повторного выделения всего файла каждый раз, вы должны сделать то же самое , но для грамматического анализа. На практике это гораздо более сложная проблема .Я рекомендую вам получить степень бакалавра или магистра в области компьютерных наук с акцентом на теорию синтаксического анализа, если вы этого еще не сделали.Мы получили помощь людей с докторскими степенями, которые сделали свои тезисы по теории парсеров, чтобы спроектировать этот конкретный фрагмент алгоритма.
Затем, очевидно, создайте грамматический анализатор, который может анализировать C #.Помните, он должен анализировать сломан C #, а не правильно C #;IntelliSense должен работать, пока программа находится в некомпилируемом состоянии.Итак, начните с внесения изменений в грамматику, которые имеют хорошие характеристики восстановления после ошибок.
ОК, теперь у вас есть синтаксический анализатор, который может эффективно выполнять грамматический анализ, не повторяя или не анализируя что-либо, кромередактируемый регион, чаще всего, что означает, что вы можете выполнять работу между нажатиями клавиш.Я забыл упомянуть, конечно, вам нужно будет придумать какой-нибудь механизм, чтобы не блокировать поток пользовательского интерфейса во время выполнения всех этих анализов, если анализ занимает больше времени, чем время между двумя нажатиями клавиш.В этом должна помочь новая функция «async / await» в C # 5.(Я могу сказать вам по личному опыту: будьте осторожны с распространением задач и токенов отмены. Если вы неосторожны, вы можете попасть в состояние, в котором ожидают десятки тысяч отмененных задач, а это не быстро .)
Теперь, когда у вас есть грамматический анализ, вам нужно создать семантический анализатор .Поскольку вы используете только IntelliSense, он не обязательно должен быть особенно сложным семантическим анализатором.(Наш семантический анализатор должен выполнить анализ, подходящий для генерации кода из правильных программ и правильного анализа ошибок из неправильных программ.) Но, конечно же, он снова должен выполнять хороший семантический анализ на сломанных программах, что значительно увеличивает сложность.
Мой совет - начать с создания семантического анализатора «верхнего уровня», снова используя неизменную модель, которая может сохранять состояние объявленных в исходном коде типов от редактирования до редактирования.Анализатор верхнего уровня работает со всем, что является , а не оператором или выражением: объявлениями типов, директивами, пространствами имен, объявлениями методов, конструкторами, деструкторами и так далее.Материал, который формирует «форму» программы, когда компилятор генерирует метаданные.
Метаданные!Я забыл о метаданных.Вам понадобится читатель метаданных.Вы должны иметь возможность создавать IntelliSense для выражений, которые ссылаются на типы в библиотеках, очевидно.Я рекомендую использовать библиотеки CCI для чтения метаданных, а не Reflection.Поскольку вы используете только IntelliSense, очевидно, что вам не нужно средство записи метаданных.
В любом случае, если у вас есть семантический анализатор верхнего уровня, вы можете написать семантический анализатор операторов и выражений, который анализирует типы выражений в данном операторе. Обратите особое внимание на алгоритмы поиска имени и разрешения перегрузки . Вывод типа метода будет особенно сложным, особенно внутри запросов LINQ .
Как только вы все это получите, движок IntelliSense должен быть легким; просто определите тип выражения в текущей позиции курсора и соответственно отобразите раскрывающийся список.
как трудно было бы мне создать свой же стандарт?
Ну, у нас есть команда из десяти человек, и, вероятно, потребуется пять лет, чтобы собрать все вместе от начала до конца. Но у нас есть гораздо больше, чем просто движок IntelliSense. Это может быть только 40% работы. О, и половина тех людей работают на VB, теперь, когда я думаю об этом. Но эти люди, в среднем, имеют опыт работы от пяти до десяти лет, поэтому они быстрее, чем вы, если бы вы никогда не делали этого раньше.
Итак, скажем, вам понадобится около десяти-двадцати лет работы на полную ставку, работая в одиночку, чтобы создать движок IntelliSense качества Roslyn для C #, который может выполнять приемлемо близкий к правильному анализ больших программ за это время. между нажатиями клавиш.
Дольше, если вам сначала понадобится докторская степень, очевидно.
Или вы могли бы просто использовать Roslyn, так как это то, что для . Это займет у вас, вероятно, несколько часов, но вам не доставляет удовольствия делать это самостоятельно. И это весело!
Вы можете скачать предварительный выпуск здесь:
http://www.microsoft.com/download/en/details.aspx?id=27746