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 себя), чтобы предложить свой сервис с таймером простоя.

Другие вопросы по тегам