2012-02-27 3 views
2

Я работаю над языковой службой и хочу, чтобы синтаксический анализ после того, как пользователь набирал код, был быстрее.Языковая служба: есть ли способ заставить парсинг?

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

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

+0

Я просто заметил, что класс LanguageService имеет метод CreateParseRequest. Поэтому я попытался вызвать его из OnCaretMoved с ParseReason.Check, но он не вызывает мой метод ParseSource ... Так что запутался. –

ответ

0

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

Мне было бы интересно узнать, есть ли у вас лучший способ сделать это.

0

Вы можете позвонить по телефону BeginParse() в свою реализацию Source. Это создает ParseRequest с аргументом разбора Check. Я отключил таймер OnIdle в своем языковом сервисе и протестировал его, и он, похоже, работает.

Если ваш код, который обнаруживает нажатия клавиш, имеет доступ к экземпляру вашей реализации LanguageService, то вы можете использовать service.GetSource(...).BeginParse(). Если он имеет доступ к самому Source, то это еще проще.