2012-07-25 57 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

相關問題