Qt 6.6で導入された「QML Language Server」には、新たなコードナビゲーション機能が加わっています。本稿ではQML Language Serverとは何か、また使い方についてご紹介します。
QML言語サーバーとは?
QML Language ServerはQMLの言語モデルで、多くのエディタで利用可能です。
具体的には、警告やエラーの表示、高度なコードナビゲーション、コードの整形などが行えます。QML Language Serverについてより詳しく知りたい方は、最新(執筆時点での)ドキュメントページ(英語)をぜひご参照ください。
QML Language Serverを実際に使用するには、Language Server Protocol(LSP)が必要です。
VS CodeでQML言語サーバーをセットアップする
それでは、お好みのテキストエディタ(LSP対応済み)を使用して、QML Language Serverの新機能を体験してみましょう。
セットアップ手順はエディタによって異なりますが、この記事ではVS CodeでのQML Language Serverの設定方法についてご紹介します。
Qt Creator 11(執筆時点での最新バージョン)では、QML Language Serverの機能はデフォルトで用意されています。「環境設定(英語)」から「言語クライアント」にQML Language Serverを追加したり、「Qt Quick」設定でqmllsサポートをオンにすることはできますが、これらは内部で動いている実装を上書きするわけではありません。この仕様は、QML Language Serverが今後進化するにつれて変わる可能性があります。
警告が表示されない場合、無効なQMLドキュメントが存在するか、またはQML Language Serverが正確にセットアップされていない可能性があります。先に「VS CodeでのQML Language Serverのセットアップ」で説明した手順を見落としているかもしれません。
QML Language Serverは、ビルドディレクトリを調査してプロジェクト内のQMLモジュールを検出します。`build-demoforqmllswhatsnew66-debug`フォルダ内で`ninja`コマンドを実行し、プロジェクトをビルドしてください。
プロジェクトのビルドが完了したら、一度エディタを閉じて再度開きます。これにより、QML Language Serverが不足しているモジュールのロードを試み、関連する警告が消えているかを確認してください:
QML Language Serverがまだ動作していることを確認するために、未定義の`QmlComponent`を追加してみました。このコンポーネントに対する定義を追加することで、警告を解消できます:
component UnknownComponent: Item {} // add this line before the line with 'UnknownComponent {}'
この行を追加することで、プロジェクトを再コンパイルしたり、手動で`qmllint`を実行してファイルにエラーがないかチェックする必要がなくなるでしょう。QML Language Serverが警告の更新を自動で行ってくれるからです。
QML言語サーバー6.6の新機能を紹介
QML Language Serverは現在も開発中であり、クラッシュやバグが発生する可能性があります。クラッシュやバグの報告はこちらからお願いします。
スクリーンショットを撮影する目的で、私はQML Language Serverの各種機能をコンテキストメニューから起動することにしました。
定義への移動
6.6から導入されたQML Language Serverの新機能の一つとして、特定のオブジェクトの定義を検索する機能があり、これは6.7でさらに改善される予定です。例えば、`myItem.i`がどこで定義されているのか知りたい場合があります。それは、誰かが全てのプロパティの名前を'i'と設定したためです。`myItem.i`の`i`を右クリックして、'Go to definition'を選択してください:
Ask for the definition of i.
すると、QML Language Serverが動作し、エディタは`i`のプロパティ定義の位置にジャンプします:
The definition of i.
今後、QML Language Serverの機能が拡充されるにつれて、右クリックメニューから実行できる操作も増える予定です。
これは、例えば、`id`に対しても同様に有効です:
myItemの定義を確認する
これにより、上方に存在する`myItems`の定義を見つけることができます:
myItemの定義を発見
ぜひご自身で試してみてください!QMLのコードを書き、QML Language Serverにその定義を探してもらいましょう。何か予期せぬ動作があれば、こちらで報告をお願いします。
QML Language Server 6.6のもう一つの新機能として、シンボルの使用法を検索する機能があります。例えば、`f`関数が`i`というプロパティを頻繁に使用する場合、QML Language Serverに現在のQMLファイル内での`i`プロパティの出現回数を全て検索してもらうことができます。
iの使用箇所を調べる
以下のような使用例が表示されるはずです:
iの使用箇所
`i`の定義も使用例のリストに含まれていますが、QML Language Serverは`f`関数の内部で定義されたJavaScriptの識別子`i`と、`while-loop`のブロック内で定義されたJavaScriptの識別子`i`を区別している点に注意してください。興味があれば、内側の識別子の使用法も確認してみてください:
iの使用箇所を調べる
その結果は以下のようになるでしょう:
iの使用箇所
また、`myItems`のような特定の`id`の使用法を探すことも可能です:
myItemsの使用箇所を調べる
その結果は以下のようになるでしょう:
myItemsの使用箇所
既知の制限事項
QML Language Server 6.6では、いくつかの制限事項があることが知られています。
メソッド名
現在のところ、メソッド名はサポートされていないため、QML Language Serverはメソッドへの参照を検出すること、またはメソッドの定義にジャンプすることはできません。