MPS 2020.1 ヘルプ

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

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

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

どうやって使うのですか

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

mps comment1

The node that you select or point the cursor at will get commented out: Every single non-root node can be commented out - irrespective of whether it occupies a whole line, several lines, or whether it is nested deeply in an expression-like hierarchy.

mps comment2

Comment3

If you comment out a node, it will be physically removed from its place in the model: If the commented out node occupied a requested child link, an empty cell is provided so that the user can fill in a new child value.

Comment4

In BaseLanguage , for example, this gives you possibilities beyond what the Java parsers allows: You can comment out an IfStatements condition:

Comment5

メソッドパラメーター:

Comment6

または変数型

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

Comment8

スマートコメントアウト

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

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

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

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

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

Comment9

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

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

smodel 言語はあなたにコメントされたノードを問い合わせるオプションを与えます。comment 属性が包含リンクによるパラメタリゼーションを可能にするということだけが、どんな属性にも働くのと同じ構文を使います。例:ノードは 、コマンドという名前の子コレクションを持っている場合は、コマンドの子供たちのいずれかがコメントアウトされているかどうかを問い合わせることは次のようになります。

node.@comment<commands>.isNotEmpty

カスタム

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

Comment10

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

Commentx1

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

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

Comment11

より簡単なカスタマイズ

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

Commxy1

The next applicable editor cell simply removes the comment hint and redirects the request to find the original editor of the concept ( IfStatement ). This avoids the need for repetition of the editor definition: You may further simplify the task, if you define a single editor bound to the comment hint for a common super-concept - this way all sub-concepts will get the customized comment editor.

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

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

CellAction_CommentOrUncomment とその継承クラスは同じパッケージから来ています。それらはあなたに単純にノードをコメントして選択を元に戻すか、それが現在コメントされているならノードのコメントを外す方法を与えます。

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

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

disable commenting

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

Comment13

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

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

、ノードが しながら声明でパラメーターとしてノードCellAction_CommentOrUncommentNode を作成しているため、アクションがしながら文を処理します。

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

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

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

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

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

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

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

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

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

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

MPS による移行

MPS は、IOldCommentAnnotationIOldCommentContainer を使用して、どの概念が古いカスタムコメントを表すかを指定していれば、マイグレーションを作成できます。これまでカスタムコメントを作成する方法は 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