MPS 2023.3 ヘルプ

ノードをコメントアウトする

MPS でノードをコメントアウトするための一般的なサポート

MPS は、モデル内のノードをコメントアウトする汎用的な方法を提供します。以前のバージョンでは、この機能は、ノード属性または専用のコメントノードのいずれかを使用して、すべての言語で個別に実装する必要がありました。MPS 3.3 以降、コメントアウトされたノードに関する情報は、一般的な方法でモデルに保存されます。smodel 言語はデフォルトでコメントアウトされたノードを無視するため、クエリでコメントアウトされたノードを明示的に除外する必要がありません。

さらに、Ctrl を押すことによってノードをコメント化 / コメント解除するアクションが作成されました。

どうやって使うのですか

ルートを除く MPS の任意のノードを選択し、Ctrl+/ を押すことができます。そのノードはコメント化されます。いくつかの例を見てみましょう:

mps-comment1.png

選択したノードまたはカーソルを合わせたノードはコメントアウトされます。1 行全体を占めるのか、それとも数行行を占めるのか、式のような階層構造で深くネストされているのかに関係なく、すべての単一の非ルートノードをコメントアウトできます。

mps-comment2.png
Comment3.png

ノードをコメントアウトすると、モデル内のその場所から物理的に削除されます。コメントアウトされたノードが要求された子リンクを占有していた場合、ユーザーが新しい子の値を入力できるように空のセルが提供されます。

Comment4.png

たとえば、BaseLanguage では、これにより、Java パーサーで許可されている以上の可能性が得られます。IfStatements 条件をコメントアウトできます。

Comment5.png

メソッドパラメーター:

Comment6.png

または変数型

Comment7.png

別の例を挙げると、エディター定義言語では、エディターセルをコメントアウトすることができます。

Comment8.png

スマートコメントアウト

コメントおよびコメント解除アクションは、どのノードをコメント / コメント解除するかを決定するために、それらにある程度のインテリジェンスを持ちます。

  • ノードまたはノードのセットが選択されている場合、このノードはコメントアウトまたはコメント解除されます。

  • ノードが選択されていない場合、エディターは現在の「行」をコメントアウトまたはコメント解除しようとします - これを達成するために、キャレットのノードで検索を開始してメンバーに近いキャレットのノードの祖先を識別します。この垂直コレクションのうちコメントアウトされている / コメントされていないもの

モデルではどのように機能しますか

ノードがコメントアウトされると、BaseCommentAttribute と呼ばれる特別な子属性に子として (ラップされて) 配置されます。次に、この属性のインスタンスが、コメントノードの以前の親にあるコメントノードリンクにアタッチされます。ChildAttributeLinkAttribute の概念と同じですが、ChildAttribute が集約リンクにアタッチされる点が異なります。そのため、コメントノードは通常の子として保存されず、子ロールの通常のクエリには表示されません。また、node.children 操作はコメントアウトされたノードを無視します。コメントから子を収集するには、node.childrenAndChildAttributes <role> も使用します。node.descendants 操作は現在、コメントアウトされたノードを返しますが、これは、MPS の将来のバージョンで node.children 操作と一致するように変更される可能性があります。

Comment9.png

MPS エディターはコメントを認識しており、このロールではコメントアウトされたノードだけでなく子ノードも描画します。

コメント付きノードの照会

smodel 言語には、コメント化されたノードを照会するオプションがあります。任意の属性に機能する同じ構文を使用しますが、コメント属性では包含リンクによるパラメーター化が許可されます。例: ノードに、commands という名前の子コレクションがある場合、commands の子のいずれかがコメントアウトされているかどうかを照会すると、次のようになります。

node.@comment<commands>.isNotEmpty

カスタム

デフォルトでは、コメントされたノードはすべて /* */ で囲まれて描画されます。コンセプトのカスタムコメントエディターを定義することで、コメントアウトされたノードの外観を上書きできます。ヒントコメントを使用して通常のエディターを定義するだけです。

Comment10.png

ユーザーがコメント付きコードを視覚的に区別しやすいように、エディターのスタイルを変更する必要があります。

Commentx1.png

灰色と斜体スタイルを使用する定義済みのコメントスタイルを再利用することも、コメントアウトされたノードに独自のスタイルを作成することもできます。

: コメント付きノードの子は通常のエディターで描画する必要があるため、子セル内のコメントヒントを削除する必要があります。

Comment11.png

より簡単なカスタマイズ

次に適用可能なエディターセルを使用すると、コメントアウトされたノードの外観をより便利にカスタマイズできます。カスタマイズされた単一のコメントエディターを使用して、階層内の複数の概念に対処できます。

Commxy1.png

次の適用可能なエディターセルは、コメントヒントを削除し、コンセプトの元のエディター (IfStatement) を見つけるように要求をリダイレクトするだけです。これにより、エディター定義を繰り返す必要がなくなります。共通のスーパーコンセプトのコメントヒントにバインドされた単一のエディターを定義すると、タスクをさらに簡素化できます。これにより、すべてのサブコンセプトがカスタマイズされたコメントエディターを取得します。

