2012-03-15 6 views
0

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

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

+0

Удачи вам в этом? – ColinCren

ответ

0

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

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

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

0

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

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

0

Когда ваш объект 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(); 
    } 
}