Новая и полная реализация общего IntelliSense - PullRequest
61 голосов
/ 04 марта 2012

Я заинтересован в написании универсального редактора с поддержкой Intellisense для SQL и C # (и др., Если возможно!).Я хотел бы сделать это в C # как переопределенный или расширенный элемент управления типа richTextBox WPF.Я знаю, что есть много примеров проектов, и я реализовал basic собственную версию;но большинство примеров, с которыми я сталкивался (и, собственно, мой), это просто basic .

Вот пара примеров кода:

  1. DIY Intellisense By Byananterchris

  2. CodeTextBox - еще один элемент управления RichTextBox с подсветкой синтаксиса и Intellisense.Håkansson , который, кажется, работает хорошо.Microsoft должна использовать библиотеку командных ключевых слов в формате XML, но у меня такой вопрос: как (подробно) Microsoft реализует их Intellisense (Intellisense по типу вашего) и насколько трудно было бы мне создать свой собственный стандарт?


    Редактировать A: Прошел год, и мне удалось разработать свой собственный редакторский контроль с базовым интеллектуальным смыслом, главным образом для моего собственного "удовольствия".Я подумал, что вернусь и предоставлю список свободно доступных проектов .NET, которые помогли мне в моей собственной разработке и могут быть использованы "из коробки" и бесплатно:

    1. ICSharpCode (WinForms)

    2. AvalonEdit (WPF)

    3. ScintillaNET (WinForms)

    4. Query Commander [на примере реализации intellisense] (WinForms)


    Edit B: через 15 месяцев после того, как был задан вопрос, я все еще ищу новые улучшенные редакторы.Это хорошо ...

    1. RoslynPAD это круто!

    Отредактируйте C: 2 года и более от вопроса. Я нашел следующие проекты, использующие WPF и поддерживаемые AvalonEdit.

    1. CodeCompletion для AvalonEdit с использованиемNRefactory.Этот проект действительно хорош и имеет полную реализацию intellisense с использованием NRefactory.

    2. ScriptCS ScriptCS позволяет легко писать и выполнять C # с помощью простого текстового редактора.

Ответы [ 2 ]

122 голосов
/ 04 марта 2012

Как (подробно) 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

16 голосов
/ 05 марта 2012

Это та область, где Microsoft обычно дает отличные результаты - инструменты разработчика Microsoft действительно потрясающие. И есть очевидное коммерческое преимущество для продаж их инструментов для разработчиков и для продаж Windows с лучшим интеллектуальным смыслом, поэтому имеет смысл для Microsoft выделять те ресурсы, которые Эрик описывает в своем удивительно подробном ответе. Тем не менее, я думаю, что стоит отметить несколько вещей:

  1. Вашим клиентам могут фактически не понадобиться все функции, которые предоставляет реализация Microsoft. Решение Microsoft может быть невероятно перегружено с точки зрения функций, которые вы должны предоставить вашим клиентам / пользователям. Если вы на самом деле не реализуете универсальную среду кодирования, которая предназначена для конкуренции с Visual Studio, вполне вероятно, что есть некоторые аспекты вашего предполагаемого использования, которые либо упрощают проблему, либо позволяют идти на компромиссы в решении, которое, по мнению Microsoft, они не могут сделать. Microsoft, скорее всего, будет тратить ресурсы на уменьшение времени отклика, которое уже измеряется сотнями миллисекунд. Это может быть не то, что вам нужно делать. Microsoft тратит время на предоставление API-интерфейса, который другие могут использовать для анализа кода. Это, вероятно, не является частью вашего плана. Расставьте приоритеты для своих функций и решите, как выглядит «достаточно хорошо» для вас и ваших клиентов, а затем оцените стоимость их реализации.

  2. Помимо покрытия очевидных затрат на реализацию требований, которых у вас может и не быть, Microsoft также несет некоторые расходы, которые могут быть неочевидными, если вы не работали в команде. С командами связаны огромные расходы на связь. На самом деле невероятно легко, чтобы пять умных людей заняли больше времени, чтобы найти решение, чем один умный человек, чтобы найти эквивалентное решение. Существуют аспекты практики найма и организационной структуры Microsoft, которые делают этот сценарий более вероятным. Если вы нанимаете группу умных людей с эго, а затем даете им всем возможность принимать решения, вы также можете получить 5% лучшее решение за 500% стоимости. Это лучшее решение на 5% может быть выгодным для Microsoft, но оно может быть смертельно опасным для небольшой компании.

  3. Переход от решения на 1 человека к решению на 5 человек увеличивает затраты, но это только затраты на внутригрупповую разработку. Microsoft имеет отдельных команд, которые занимаются (примерно) проектированием, разработкой и тестированием даже для одной функции. Связанное с проектом общение между коллегами через эти границы имеет большее трение, чем внутри каждой из дисциплин. Это не только увеличивает расходы на связь между людьми, но также приводит к увеличению размера команды. И более того - поскольку это не одна команда из 12 человек, а 3 команды из 5 человек, в 3 раза выше стоимость связи. Дополнительные расходы, которые Microsoft решила нести, не могут привести к аналогичным затратам для других компаний.

Я не хочу описывать Microsoft как неэффективную компанию. Моя точка зрения заключается в том, что Microsoft принимает массу решений по всем вопросам: от найма, организации команды до разработки и внедрения, которые начинаются с предположений о прибыльности и риске, которые просто не относятся к компаниям, не являющимся Microsoft.

С точки зрения интеллигентности, существуют разные способы мышления о проблеме. Microsoft выпускает очень универсальное, многократно используемое решение, которое не только решает проблемы intellisense, но и предназначено для навигации по коду, рефакторинга и различных других целей анализа кода. Вам не нужно делать то же самое, если ваша единственная цель - сделать так, чтобы разработчики могли легко вводить код без необходимости набирать много текста. Нацеленность на эту функцию не требует многолетних усилий, и есть множество творческих вещей, которые вы можете сделать, если вы не просто предоставляете API, но фактически управляете пользовательским интерфейсом.

...