2016の19日目の記事です。bulb(電球アイコン)を使ったコードアクションを実装する方法を、実際にちょっとしたスペルチェッカーを実装しながら紹介したいと思います。それを例にソースコードを読み解いていきたいと思います。Calendarでは、VSCodeの画面をリアルタイムで共有できるサービスを作って公開したりしましたが、今年は時間が全然なかったので何もできませんでした。あとこの記事はだいぶ急いで書いています。殴り書きのようになってしまいましたがご容赦ください。ご意見等ありましたら、コメントやTwitterなどでいただければと思います。完成版はこちらからどうぞ。Codeで診断機能を実装するには、APIを通してvscode.DiagnosticCollectionを確保した後(4行目)、このコレクションに診断結果を格納する必要があります。ドキュメント中の表示する位置を求めた後(18-20行目)、診断結果を使って作成します。(21行目)ここでDiagnosticSeverityの値をInformationやErrorなどに変更すると、それに合わせてメッセージのアイコンが変わります。これらによって作成された診断結果のリストを、ドキュメントのURIと対応付けてコレクションへと格納します。diagnostics);}あとは、新しくエディタが開かれたとき(vscode.window.onDidChangeActiveTextEditor)やドキュメントが保存されたとき(vscode.workspace.onDidSaveTextDocument)に発火するイベントをトリガーにして、createDiagnostics関数を呼び出してあげましょう。実際にこの時点でコードを実行すると次のように診断結果が表示されることがわかります。1つ目のHelloのみを検出する診断機能コードアクションを実装するコードアクションを実装するのは少々複雑です。コードアクションは以下の手順で実現されます。bulb(電球マーク)が表示されるようになるアクションコマンドが実行された際に呼ばれるコマンドを実装する以下、順を追って説明していきます。ソースコードの完成版は以下のリンクにありますので、併せて確認すると良いでしょう。第2引数にCodeActionProviderインターフェースを実装したクラスのインスタンスを指定します。後略}コードアクション用のコマンドを登録するコード修正用のコマンドを登録します。bulbを実際に採用した際に行われる処理の内容となります。この時、コールバックとなる関数はfixWithSuggestionという名前にしたため、5.でこの関数の中身を実装する必要があります。後略}CodeActionProviderのメンバーであるprovideCodeActionメソッドを実装するいい感じに実装します。ここでポイントとなるのが8-12行目です。10行目では、採用された際に実行されるコマンド(a)のId(先ほどの項目で使ったものと同じである必要があります)を指定し、11行目ではその関数へと渡す引数を指定しています。commands;}アクションコマンドが実行された際に呼ばれるコマンドを実装するいよいよ最後の段階まで来ました。この中ではコードアクションの実行部分、つまり実際に指定された箇所の変更を行うコードを記述していきます。ここでポイントとなるのが、9-10行目です。9行目でドキュメントのURI・範囲・編集内容を記録した後、10行目で実際に記録された内容の適用を行っています。vscode.workspace.applyEdit(edit);}ここまで出来たら、実際に実行してみましょう。you”に置換するコードアクションが表示されることでしょう。bulbを採用すると、コードアクションが適用されることがわかります。おちばびろいコードアクションを適用したのに診断結果の波線が消えない...!こんな感じに、拡張機能側でもmapを持っておいて、コードアクションを適用したら修正/再適用してあげると良い感じになります。保存中に診断が実行されて重い...!こちらのソースコードをご覧ください。この実装方法は、MS公式のvscode-spell-checkを参考にしたものですが、診断処理を行うタスクをわざと一定期間遅延させて、その間に起った診断処理の再計算を求める処理をすべて1つにまとめています。これによって短期間に連続して何度も診断処理を行うことや、保存中にフリーズすることを防いでいます。そもそも処理が遅い頑張って良い感じのデータ構造・アルゴリズムを使って高速化してください。Automatonでも作ると良いんじゃないんですかね、というのがらぼでの見解でした。まとめいかがでしょうか。簡単に診断機能とコードアクションを使うことができることがお分かりいただけたかと思います。実はこの拡張機能自体は今年の9月頃に作成しましたが、主に執筆時の表記ゆれを検出するのに(個人的には)大活躍しています。非常に便利な診断機能/コードアクション向けのAPI、ぜひ何かの拡張機能で活用していきたいものですね。コメントをキャンセルメールアドレスが公開されることはありません。