MPS 2019.3ヘルプ

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

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

MPS provides a universal way to comment out nodes in models. In previous versions this functionality had to be implemented in all languages separately, either through node attributes or dedicated comment nodes. Since MPS 3.3 the information about a node being commented out is stored in the model in a generic way. The smodel language ignores commented out nodes by default so that your queries do not have to filter out commented out nodes explicitly.
Additionally, actions have been created to comment/uncomment out a node by hitting Ctrl .

どうやって使うのですか

You can select any node in MPS, except roots, and press Ctrl+/ . That node will be commented out. Lets watch some examples:

mps comment1

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

mps comment2(英語)

Comment3(英語)

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

Comment4(英語)

たとえばBaseLanguageでは、これはJavaパーサーが許すことを超えた可能性を与えます。IfStatements条件をコメントアウトできます。

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(英語)

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

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

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(英語)


最終更新日: 2019年12月25日