Информация об изменениях

Сообщение Re: Поддержка нового языка в Visual Studio + CodeSense от 10.02.2016 7:12

Изменено 10.02.2016 7:17 Михаил Романов

Здравствуйте, Albeoris, Вы писали:

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

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

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

Действительно, странно.
Достаточно подробное описание этого механизма можно найти в разделе [https://msdn.microsoft.com/en-us/library/bb165099.aspx]Language Service[/url], например, есть пошаговый пример создания простейшего языкового сервиса 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, чем-то вам помогут.
Re: Поддержка нового языка в Visual Studio + CodeSense
Здравствуйте, 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, чем-то вам помогут.