Языковая служба: ParseReason.Check никогда не вызывается после перехода на VS2010 - PullRequest
0 голосов
/ 16 марта 2012

Я только что перенес свою языковую службу с VS2008 на VS2010.Все работает отлично, за исключением одной важной вещи: я больше не вызываю LanguageService.ParseSource для ParseReason.Check.Это действительно вызывает один раз после открытия файла.Но после редактирования кода он больше не вызывается.

Есть идеи, что может быть причиной этого?

Ответы [ 3 ]

0 голосов
/ 15 января 2013

Я не знаю, разобрались ли вы когда-нибудь со своим вопросом, но пытались ли вы убедиться, что ваш класс Source LastParseTime установлен в 0 при его создании? Кажется, я вспоминаю некоторые проблемы с проверкой, которая не происходит, если вы вручную не установили LastParseTime в 0 при создании объекта Source.

Подсказка: если вы используете .NET Reflector, вы можете разобрать все базовые классы для инфраструктуры LanguageService и получить довольно хорошее представление о том, как все это работает под капотом. Классы, которые вас заинтересуют, живут в Microsoft.VisualStudio.Package.LanguageService.10.0.dll, который должен быть установлен в GAC. Я обнаружил, что это невероятно полезно, когда я пытаюсь выяснить, почему что-то не работает в моей собственной языковой службе, и возможность просмотра исходного кода в отладчике уменьшает почти все трудности работы с этими платформами! 1003 *

0 голосов
/ 27 февраля 2014

Когда ваш Source объект инициализирован, он начинается с LastParseTime из Int32.MaxValue. Код, вызывающий срабатывание ParseRequest с ParseReason.Check, проверяет значение LastParseTime, чтобы узнать, меньше ли время с момента последнего изменения текста, чем время, необходимое для выполнения анализа (или настройки CodeSenseDelay в зависимости от того, что больше).

Код, который обрабатывает ответ от ParseSource, должен устанавливать LastParseTime, но, насколько я могу судить, он делает это, только если ParseReason равен Check.

Вы можете обойти эту проблему, установив Source.LastParseTime = 0 при инициализации Source. Это имеет побочный эффект установки CompletedFirstParse в true, даже если первый анализ еще не закончен.

Еще один способ решить эту проблему - переопределить Source.OnIdle, чтобы отключить первый вызов BeginParse(). Так я бы порекомендовал.

public override void OnIdle(bool periodic)
{
    // Once first "Check" parse completes, revert to base implementation
    if (this.CompletedFirstParse)
    {
        base.OnIdle(periodic);
    }
    // Same as base implementation, except we don't check lastParseTime
    else if (!periodic || this.LanguageService == null || this.LanguageService.LastActiveTextView == null || (this.IsCompletorActive) || (!this.IsDirty || this.LanguageService.IsParsing))
    {
        this.BeginParse();
    }
}
0 голосов
/ 16 марта 2012

Я также перенес языковую службу с 2008 на 2010 год. Можете ли вы проверить, выполнили ли вы все эти шаги?

http://msdn.microsoft.com/en-us/library/dd885475.aspx

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

...