Служба пользовательского языка Visual Studio

Я пытаюсь реализовать языковую службу в пакете VSPackage с помощью MPF, но она работает не совсем так, как я понимаю.

У меня уже есть несколько реализаций, таких как ParseSource разбор входного файла с помощью ParseRequest. Однако, когда он находит ошибку, он добавляет ее с AuthoringSink.AddError. Документация для этого подразумевает, что он добавляет его в список ошибок для меня; это не так.

У меня также есть простой класс MySource, подкласс Source. Я возвращаю этот новый класс с переопределенным методом LanguageService.CreateSource. В документации для OnCommand говорится, что он запускается «при вводе команды». Однако это не так.

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

Любое разъяснение очень ценится.


person Fraser Cormack    schedule 25.07.2012    source источник
comment
Обратите внимание, что для расширений, предназначенных для Visual Studio 2010 и более поздних версий, языковые службы MPF устарели. Если возможно, вам следует рассмотреть возможность использования новых интерфейсов MEF (если, конечно, вам не нужно ориентироваться на Visual Studio 2008 или более раннюю версию).   -  person Sam Harwell    schedule 26.03.2014


Ответы (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, требует, чтобы эти атрибуты были правильно включены. Некоторые даже дают крутые модели поведения бесплатно!

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

person ColinCren    schedule 30.08.2012

AuthoringSink.AddError добавляет ошибки в список ошибок, только если ParseRequest.Reason равно ParseReason.Check. Когда ваша функция ParseSource попытается добавить ошибки при анализе любых других ParseReason, ничего не произойдет.

Возможно, ваша языковая служба никогда не звонит ParseSource с этим ParseReason. Насколько мне известно, единственный способ получить ParseReason из Check (кроме ручного вызова BeginParse или ParseSource самостоятельно) заключается в том, чтобы предлагать свои услуги с таймером простоя .

person Jon Senchyna    schedule 27.02.2014