2012-07-25 58 views
3

我正在尝试在使用MPF的VSPackage中实现语言服务,但它的工作并不像我理解的那样。Visual Studio自定义语言服务

我有几个已经实现,如ParseSource解析与ParseRequest输入文件。但是,当它发现错误时,它会将其与AuthoringSink.AddError相加。这意味着它的文档将它添加到我的错误列表中;它没有。

我也有一个简单的MySource类,一个Source的子类。我用一个覆盖的LanguageService.CreateSource方法返回这个新类。 OnCommand的文档说,当输入命令时它被解雇了。但是,事实并非如此。

显然有一些中间步骤我没有做好。我已经足够啰嗦了,所以我很乐意根据要求提供任何其他细节。

任何澄清是非常感谢。

+0

请注意,对于面向Visual Studio 2010及更新版本的扩展,MPF语言服务已过时。如果可能的话,你应该考虑使用新的MEF接口(除非你需要定位Visual Studio 2008或更早的版本)。 – 2014-03-26 12:50:06

回答

1

对于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); 

我希望这是有帮助的。

按需应该被解雇每次有命令,在你的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 =设置LanguageService包时,您的ProvideLanguageService属性为true。 LanguageService中很多很酷的功能需要正确打开这些属性。有些甚至给予免费的酷行为!

另一件需要注意的事情是,根据我的经验,某些行为(如着色器)在蜂房中无法正常工作。我不认为这些是给我带来麻烦的,但是我在几年前实施了这些,所以我主要只是回顾旧代码。

1

AuthoringSink.AddError只会在错误列表中增加错误,如果ParseRequest.ReasonParseReason.Check。当您的ParseSource函数试图在解析其他任何ParseReason时添加错误时,什么都不会发生。

您的语言服务可能永远不会呼叫ParseSource与此ParseReason。据我所知,only way得到ParseReasonCheck(手动调用BeginParseParseSource以外)是proffer your service with an idle timer

相关问题