2017-04-10 13 views
0

言語サーバーを実装しました。リンターは、必要なプロパティーと「不足しているプロパティー」エラーを検査します。私はこれらのエラーの対応する '不足しているプロパティを挿入'クイックフィックスを持っていたいと思います。言語サーバー経由でquickfixを実装する方法

私はこれがあるためにLSPプロトコルの一般的な領域を意味だと思う。これにより

textDocument/codeAction

、サーバが「不足しているプロパティ」診断マーカーは「不足しているプロパティを挿入」コマンドを返すことができます。

しかし、サーバーは 'insert missing property'コマンド自体をどのように実装していますか?

lspの仕様を見ても、サーバーがコマンドを登録できるようなものは見つかりません。

私はここで、クライアント側でコマンドを登録するためのvscode APIについていくつかの情報を見つけました:https://code.visualstudio.com/docs/extensionAPI/vscode-api

だから私は、私は、クライアント側の「挿入不足しているプロパティ」を登録し、実装することができたとし、しかし...

クライアント側は、ほとんどの作業をサーバーに委譲する「ダム」ラッパーに過ぎません。したがって、それは実際には文書構造を理解しておらず、その構造を理解することを必要とする文書の変換を実装するのには非常に良い場所ではありません。

私の最良の選択肢は、言語サーバーに「カスタム」プロトコルを追加して、クライアント側で「不足しているプロパティを挿入」コマンドを実装できるが、クイックフィックスの編集の難しい部分を委任することですサーバーに戻ります。

またはもっと良い方法がありますか?

答えて

0

はいカスタムプロトコル拡張を必要としない優れた方法があります。おおよその手順は次のとおりです。

まず、vscode拡張子のpackage.jsonに最新のlanguage-server-clientがあることを確認します。私のバージョンは3.2.xです。また、vscodeエンジンのバージョンを1.6.xに更新する必要がありました。ここにありますexample package.json

言語サーバープロトコルのVersion 3(この執筆時点では草案ですが、すでに使用可能です)を使用できます。

  • textDocument/codeAction:簡易修正を表すコマンドのリストを計算するために、サーバー側でこれを実装し、これらは面白い作品です。

  • workspace/executeCommand:これをコマンドを実行するサーバー側で実装します。 workspace/applyEditを使用して、ワークスペース内の文書への変更をクライアントに要求することができます。

  • client/registerCapability:サーバはExecuteCommandRegistrationOptionsオブジェクトでこれを呼び出すことができます。これにより、サーバー側のコマンドがクライアントに登録され、前の手順で実装されたworkspace/executeCommandハンドラを介して実行することがわかります。

  • initialize:またclient/registerCapabilityを使用して、あなたもそのexecuteCommandProvider属性に適した設定でWorkspaceCapabilitiesオブジェクトを返すことにより、サーバー側のコマンドを登録することができます。この方法はやや複雑ではありません(ただし、コマンドを動的に登録/登録解除する必要がない場合にのみ使用できます)。

クイックフィックスを実装するトピックについては、vscode issue ticketも参照してください。

重要な注意:言語サーバークライアント実装のバージョン3.2.0がbugを持っている、それはあなたがそのバグが修正されるまでその回避しなければならない場合があり、間違った名前client/registerFeatureの代わりclient/registerCapabilityを使用しています。 initializeメソッドを使用すると、このバグの影響を受けません。

関連する問題