Поддержка нового языка в Visual Studio + CodeSense
От: Albeoris  
Дата: 09.02.16 23:02
Оценка:
Доброго времени суток.

Есть такая штука, как LanguageService. Используется она для разбора, подсветки, навигации, рефакоринга и автодополнения синтаксического древа в файлах исходных текстов, о которых студия пока не знает.
https://msdn.microsoft.com/en-us/library/microsoft.visualstudio.package.languageservice.aspx

Возникла необходимость реализовать. Беглый поиск не дал результатов — мануалов практически нет, а если речь заходит о CodeSense, то вообще нет. Что странно.

В моём случае, это файлы UnrealScript (*.uc). В своё время в помощи по UDK вообще рекомендовалось выбрать для них в качестве редактора Visual C++ и не мучиться. Вариант, конечно, но не лучший. Нашёл и студию, построенную на Isolated Shell:
http://uside.codeplex.com/SourceControl/latest

Солюшен очень грязный. Часть лексем определены в ресурсных файлах, часть парсится из внешних, парсеры и лексеры генерируются по простыне жутких регулярок. Немного подпилил, завёл, но расширять и поддерживать это...

Так вот, в случае изобретения собственного велосипеда, подскажите — куда копать?
Есть, к примеру, очень приятный с виду пакет https://irony.codeplex.com/
По части простенького разбора на ключевые слова, комментарии весьма удобен. И вроде бы даже какая-то объектная модель у него есть, но как её реализовывать, опять же не ясно.

Если у вас был опыт использования каких-нибудь фреймворков или реализации в лоб LanguageService с поддержкой CodeSense (обязательно), поделитесь, пожалуйста.
"Хаос всегда побеждает порядок, поскольку лучше организован." (с) Терри Пратчетт
languageservice language visual studio extension
Re: Поддержка нового языка в Visual Studio + CodeSense
От: Kolesiki  
Дата: 10.02.16 00:07
Оценка:
Здравствуйте, Albeoris, Вы писали:

A> а если речь заходит о CodeSense, то вообще нет. Что странно.


В контексте студии это называется IntelliSense.

A>Есть, к примеру, очень приятный с виду пакет https://irony.codeplex.com/

A>По части простенького разбора на ключевые слова, комментарии весьма удобен. И вроде бы даже какая-то объектная модель у него есть, но как её реализовывать, опять же не ясно.

Если с irony не ясно, может вы вообще взялись за слишком тяжёлую тему? Такие вещи "побырому на регэкспах" не делаются — это целая теория.

Я бы вообще не касался студии, потому что это bloatware. Возьмите любой парсер, который осилите (лучше PEG) и прикрутите его к любому редактору (напр. FastColoredTextBox).
Re: Поддержка нового языка в Visual Studio + CodeSense
От: hi_octane Беларусь  
Дата: 10.02.16 06:15
Оценка: 1 (1) +2
A>Если у вас был опыт использования каких-нибудь фреймворков или реализации в лоб LanguageService с поддержкой CodeSense (обязательно), поделитесь, пожалуйста.

Статьи и примеры по Nitra
Автор: VladD2
Дата: 02.12.15
уже смотрел? Вроде как задача ровно ложится на их фреймворк для создания ЯП с плюшками вроде IntelliSense, рефакторинга и т.п.
Nemerle — power of metaprogramming, functional, object-oriented and imperative features in a statically-typed .NET language
Re: Поддержка нового языка в Visual Studio + CodeSense
От: Михаил Романов Удмуртия https://mihailromanov.wordpress.com/
Дата: 10.02.16 07:12
Оценка: 102 (5) +3
Здравствуйте, Albeoris, Вы писали:

A>Если у вас был опыт использования каких-нибудь фреймворков или реализации в лоб LanguageService с поддержкой CodeSense (обязательно), поделитесь, пожалуйста.

К сожалению, полноценного опыта разработки Language Service у меня нет, но в свое время вопросом интересовался поэтому, возможно немного смогу помочь.

A>Возникла необходимость реализовать. Беглый поиск не дал результатов — мануалов практически нет, а если речь заходит о CodeSense, то вообще нет. Что странно.

