Visual Studio Служба пользовательских языков
Я пытаюсь внедрить языковую службу в VSPackage с использованием MPF, и она работает не совсем так, как я понимаю.
У меня уже есть несколько реализаций, таких как ParseSource
Разбор входного файла с ParseRequest
, Однако, когда он находит ошибку, он добавляет ее с AuthoringSink.AddError
, Документация для этого подразумевает, что он добавляет его в список ошибок для меня; это не так.
У меня тоже есть простой MySource
класс, подкласс Source
, Я возвращаю этот новый класс с переопределенным LanguageService.CreateSource
метод. Документация для OnCommand
говорит, что он запускается "при вводе команды". Однако это не так.
Очевидно, есть какой-то промежуточный шаг, который я не сделал правильно. Я уже достаточно разболтал, поэтому буду рад предоставить дополнительную информацию по запросу.
Любое разъяснение высоко ценится.
2 ответа
Для вопроса списка ошибок AuthoringSink я использую это поведение в моей языковой службе. В ParseSource класс ParseRequest имеет AuthoringSink. Вы также можете создать новый ErrorListProvider, если хотите работать вне поведения синтаксического анализатора. Вот пример кода:
error_list = new ErrorListProvider(this.Site);
error_list.ProviderName = "MyLanguageService Errors";
error_list.ProviderGuid = new Guid(this.errorlistGUIDstring.);
}
ErrorTask task = new ErrorTask();
task.Document = filename;
task.CanDelete = true;
task.Category = TaskCategory.CodeSense;
task.Column = column;
task.Line = line;
task.Text = message;
task.ErrorCategory = TaskErrorCategory.Error;
task.Navigate += NavigateToParseError;
error_list.Tasks.Add(task);
Я надеюсь, что это было полезно.
OnCommand должен запускаться каждый раз, когда появляется команда, в вашем классе MySource вы можете сделать что-то вроде этого (извлечено из рабочего кода):
public override void OnCommand(IVsTextView textView, VsCommands2K command, char ch)
{
if (textView == null || this.LanguageService == null
|| !this.LanguageService.Preferences.EnableCodeSense)
return;
if (command == Microsoft.VisualStudio.VSConstants.VSStd2KCmdID.TYPECHAR)
{
if (char.IsLetterOrDigit(ch))
{
//do something cool
}
}
base.OnCommand(textView, command, ch);
}
Если это не сработает, дважды проверьте, что CodeSense = true в атрибуте ProvideLanguageService при настройке пакета LanguageService. Многое из того, что здорово делать в LanguageService, требует правильного включения этих атрибутов. Некоторые даже дают классное поведение бесплатно!
Еще одна вещь, о которой нужно быть осторожным, это то, что некоторые виды поведения, такие как colorizer, не работают правильно в моем улье в моем опыте. Я не думаю, что это доставило мне неприятности, но я реализовал их пару лет назад, так что я в основном просто оглядываюсь на старый код.
AuthoringSink.AddError
только добавляет ошибки в список ошибок, если ParseRequest.Reason
является ParseReason.Check
, Когда ваш ParseSource
функция пытается добавить ошибки при разборе любого другого ParseReason
, ничего не случится.
Возможно, ваша языковая служба никогда не звонит ParseSource
с этим ParseReason
, Насколько я знаю, единственный способ получить ParseReason
из Check
(вне ручного вызова BeginParse
или же ParseSource
себя), чтобы предложить свой сервис с таймером простоя.