Новая и полная реализация универсального Intellisense
Я заинтересован в написании универсального редактора с поддержкой Intellisense для SQL и C# (и др. если это возможно!). Я хотел бы сделать это в C# как переопределенный или расширенный элемент управления типа WPF richTextBox. Я знаю, что есть много примеров проектов, доступных и я реализовал basic версия моей собственной; но большинство примеров, с которыми я столкнулся (и действительно мой собственный), именно таковы, basic.
несколько примеров кода:
однако я нашел отличный пример редактора SQL с Intellisense QueryCommander SQL Editor by Mikael Håkansson который, кажется, работает хорошо. Microsoft должна использовать XML-библиотеку ключевых слов команд, но мой вопрос: Как (подробно) Microsoft реализует свой Intellisense (как-вы-типа Intellisense) и насколько трудно было бы для меня создать свой собственный из того же стандарта?
Edit A: год спустя, и мне удалось разработать свой собственный редактор управления с базовым intellisense в основном для моего собственного "удовольствия". Я думал, что вернусь предоставить список свободно доступных проектов .NET, которые помогли мне с моей собственной разработкой и могут быть использованы из коробки и бесплатно обязанности:
Edit B: через 15 месяцев после того, как был задан вопрос, я все еще ищу новые улучшенные редколлегия. Это очень мило...
- RoslynPAD это круто!
Edit C: 2 years+ on из вопроса я нашел следующие проекты, как с использованием WPF, так и при поддержке AvalonEdit.
CodeCompletion для AvalonEdit С помощью NRefactory. Этот проект действительно хорош и имеет полную реализацию intellisense с использованием NRefactory.
ScriptCS ScriptCS позволяет легко писать и выполнять C# с помощью простого текстового редактора.
2 ответа:
Как (подробно) Microsoft реализует их как-вы-типа Intellisense?
Я можете опишите его до любой степени детализации, которую вы хотите назвать, но у меня нет времени для более чем краткого объяснения. Я объясню, как мы это делаем в Рослине.
во-первых, мы строим неизменяемую модель потока токенов, используя структуру данных, которая может эффективно представлять изменения, поскольку очевидно, что изменения-это именно то, что происходит много.
ключевым моментом, чтобы сделать его эффективным для постоянного использования является представление длины символов жетонов, но не их символ должности в буфере редактирования; помните, что токен в конце файла будет менять позицию при каждом редактировании, но длина токена не изменяется. вы должны любой ценой свести к минимуму количество полных повторных лексиконов, если вы хотите быть эффективными на чрезвычайно больших файлы.
Если у вас есть неизменяемая модель, которая может обрабатывать вставки и удаления для создания неизменяемого потока токенов без повторного лексирования всего файла каждый раз, вам нужно сделать то же самое вещь, но для грамматического анализа. на практике это значительно более сложная проблема. Я рекомендую вам получить степень бакалавра или магистра в области компьютерных наук с акцентом на теорию синтаксического анализа, если вы еще этого не сделали. Нами были получены помощь людей с докторами наук, которые сделали свои диссертации по теории парсеров, чтобы разработать этот конкретный бит алгоритма.
затем, очевидно, построить грамматический анализатор, который может анализировать C#. Помните, что он должен анализировать сломанные C#, а не правильно C#; IntelliSense должен работать, пока программа находится в состоянии без компиляции. Поэтому начните с внесения изменений в грамматику, которые имеют хорошие характеристики восстановления ошибок.
Итак, теперь у вас есть парсер, который может эффективно выполнять грамматический анализ без повторного лексирования или повторного анализа чего-либо, кроме редактируемой области, большую часть времени, что означает, что вы можете выполнять работу между нажатиями клавиш. Я забыл упомянуть, конечно, вам нужно будет придумать какой-то механизм не блокировать поток пользовательского интерфейса при выполнении всех этих анализов, если анализ займет больше времени, чем время между двумя нажатиями клавиш. Новая функция "async / await" C# 5 должна помочь в этом. (Я могу сказать вы из личного опыта: будьте осторожны с распространением заданий и отменой токенов. Если вы неосторожны, можно попасть в состояние, когда есть десятки тысяч отмененных задач, ожидающих решения, и это не быстро.)
теперь, когда у вас есть грамматический анализ нужно построить семантический анализатор. Поскольку вы делаете только IntelliSense, это не должен быть особенно сложный семантический анализатор. (Наша семантика анализатор должен выполнить анализ, подходящий для генерации кода из правильных программ и правильного анализа ошибок из неправильных программ.) Но, конечно, опять же, он должен делать хороший семантический анализ на сломанных программах, что значительно увеличивает сложность.
мой совет-начать с создания семантического анализатора "верхнего уровня", снова используя неизменяемую модель, которая может сохранять состояние объявленных в исходном коде типов от редактирования до редактирования. Анализатор верхнего уровня имеет дело с все, что есть не оператор или выражение: объявления типов, директивы, пространства имен, объявления методов, конструкторы, деструкторы и т. д. Материал, который составляет "форму" программы, когда компилятор генерирует метаданные.
метаданные! Я забыл про метаданные. Вам понадобится средство чтения метаданных. Очевидно, что вам нужно иметь возможность создавать IntelliSense для выражений, которые ссылаются на типы в библиотеках. Я рекомендую использовать библиотеки CCI в качестве метаданных читатель, а не отражение. Поскольку вы делаете только IntelliSense, очевидно, вам не нужен писатель метаданных.
имя подстановки и перегрузка разрешение алгоритмов. Вывод типа метода будет особенно сложным,особенно внутри LINQ-запросов.Как только вы все это получите, движок IntelliSense должен быть легким; просто определите тип выражения в текущей позиции курсора и отобразите раскрывающийся список соответствующим образом.
насколько трудно было бы мне создать свой собственный такой же стандарт?
Итак, предположим, что вам потребуется от десяти до двадцати лет полной работы, работая в одиночку, чтобы построить двигатель IntelliSense качества Roslyn для C#, который может делать приемлемо-близкий к правильному анализ больших программ во время между нажатиями клавиш.
дольше, если вам нужно сначала сделать это PhD, очевидно.
или, вы могли бы просто использовать Рослин, так как это то, что это для. Это займет у вас, вероятно, несколько часов, но вы не получите удовольствие от этого самостоятельно. И это весело!
вы можете скачать предварительный релиз здесь:
Это область, где Microsoft, как правило, дает отличные результаты - Microsoft developer tools действительно являются удивительными. И есть явное коммерческое преимущество для продаж своих инструментов разработчика и для продаж Windows, чтобы иметь лучший intellisense, поэтому Microsoft имеет смысл посвятить такие ресурсы, которые Эрик описывает в своем удивительно подробном ответе. Тем не менее, я думаю, что стоит отметить несколько вещей:
ваши клиенты могут на самом деле не нужно все функции, которые предоставляет реализация Microsoft. Решение Microsoft может быть невероятно перепроектировано с точки зрения функций, которые вы нужно предоставить код клиенты/пользователи. Если вы на самом деле не реализуете универсальную среду кодирования, которая должна быть конкурентоспособной с Visual Studio, вполне вероятно, что есть аспекты вашего предполагаемого использования, которые либо упрощают проблему, либо позволяют вам идти на компромиссы в решении, которое Microsoft считает, что они не могут сделать. Microsoft, скорее всего, потратит ресурсы на уменьшение времени отклика, которое уже измеряется сотнями миллисекунд. Это может быть не то, что вам нужно сделать. Microsoft тратит время на предоставление API для других пользователей для анализа кода. Скорее всего, это не входит в ваш план. Расставьте приоритеты своих функций и решите, что "достаточно хорошо" выглядит для вас и ваших клиентов, а затем оцените стоимость реализации этого.
В дополнение чтобы покрыть очевидные затраты на реализацию требований, которые на самом деле могут отсутствовать, Microsoft также несет некоторые затраты, которые могут быть не очевидны, если вы не работали в команде. Есть огромные затраты на связь, связанные с командами. На самом деле невероятно легко иметь пять умных людей, которым требуется больше времени, чтобы создать решение, чем требуется для одного умного человека, чтобы создать эквивалентное решение. Существуют аспекты практики найма и организационной структуры Microsoft, которые делают это сценарий более вероятен. Если вы наймете кучу умных людей с эго, а затем предоставите им возможность принимать решения, вы тоже можете получить 5% лучшее решение за 500% от стоимости. Это 5% лучшее решение может быть выгодным для Microsoft, но оно может быть смертельным для небольшой компании.
переход от решения для 1 человека к решению для 5 человек увеличивает затраты, но это только затраты на разработку внутри команды. Корпорация Microsoft отдельные команды, которые посвящены для (грубо) проектирования, разработки и тестирования даже для одной функции. Проектная коммуникация между сверстниками через эти границы имеет более высокие трения, чем внутри каждой из дисциплин. Это не только увеличивает затраты на общение между людьми, но и приводит к увеличению размеров команды. И более того-поскольку это не одна команда из 12 человек, а вместо этого 3 команды из 5 человек, есть 3x стоимость восходящей связи. Дополнительные расходы, которые выбрала Microsoft для выполнения этого не может привести к аналогичным затратам для других компаний.
Я не хочу описывать Microsoft как неэффективную компанию. Я хочу сказать, что Microsoft принимает массу решений обо всем, от найма, до организации команды, до проектирования и реализации, которые начинаются с предположений о прибыльности и риске, которые просто не применяются к компаниям, которые не являются Microsoft.
с точки зрения intellisense вещи, существуют различные способы мышления о проблеме. Microsoft создает очень универсальное, многоразовое решение, которое не только решает intellisense, но также нацелено на навигацию по коду, рефакторинг и различные другие виды использования для анализа кода. Вам не нужно делать то же самое, если ваша единственная цель-упростить для разработчиков ввод кода без необходимости вводить много. Таргетинг этой функции не требует многолетних усилий, и есть все виды творческих вещей, которые вы можете сделать, если вы не просто предоставляете API, но вы на самом деле контролировать пользовательский интерфейс тоже.