コードからのノードのコメントアウト / コメント解除

jetbrains.mps.editor.runtimeCommentUtil クラスを使用すると、アクション、インテンション、キーマップなどのコードからノードをコメントアウトしたり、コメント解除したりできます。これにより、コメントアウトされたノードの動作をさらにカスタマイズするオプションが提供されます。

CellAction_CommentOrUncomment とその継承クラスは同じパッケージから提供されます。これらを使用すると、ノードをコメント化して選択を復元したり、現在コメント化されているノードのコメントを解除したりすることができます。

コメントエディターのアクション

コメント / コメント解除アクションに対する応答も、ノードレベルでカスタマイズできます。セルのアクションマップで COMMENT アクションのハンドラーを設定できます。

disable_commenting.png

例: ユーザーがロボットの Kaja While ステートメントで条件をコメントアウトできないようにする場合は、上記のアクションマップを条件を表す While エディターのセルにアタッチします。 :

Comment13.png

COMMENT アクションはカスタマイズされているため、指示されていることを行います。

アクションは条件ノードが選択されている場合にのみ機能します。

ノードをパラメーターとして CellAction_CommentOrUncommentNode を作成すると、ノードWhile ステートメントとなり、アクションは While ステートメントを処理します。

1)コメントがない場合、アクションはコメントアウトします。

2)コメントアウトされている場合、アクションはコメント解除します。

条件のコメントは無効になります。

カスタムのコメントアウト機能からの移行

MPS 3.3 より前のバージョンでは、言語制作者は各言語に対してコメントアウト機能を個別に実装する必要がありました。MPS 3.3 では、カスタム機能は冗長である可能性があり、MPS によって提供される一般的な機能によって置き換えられる必要があります。おそらく上記のようなカスタマイズが必要です。古いカスタムコメントアウト機能の既存の使用箇所は、一般的なバージョンに移行する必要があります。これは、いくつかの手順で実行する必要があります。

  1. コメントアウトに使用されていた古い概念は廃止されるべきです

  2. コメントアウト / コメント解除のためのキーボードショートカット、アクション、インテンションは廃止予定であるか削除されるべきです

  3. 「コメント」エディターヒントにカスタムエディターを定義して、コメントアウトされたノードの外観をカスタマイズすることもできます。(上記のように)

  4. 一部のエディターセルの汎用コメントアウト機能を無効にすることもできます (上記のように)

  5. ユーザーコード内の古いカスタムコメントノードの使用箇所を一般的な方法でコメントされたノードに自動的に変換する移行を提供する必要があるかもしれません。これは完全に手動で、または MPS の支援を受けて行うことができます。

MPS による移行

MPS は、IOldCommentAnnotation および IOldCommentContainer を使用して、どの概念が古いカスタムコメントを表すかを指定すれば、移行を作成できます。過去にカスタムコメントを作成する 2 つの典型的な方法があったため、2 つのインターフェースが必要です:

  • IOldCommentAnnotation - ノードがコメントアウトされていることを示す NodeAttribute によって実装される必要があります。属性が使用されている場合は、コメントアウトされたノードにアノテーションを付けます。

  • IOldCommentContainer- コメント化されたノードが SingleLineComment などの専用の概念で表されている場合、これらの専用の概念はこの概念インターフェースでマークする必要があります

これらのマーカーコンセプトインターフェースは jetbrains.mps.lang.core から提供されているため、この言語を使用するには、言語によって拡張する必要があります。アノテーションが付けられると、汎用コメントアウト機能はこれらの概念のノードで停止され、古いカスタムコメントアウト機能が優先されます。

さらに、古いコメントアウトの概念には、古いコメントコンテナーは移行されるべきですまたは古いコメントアノテーションは移行する必要がありますという警告が報告されます。これらの警告に対する迅速な修正により、古いカスタムコメントアウトスキームを一般的なスキームに簡単に変換するために必要な移行が作成されます。クイックフィックスを起動し、生成された移行を確認してからプロジェクトを移行するだけです。

完全に手動の移行

移行は完全に手動で作成できます。通常、移行で行う必要があるのは、古いカスタム方法でコメントアウトされているすべてのノードを見つけ、コメントを解除し、各ノードで CommentUtil.comment() を呼び出して、新しい方法でコメントアウトすることです。CommentUtil クラスは jetbrains.mps.editor.runtime から取得されます。

汎用コメントアウト機能は、コメントアウトされたノードを、コメントアウトされたノードの親に添付され、コメントアウトされたノードの本来のロールを保持し、jetbrains.mps.lang.core から取得される BaseCommentAttribute アノテーションでマークします。そのため、コメントアウトされたノードを含むモデルではこの言語を使用する必要があります。自動移行では、変更されたすべてのモデルにこのような言語依存関係追加する必要があります。BaseLanguage の SingleLineComment ノードを移行した ReplaceSingleLineCommentsWithGenericComments 移行からヒントを得ることができます。

Mig1.png
Mig2.png