MPS 2020.3 ヘルプ

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

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

MPS は、モデル内のノードをコメントアウトするための普遍的な方法を提供します。以前のバージョンでは、この機能は、ノード属性または専用のコメントノードを介して、すべての言語で個別に実装する必要がありました。MPS 3.3 以降、コメントアウトされているノードに関する情報は、一般的な方法でモデルに格納されます。smodel 言語はデフォルトでコメント化されたノードを無視するため、クエリでコメント化されたノードを明示的に除外する必要はありません。
さらに、Ctrl を押すことによってノードをコメント化 / コメント解除するアクションが作成されます。

どうやって使うのですか

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

Mps comment1

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

Mps comment2

Comment3

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

Comment4

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

Comment5

メソッドパラメーター:

Comment6

または変数型

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

Comment8

スマートコメントアウト

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

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

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

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

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

Comment9

MPS エディターはコメントについて知っていて、このロールではコメントアウトされたノードと同様に子も描画します。

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

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

node.@comment<commands>.isNotEmpty

カスタム

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

Comment10

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

Commentx1

イタリックスタイルで灰色を使用する事前定義されたコメントスタイルを再利用するか、コメントアウトされたノード用に独自のスタイルを作成することができます。

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

Comment11

より簡単なカスタマイズ

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

Commxy1

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

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

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

CellAction_CommentOrUncomment とその継承クラスは、同じパッケージから取得されます。ノードにコメントを付けて選択を復元するか、現在コメントされている場合はノードのコメントを解除する方法を提供します。

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

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

Disable commenting

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

Comment13

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

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

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

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

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

したがって、条件のコメントは無効になります。

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

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

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

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

  3. "comment" エディターヒントに付随するカスタムエディターを定義することによってコメントアウトされたノードの外観をカスタマイズしたいかもしれません (上記のように)

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

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

MPS による移行

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

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

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

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

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

完全に手動の移行

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

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

Mig1

Mig2