语言服务:ParseReason.Check在迁移到VS2010后从未调用过

时间:2012-03-15 20:14:42

标签: visual-studio-2010 vs-extensibility languageservice

我刚刚将我的语言服务从VS2008迁移到了VS2010。一切正常,除了一件重要的事情:我不再为LanguageService.ParseSource调用ParseReason.Check。它在打开文件后会进行一次调用。但在编辑代码后,它不再被调用。

任何想法可能导致什么?

3 个答案:

答案 0 :(得分:0)

我还从2008年到2010年迁移了语言服务。您能否检查一下您是否已经完成了所有这些步骤?

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

我没有做任何其他事情,我通过在更改前后在我们的软件仓库中区分重要文件来验证。

答案 1 :(得分:0)

我不知道你是否曾想过你的问题,但你是否尝试过确保你的Source类'LastParseTime在创建时设置为0?除非在创建Source对象时手动将LastParseTime设置为0,否则我似乎回想起Check not occurred的一些问题。

Protip:如果你使用.NET Reflector,你可以反汇编语言服务框架的所有基类,并很好地理解它是如何工作的。您感兴趣的课程位于Microsoft.VisualStudio.Package.LanguageService.10.0.dll中,该课程应安装在GAC中。我发现在尝试弄清楚为什么事情不能在我自己的语言服务中工作时,这是非常有用的,并且能够在调试器中逐步完成源代码减轻了使用这些框架的几乎所有痛苦! / p>

答案 2 :(得分:0)

初始化Source对象后,它会以LastParseTime Int32.MaxValue开始。导致ParseRequest ParseReason.Check触发的代码会检查LastParseTime值,以查看自上次更改文本以来的时间是否小于运行解析所需的时间(或CodeSenseDelay设置,以较大者为准。)

处理ParseSource响应的代码应该设置LastParseTime,但据我所知,只有在ParseReasonCheck时才会这样做}。

您可以在初始化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();
    }
}