Вопрос

В Интернете я нашел два способа предоставления языковых услуг.

Первый способ предполагает использование IOleComponentManager и регистрацию таймера для вызова моей службы во время простоя.

Второй способ включает в себя представление моей службы как IServiceContainer и добавление ServiceCreatorCallback «предлагать услуги по требованию».

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

Кроме того, когда мой LanguageService находит ошибки в файле, он использует ParseRequest.Sink.AddError() для добавления ошибок в список ошибок.При предложении «По требованию» эти ошибки не отображаются в графическом интерфейсе, хотя я вижу, что они добавляются при отладке кода.

Я знаю, что моя языковая служба регистрируется, поскольку подсветка синтаксиса, «Перейти к определению» и «Найти все ссылки» по-прежнему работают.

Вот код, который я использую, чтобы «предлагать свои услуги по требованию»:

IServiceContainer serviceContainer = this as IServiceContainer;
ServiceCreatorCallback callback = new ServiceCreatorCallback(CreateLanguageService);
serviceContainer.AddService(typeof(MyLanguageService), callback, true);

Может ли кто-нибудь сказать мне, почему некоторые функции моего LanguageService не работает при предложении по требованию?Я что-то упускаю, или этот способ просто не предназначен для полнофункциональной языковой службы?

Это было полезно?

Решение

Похоже, по крайней мере недостающая функциональность требует использования IOleComponentManager метод, который регистрирует таймер для вызова языковой службы во время периоды простоя.

С использованием dotPeek, Я нашел это OnSynchronizeDropdowns() звонят из OnCaretMoved() для синхронизации выбранного элемента при нажатии в редакторе. OnCaretMoved() сам по себе, похоже, вызывается только из LanguageService.OnIdle() метод, который, как я считаю, требует использования таймера простоя.

Покопавшись еще немного, я также обнаружил, что список ошибок требует, чтобы ParseRequest.Reason быть настроен на ParseReason.Check, в противном случае он игнорирует вызов.Еще немного покопавшись в коде, я обнаружил, что единственное место, где используется причина синтаксического анализа, - это Source.OnIdle().

Обновлять: Я считаю, что подтвердил, что для этих двух функций необходима регистрация таймера простоя.Из MSDN на LanguageService.OnIdle:

ПримечаниеЭтот метод не вызывается, если вы не настраиваете свой собственный таймер и не вызовите этот метод из обработчика таймера.

Базовый метод вызывает OnCaretMoved Если каретка переехала с прошлого раза В режиме ожидания назывался.Базовый метод затем вызывает метод Onidle на Источник объект для текущего представления.Если текущий ИсточникОбъект не может быть получен, базовый метод вообще ничего не делает, в том числе не вызовет OnCaretMoved.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top