0

私は、インターネット上で言語サービスを提供する 2 つの方法を見つけました。

最初の方法では、タイマーを使用しIOleComponentManagerて登録し、アイドル時間中にサービスを呼び出します。

2 番目の方法では、サービスを としてケーシングし、「オンデマンドでサービスを提供する」ためにIServiceContainerを追加します。ServiceCreatorCallback

おそらく、2 番目の方法が「推奨される方法」になっていると思われます。残念ながら、このメソッドを使用すると、実装OnSynchronizeDropdownsで呼び出されることはありません。TypeAndMembersDropdownBars

また、 myLanguageServiceがファイルにエラーを見つけた場合、 を使用ParseRequest.Sink.AddError()してエラー リストにエラーを追加します。「オンデマンド」を提案すると、これらのエラーは GUI に表示されませんが、コードをデバッグするとエラーが追加されます。

構文の強調表示、「定義に移動」、および「すべての参照を検索」が引き続き機能するため、言語サービスが登録されていることがわかります。

「オンデマンドでサービスを提供する」ために使用しているコードは次のとおりです。

IServiceContainer serviceContainer = this as IServiceContainer;
ServiceCreatorCallback callback = new ServiceCreatorCallback(CreateLanguageService);
serviceContainer.AddService(typeof(MyLanguageService), callback, true);

LanguageServiceオンデマンドで提供するときに、一部の機能が機能しない理由を誰か教えてもらえますか? 私は何か不足していますか、それとも完全に機能する言語サービスを意図したものではありませんか?

4

1 に答える 1

1

少なくとも機能が不足しているためIOleComponentManager、タイマーを登録してアイドル期間中に言語サービスを呼び出すメソッドを使用する必要があるようです。

dotPeekを使用して、エディター内をクリックすると、選択したアイテムを同期するため OnSynchronizeDropdowns()に呼び出されることがわかりました。それ自体はメソッドからのみ呼び出されるように見えますが、これにはアイドルタイマーの使用が必要だと思います。OnCaretMoved()OnCaretMoved()LanguageService.OnIdle()

ParseRequest.Reasonさらに掘り下げた後、エラーリストでは をに設定する必要があることもわかりましたParseReason.Check。そうしないと、呼び出しが無視されます。コードをもう少し掘り下げると、解析理由が使用されていることがわかった唯一の場所はSource.OnIdle().

更新:これら 2 つの機能には、アイドル タイマーの登録が必要であることを確認したと思います。LanguageService.OnIdleの MSDN から:

このメソッドは、独自のタイマーを設定し、タイマー ハンドラーからこのメソッドを呼び出さない限り、呼び出されません。

前回OnIdleが呼び出されてからキャレットが移動した場合、基本メソッドはOnCaretMovedを呼び出します。base メソッドは、現在のビューのSourceオブジェクトでOnIdle メソッドを呼び出します。現在のSource オブジェクトを取得できない場合、基本メソッドはOnCaretMovedを呼び出さないなど、何もしません。

于 2014-02-27T13:44:32.157 に答える