ノードをコメントアウトする
MPS でノードをコメントアウトするための一般的なサポート
MPS は、モデル内のノードをコメントアウトする汎用的な方法を提供します。以前のバージョンでは、この機能は、ノード属性または専用のコメントノードのいずれかを使用して、すべての言語で個別に実装する必要がありました。MPS 3.3 以降、コメントアウトされたノードに関する情報は、一般的な方法でモデルに保存されます。smodel 言語は、デフォルトでコメントアウトされたノードを無視するため、クエリでコメントアウトされたノードを明示的に除外する必要がありません。
さらに、Ctrl を押すことによってノードをコメント化 / コメント解除するアクションが作成されました。
どうやって使うのですか
MPS 内のルート以外の任意のノードを選択し、Ctrl+/ を押すと、そのノードがコメントアウトされます。いくつか例を見てみましょう。

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


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

たとえば、BaseLanguage では、Java パーサーでは不可能なことが可能になります。IfStatement の条件をコメントアウトすることができます。

メソッドパラメーター:

または変数型
別の例を挙げると、エディター定義言語では、エディターセルをコメントアウトすることができます。
スマートコメントアウト
コメントおよびコメント解除アクションは、どのノードをコメント / コメント解除するかを決定するために、それらにある程度のインテリジェンスを持ちます。
ノードまたはノードのセットが選択されている場合、このノードはコメントアウトまたはコメント解除されます。
ノードが選択されていない場合、エディターは現在の「行」をコメントアウトまたはコメント解除しようとします - これを達成するために、キャレットのノードで検索を開始してメンバーに近いキャレットのノードの祖先を識別します。この垂直コレクションのうちコメントアウトされている / コメントされていないもの
モデルではどのように機能しますか
ノードがコメントアウトされると、BaseCommentAttribute と呼ばれる特別な子属性の子として配置されます (ラップされます)。次に、この属性のインスタンスが、コメントアウトされたノードの以前の親のコメントアウトされたノードのリンクにアタッチされます。ChildAttribute は LinkAttribute の概念と同じですが、ChildAttribute は集約リンクにアタッチされます。そのため、コメントアウトされたノードは通常の子として保存されず、子ロールの通常のクエリには表示されません。また、node.children 操作はコメントアウトされたノードを無視します。コメントから子を収集するには、node.childrenAndChildAttributes<role> を使用します。node.descendants 操作は現在、コメントアウトされたノードを返しますが、MPS の将来のバージョンで node.children 操作と一貫性を持たせるために変更される可能性があります。

MPS エディターはコメントを認識しており、このロールではコメントアウトされたノードだけでなく子ノードも描画します。
コメント付きノードの照会
smodel 言語には、コメント化されたノードを照会するオプションがあります。任意の属性に機能する同じ構文を使用しますが、コメント属性では包含リンクによるパラメーター化が許可されます。例: ノードに、commands という名前の子コレクションがある場合、commands の子のいずれかがコメントアウトされているかどうかを照会すると、次のようになります。
カスタム
デフォルトでは、コメントされたノードはすべて /* */ で囲まれて描画されます。コンセプトのカスタムコメントエディターを定義することで、コメントアウトされたノードの外観を上書きできます。ヒントコメントを使用して通常のエディターを定義するだけです。

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

灰色と斜体スタイルを使用する定義済みのコメントスタイルを再利用することも、コメントアウトされたノードに独自のスタイルを作成することもできます。
注 : コメント付きノードの子は通常のエディターで描画する必要があるため、子セル内のコメントヒントを削除する必要があります。

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

次の適用可能なエディターセルは、コメントヒントを削除し、コンセプトの元のエディター (IfStatement) を見つけるための要求をリダイレクトするだけです。これにより、エディター定義を繰り返す必要がなくなります。共通のスーパーコンセプトのコメントヒントにバインドされた単一のエディターを定義すると、タスクをさらに簡素化できます。これにより、すべてのサブコンセプトがカスタマイズされたコメントエディターを取得します。
コードからのノードのコメントアウト / コメント解除
jetbrains.mps.editor.runtime の CommentUtil クラスを使用すると、アクション、インテンション、キーマップなどのコードからノードをコメントアウトしたり、コメント解除したりできます。これにより、コメントアウトされたノードの動作をさらにカスタマイズするオプションが提供されます。
CellAction_CommentOrUncomment とその継承クラスは同じパッケージに含まれています。これらを使用すると、ノードをコメントアウトして選択状態を復元したり、現在コメントアウトされているノードのコメントを解除したりできます。
コメントエディターのアクション
コメント / コメント解除アクションに対する応答も、ノードレベルでカスタマイズできます。セルのアクションマップで COMMENT アクションのハンドラーを設定できます。

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

COMMENT アクションはカスタマイズされているため、指示されていることを行います。
アクションは条件ノードが選択されている場合にのみ機能します。
ノードをパラメーターとして CellAction_CommentOrUncommentNode を作成すると、ノードは While ステートメントとなり、アクションは While ステートメントを処理します。
1)コメントがない場合、アクションはコメントアウトします。
2)コメントアウトされている場合、アクションはコメント解除します。
条件のコメントは無効になります。
カスタムのコメントアウト機能からの移行
MPS 3.3 より前のバージョンでは、言語生産者は各言語に対してコメントアウト機能を個別に実装する必要がありました。MPS 3.3 では、カスタム機能は冗長である可能性があり、MPS によって提供される一般的な機能によって置き換えられる必要があります。おそらく上記のようなカスタマイズが必要です。古いカスタムコメントアウト機能の既存の使用箇所は、一般的なバージョンに移行する必要があります。これは、いくつかの手順で実行する必要があります。
コメントアウトに使用されていた古い概念は廃止されるべきです
コメントアウト / コメント解除のためのキーボードショートカット、アクション、インテンションは廃止予定であるか削除されるべきです
「コメント」エディターヒントにカスタムエディターを定義して、コメントアウトされたノードの外観をカスタマイズすることもできます。(上記のように)
一部のエディターセルの汎用コメントアウト機能を無効にすることもできます (上記のように)
ユーザーコード内の古いカスタムコメントノードの使用箇所を一般的な方法でコメントされたノードに自動的に変換する移行を提供する必要があるかもしれません。これは完全に手動で、または 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 移行からヒントを得ることができます。


関連ページ:
要求追跡言語
このクックブックでは、要件追跡サンプルプロジェクトの手順を説明します。このサンプルプロジェクトは、言語に依存しない要件追跡を実装しています。その過程で、いくつかの便利な言語構造を解説します。異なる言語のノードにアノテーションを付けるノード属性、コンセプトごとの複数のエディター(プレゼンテーション)とエディターヒントによるそれらの切り替え、選択されたエディターへのプログラムによるアクセスヒントとエディターのプログラムによる選択、参照のコレクションでの繰り返しを避けるための参照スコープ、要件追跡サン...
共通言語パターン
この章では、MPS を学習する初心者が頻繁に遭遇する一般的な言語設計パターンについて解説します。これらは、MPS ユーザーがオンラインフォーラムで最もよく確認する質問であることが長年にわたり明らかになったため、参照しやすいように回答を 1 か所にまとめることにしました。言語パターン付きのサンプルプロジェクト:MPS にはサンプルプロジェクトがバンドルされています。ここで説明するパターンの多くは、languagePatterns サンプルプロジェクトに実装されています。これを MPS で開き (M...