Подтвердить что ты не робот

Новая и полная реализация общих Intellisense

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

Несколько примеров кода:

Однако я нашел отличный пример редактора SQL с Intellisense QueryCommander SQL Editor от Mikael Håkansson, который, кажется, работает хорошо. Microsoft должна использовать XML-команду с ключевыми словами команд, но мой вопрос: как (в деталях) реализовать Microsoft свой Intellisense (как Intellisense для вашего типа) и насколько мне было бы сложно создать свой собственный стандарт?


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


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


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

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

  • ScriptCS ScriptCS упрощает запись и выполнение С# с помощью простого текстового редактора.

4b9b3361

Ответ 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, так как это для. Это займет у вас, вероятно, несколько часов, но вы не получите удовольствие от этого. И это весело!

Вы можете скачать предварительный релиз здесь:

http://www.microsoft.com/download/en/details.aspx?id=27746

Ответ 2

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

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

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

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

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

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

Ответ 3

Связанный с этой темой: у меня файл vb содержит лиерал XML, который фактически является HTML. Я хочу иметь поддержку intellisense для gtml5, css и java-скриптов, написанных внутри литерала xml. 1. Есть ли способ расширить IntelliSNSE VB для поддержки этого? 2. В качестве альтернативы я хочу показать этот файл с двумя представлениями (с двумя вкладками внизу фрейма: vb и html). Могу ли я использовать VB или С# crate vs extension для этого? Предположим, что расширение файла vbxml.