Действительно, странно.
Достаточно подробное описание этого механизма можно найти в разделе Language Service, например, есть пошаговый пример создания простейшего языкового сервиса Walkthrough: Creating a Language Service
Конкретно по поводу реализации IntelliSense можно посмотреть примеры:

Вообще, в 2-х словах. Если вы будете реализовывать под VS 2013 или VS 2015 вам есть смысл не реализовывать все интерфейсы с 0, а взять за основу Managed Package Framework (если не ошибаюсь, то с VS 2012 он входит в VS 2012 SDK). Конкретно для реализации Language Service, вам потребуется:
1. Реализовать наследника от LanguageService, который возвращает IScanner
(это токенайзер, который используется в основном для раскраски кода) и наследника от AuthoringScope в котором уже делается основная работа, в частности формируются списки для code completion.
2. Разметить ваш наследник атрибутом регистрации ProvideLanguageService, а в нем указать какой функционал вы реализуете (например CodeSense = true для IntelliSense).
3. Реализовать свой лексер и парсер. Тут уже зависит от вашего языка. Раньше с SDK шла своя реализация Lex/Yacc, но сейчас, имхо в этом нет никакого смысла, всё равно к моменту, когда вы доберетесь до интеграции с VS у вас уже будут готовые лексер и парсер с уверенностью 95%.
4. Реализовать IScanner, который будет возвращать набор токенов (с указанием типов: ключевое слово, константа, строка, ...)
5. Реализовать AuthoringScope, который будет для конкретной позиции (и текущего состояния проекта) возвращать список code completion

Мне нужна была только раскраска исходного кода, поэтому дальше реализации IScaner я не пошел.
Вам, конечно нужно больше.


Но(!!!!)
Начиная с VS 2010 Language Service являются obsolete механизмом. А взамен них рекомендуется использовать расширения к редактору
Соответсвующий раздел SDK — Extending the Editor.

Честно скажу, я так и не смог разобраться с этим новым механизмом, поэтому ничего толком рассказать не смогу. Надеюсь, что имеющиеся примеры Walkthrough: Highlighting Text и Walkthrough: Displaying Statement Completion, чем-то вам помогут.
Отредактировано 10.02.2016 7:17 Михаил Романов . Предыдущая версия .
Re: Поддержка нового языка в Visual Studio + CodeSense
От: Sinix  
Дата: 10.02.16 07:47
Оценка: 2 (1)
Здравствуйте, Albeoris, Вы писали:

A>Возникла необходимость реализовать. Беглый поиск не дал результатов — мануалов практически нет, а если речь заходит о CodeSense, то вообще нет. Что странно.


Потому что работы дофигищща.

Если нужна только подсветка, то VS Code + VS 2015upd1 понимают TextMate colorizers.

также см
https://channel9.msdn.com/Blogs/VSIPMarketing/VSX212-Adding-a-Language-Service-into-Visual-Studio-2010
https://code.msdn.microsoft.com/IPyIntegration
http://solutions.devx.com/ms/msdn/extending-visual-studio-2010-to-support-additional-programming-languages.html
http://vslua.codeplex.com/ (на irony)
Re[2]: Поддержка нового языка в Visual Studio + CodeSense
От: Albeoris  
Дата: 10.02.16 10:30
Оценка:
K>Если с irony не ясно, может вы вообще взялись за слишком тяжёлую тему? Такие вещи "побырому на регэкспах" не делаются — это целая теория.
Провидческие навыки последнее время барахлят. Пока единственная сложность — интеграция с API студии и правильное, лаконичное описание.

K>Я бы вообще не касался студии, потому что это bloatware. Возьмите любой парсер, который осилите (лучше PEG) и прикрутите его к любому редактору (напр. FastColoredTextBox).

Вариант не рассматривается. В противном случае я бы пользовался Notepad++ и не мучился.
"Хаос всегда побеждает порядок, поскольку лучше организован." (с) Терри Пратчетт
Re[2]: Поддержка нового языка в Visual Studio + CodeSense
От: Albeoris  
Дата: 10.02.16 10:30
Оценка:
Здравствуйте, hi_octane, Вы писали:

_>Статьи и примеры по Nitra
Автор: VladD2
Дата: 02.12.15
уже смотрел? Вроде как задача ровно ложится на их фреймворк для создания ЯП с плюшками вроде IntelliSense, рефакторинга и т.п.

