3

MPF を使用して VSPackage に言語サービスを実装しようとしていますが、理解したとおりに機能していません。

ParseSourceで入力ファイルを解析するなど、すでにいくつかの実装がありますParseRequest。ただし、エラーが見つかった場合は、 で追加しAuthoringSink.AddErrorます。これに関するドキュメントは、それがエラーリストに追加されることを意味します。そうではありません。

MySourceのサブクラスである単純なクラスもありSourceます。オーバーライドされたLanguageService.CreateSourceメソッドでこの新しいクラスを返します。のドキュメントにOnCommandは、「コマンドが入力されたときに」起動されると書かれています。しかし、そうではありません。

明らかに、私が正しく行っていない中間ステップがあります。私はすでに十分にとりとめなかったので、リクエストに応じて追加の詳細を喜んで提供します.

説明をいただければ幸いです。

4

2 に答える 2

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

これがお役に立てば幸いです。

OnCommand は、コマンドがあるたびに起動する必要があります。 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);
}

それでもうまくいかない場合は、LanguageService パッケージをセットアップするときに、ProvideLanguageService 属性で CodeSense = true であることを再確認してください。LanguageService で行うと便利なことの多くは、これらの属性を正しくオンにする必要があります。無料でクールな振る舞いをしてくれる人もいます!

注意すべきもう 1 つの点は、私の経験では、カラーライザーのような一部の動作がハイブで正しく機能しないことです。これらが問題を引き起こしたとは思いませんが、数年前にこれらを実装したので、ほとんど古いコードを振り返っています。

于 2012-08-30T21:47:28.133 に答える