Нет, благодарю. Почитаю. (:
"Хаос всегда побеждает порядок, поскольку лучше организован." (с) Терри Пратчетт
Re[2]: Поддержка нового языка в Visual Studio + CodeSense
От: Albeoris  
Дата: 10.02.16 10:33
Оценка:
Здравствуйте, Михаил Романов, Вы писали:

МР>Но(!!!!)

МР>Начиная с VS 2010 Language Service являются obsolete механизмом. А взамен них рекомендуется использовать расширения к редактору
МР>Соответсвующий раздел SDK — Extending the Editor.

МР>Честно скажу, я так и не смог разобраться с этим новым механизмом, поэтому ничего толком рассказать не смогу. Надеюсь, что имеющиеся примеры Walkthrough: Highlighting Text и Walkthrough: Displaying Statement Completion, чем-то вам помогут.


Большое спасибо за развёрнутый ответ. Вот чего-то подобного я и ожидал. Буду разбираться. (=
"Хаос всегда побеждает порядок, поскольку лучше организован." (с) Терри Пратчетт
Re[2]: Поддержка нового языка в Visual Studio + CodeSense
От: Albeoris  
Дата: 10.02.16 10:35
Оценка:
Здравствуйте, Sinix, Вы писали:
S>Если нужна только подсветка, то VS Code + VS 2015upd1 понимают TextMate colorizers.
Ну нет же. Нужна полноценная поддержка IntelliSense.
Честно говоря, не вижу дофигища работы. В наколеночном варианте завёл за один вечер. Теперь вот пытаюсь понять, как это сделать правильно и красиво. В соседней ветке вот уже выяснили, что LanguageService — это устаревший механизм. Значит, нужно искать туториалы по реализации нового.
"Хаос всегда побеждает порядок, поскольку лучше организован." (с) Терри Пратчетт
Re[3]: Поддержка нового языка в Visual Studio + CodeSense
От: Sinix  
Дата: 10.02.16 12:21
Оценка: +1
Здравствуйте, Albeoris, Вы писали:

A>Честно говоря, не вижу дофигища работы. В наколеночном варианте завёл за один вечер. Теперь вот пытаюсь понять, как это сделать правильно и красиво. В соседней ветке вот уже выяснили, что LanguageService — это устаревший механизм. Значит, нужно искать туториалы по реализации нового.


На туториалы / готовые реализации ссылки поскидывал выше.
Ну да, всё относительно просто, если нужно самое простое автодополнение/диагностику и есть готовый примитивный парсер/токенайзер и он достаточно быстр, чтобы выдавать результат в реалтайме.

А вот если захочется автодополнение с учетом семантики, да ещё внутри файлов с ошибками, выравнивание/отступы, рефакторинг и тыды вплоть до отладки — вот тогда придётся возиться от и до.
Re[4]: Поддержка нового языка в Visual Studio + CodeSense
От: Albeoris  
Дата: 10.02.16 14:52
Оценка: +1
Здравствуйте, Sinix, Вы писали:
S>А вот если захочется автодополнение с учетом семантики, да ещё внутри файлов с ошибками, выравнивание/отступы, рефакторинг и тыды вплоть до отладки — вот тогда придётся возиться от и до.

Да, это всё поятно. Инкрементальный парсер с поддержкой незавершённых конструкций — это действительно непросто. Но сейчас мне важно очень аккуратно и красиво реализовать основу, которую затем можно будет дополнять конкретными улучшениями, не переписывая каждый раз заново. Или найти фреймворк, который делает это за меня, а на вход принимает коротенькое описание семантики.

А за ссылки спасибо. Изучаю. (=
"Хаос всегда побеждает порядок, поскольку лучше организован." (с) Терри Пратчетт
Re: Поддержка нового языка в Visual Studio + CodeSense
От: VladD2 Российская Империя www.nemerle.org
Дата: 23.02.16 02:39
Оценка: 69 (2)
Здравствуйте, Albeoris, Вы писали:

A>Есть такая штука, как LanguageService.


Хочу сразу обрадовать — он устарел.
Причем, некоторые вещи что через него делались так и не реализован в новых интерфесах, так что сам МС по прежнему клепает LanguageService-ы, но всем советует использовать новые API. Видимо это потому, что большинство использует их для мелких расширений студий (для чего они отлично подходят).

A>Возникла необходимость реализовать.


Хочу расстроить тебя. Разработка интеграции со студией даже для простенького языка — это задача на годы. Причем в ней есть несколько составляющих усложняющие ее:
1. Тебе понадобятся теоретические и практические знания по парсингу и типизации (семантическому анализу).
2. Знание API студии Студии (а оно объемно).
3. Часть студии по прежнему основана на кривых и сложных во взаимодействии основанных на COM API.
4. Интеграция должна работать очень быстро, чтобы пользователь на тормоза не матерился при редактировании текста. Это вызывает необходимость делать многие вещи инкрементальными и сильно все оптимизировать. Компилятор может протупить 5 минут при компиляции проекта, но если программист будет ждать хотя бы 10 секунд после нажатия клавиш, то ты не станешь пользоваться такой IDE.

По сему лучше просто бросить эту затею ограничившись простенькой подсветкой кода.

Другой вариант взять language workbench вроде нашей Nitra
Автор: VladD2
Дата: 18.12.15
. Интеграция у нас правда пока разобранная (прошлая версия была основана на ReHarper-плагине, но этот подход создает некоторые проблемы, так что мы сейчас делаем родную поддержку для VS).

Еще есть такие language workbench-и как Spoofax, XText и т.п., но они в основном заточены на Java и Eclipse/IDEA.

A>Беглый поиск не дал результатов — мануалов практически нет, а если речь заходит о CodeSense, то вообще нет. Что странно.


Ну, что такое CodeSense я и сам не знаю. Видимо это чей-то трейдмарк, аналог IntelliSence от MS.

A>В моём случае, это файлы UnrealScript (*.uc).


Язык простенький. За пару лет поднять можно и вручную.

A>Если у вас был опыт использования каких-нибудь фреймворков или реализации в лоб LanguageService с поддержкой CodeSense (обязательно), поделитесь, пожалуйста.


Был. Писал IDE для Nemerle. Но Nemerle это один из самых сложных в реализации современных языков, так как кроме кучи современных фич поддерживает еще мощную макросистему позволяющую генерировать код во время компиляции и менять синтаксис языка.

Вот для второй версии самого языка и для создания его IDE мы и задумали Nitra
Автор: VladD2
Дата: 09.12.15
.

Поднять язык на ней в десятки раз проще и быстрее. Простенький язык (Mini-C) vaskir осилил за две недели включая генерацию MSIL. При это он не имел опыта использования Нитры, да и в разработке компиляторов и IDE профи не являлся.

UnrealScript раза в три по сложнее. Но все же язык простенький. Так что где-то за пару месяцев ты его на Нитре скорее всего осилишь. К тому времени мы выкатим на гора интеграцию со студией не основанную на ReSharper.

Я буду помогать советами.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Поддержка нового языка в Visual Studio + CodeSense
От: VladD2 Российская Империя www.nemerle.org
Дата: 23.02.16 02:53
Оценка:
Здравствуйте, Михаил Романов, Вы писали:

МР>Достаточно подробное описание этого механизма можно найти в разделе Language Service, ...

МР>Конкретно по поводу реализации IntelliSense можно посмотреть примеры:
МР>*IntelliSense Parameter Info
МР>*IntelliSense Quick Info
МР>*IntelliSense Member Completion
МР>*IntelliSense Complete Word

Хочу расстроить немного. Вот этот список и MPF как раз основан на том самом устаревшем Language Service, а точнее на ком-интерфейсах.

Новый API основан на MEF-е. Для него тоже есть пошаговочки, но искать их трудно. Например, вот пошаговочка для реализации Complete Word:
https://msdn.microsoft.com/ru-ru/library/ee372314.aspx

Остальные пошаговочки видны слева по ссылке.

Проблема только в том, что чтобы реализовать их нужно иметь движок для языка, который будет предоставлять данные, а его создание это отдельная и сложная задача.

Плсю новый API не все покрывает. Например, поддержки проекта он не предоставляет. Да и поддержка эта в студии реализована через старый COM-овский API, так что для, например, 2013 (а ди 2015) студии его и нельзя реализовать в чистом менеджед-коде. Так что нужно или использовать MPF для поддержки проектов, или ждать следующей версии студии, где поддержка проектов должна стать менеджед, или разбираться в COM API смостоятельно, или делать плагин к ReSharper-у, который скрывает COM API за своим, управляемым.

Но проще реализовать вес язык на Nitra
Автор: VladD2
Дата: 18.12.15
и получить поддержку IDE автоматом.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Поддержка нового языка в Visual Studio + CodeSense
От: VladD2 Российская Империя www.nemerle.org
Дата: 23.02.16 03:01
Оценка:
Здравствуйте, Albeoris, Вы писали:

A>Да, это всё поятно. Инкрементальный парсер с поддержкой незавершённых конструкций — это действительно непросто. Но сейчас мне важно очень аккуратно и красиво реализовать основу, которую затем можно будет дополнять конкретными улучшениями, не переписывая каждый раз заново.


Черт, как всегда, в деталях. Сделать поделки похожую на настоящую не сложно. А вот сделать все качественно и так чтобы это потом можно было развивать — не просто.

У тебя уже есть сам движок типизации, который умеет собирать семантику и т.п.? Если нет, то это много работы даже без оптимизаций.

A>Или найти фреймворк, который делает это за меня, а на вход принимает коротенькое описание семантики.


Вот это и есть Nitra на которую ты уже сказал "Нет, благодарю. Почитаю. (:" в соседнем сообщении.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Поддержка нового языка в Visual Studio + CodeSense
От: Win32nipuh  
Дата: 23.02.16 07:32
Оценка:
Здравствуйте, Albeoris, Вы писали:

A>Доброго времени суток.


A>Есть такая штука, как LanguageService. Используется она для разбора, подсветки, навигации, рефакоринга и автодополнения синтаксического древа в файлах исходных текстов, о которых студия пока не знает.

A>https://msdn.microsoft.com/en-us/library/microsoft.visualstudio.package.languageservice.aspx

A>Возникла необходимость реализовать. Беглый поиск не дал результатов — мануалов практически нет, а если речь заходит о CodeSense, то вообще нет. Что странно.


A>В моём случае, это файлы UnrealScript (*.uc). В своё время в помощи по UDK вообще рекомендовалось выбрать для них в качестве редактора Visual C++ и не мучиться. Вариант, конечно, но не лучший. Нашёл и студию, построенную на Isolated Shell:

A>http://uside.codeplex.com/SourceControl/latest

A>Солюшен очень грязный. Часть лексем определены в ресурсных файлах, часть парсится из внешних, парсеры и лексеры генерируются по простыне жутких регулярок. Немного подпилил, завёл, но расширять и поддерживать это...


A>Так вот, в случае изобретения собственного велосипеда, подскажите — куда копать?

A>Есть, к примеру, очень приятный с виду пакет https://irony.codeplex.com/
A>По части простенького разбора на ключевые слова, комментарии весьма удобен. И вроде бы даже какая-то объектная модель у него есть, но как её реализовывать, опять же не ясно.

A>Если у вас был опыт использования каких-нибудь фреймворков или реализации в лоб LanguageService с поддержкой CodeSense (обязательно), поделитесь, пожалуйста.


В случае с Irony вы делаете парсер и свой интерпретатор
Re[2]: Поддержка нового языка в Visual Studio + CodeSense
От: Albeoris  
Дата: 23.02.16 09:13
Оценка:
Здравствуйте, VladD2,

Спасибо за развёрнутый ответ!
Нитру уже осваиваю.
"Хаос всегда побеждает порядок, поскольку лучше организован." (с) Терри Пратчетт
Отредактировано 23.02.2016 9:25 Albeoris . Предыдущая версия .
Re[2]: Поддержка нового языка в Visual Studio + CodeSense
От: Albeoris  
Дата: 23.02.16 09:14
Оценка:
Здравствуйте, Win32nipuh, Вы писали:

W>В случае с Irony вы делаете парсер и свой интерпретатор


1. Рисуем кружок.
2. Рисуем кошку.
3. Готово!
"Хаос всегда побеждает порядок, поскольку лучше организован." (с) Терри Пратчетт
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.