MPS 2023.3 ヘルプ

インテンション

インテンションは、MPS によって言語作成者がその言語を使用するユーザーのユーザーエクスペリエンスをスムーズにできることを示す非常に良い例です。インテンションは、「ブール値の否定」、「条件の反転」、「使用箇所からの作成」など、言語の構文構造で最もよく使用される操作にすばやくアクセスできます。IntelliJ IDEA のインテンションや、最新の IDE の同様の機能を使用したことがある場合は、MPS、インテンションが非常に馴染み深いものになるはずです。

インテンションを使う

intentions-menu.PNG

IDEA と同様に、現在の位置のコードに適用可能なインテンションがある場合は、バルブが表示されます。使用可能なインテンションのリストを表示するには、Alt+Enter を押すか、バルブをクリックします。インテンションを適用するには、インテンションをクリックするか、選択して Enter キーを押します。これにより、インテンションがトリガーされ、それに応じてコードが変更されます。

サンプル: 適用インテンションのリスト

インテンションメニューには通常、ラベル付きグループでソートされた 1 〜 20 項目が含まれています。利用可能なすべての項目が表示されるため、セルメニューよりクリックしやすいです。ただしキーボードのみの使用は便利です。マウスのみでの使用も可能ですが、バルブアイコンが表示されるのを待つ必要があります。インテンションメニューが開いている間に、許容範囲内でギャップを考慮した検索でリスト要素をフィルタリングするために入力を始めることができます。コード補完メニューとは異なり、最初はフィルタリングされていません。

Alt+Enter で開くか、現在の行の左側にある「すぐに表示される」バルブアイコンをクリックします。入力してフィルターします。矢印キーまたはホバーで項目を選択します。Enter キーまたはシングルクリックで終了します。中止はセルメニューと同じように機能し、Escape キー、メニューの外側をクリックするか、別のアプリケーションに変更します。

インテンションタイプ

すべてのインテンションは、ある種の「ショートカット」であり、ノード構造の一部の操作をユーザーに近づけます。インテンションには、通常のインテンション (パラメーター付きの可能性あり) と「囲む」インテンションの 2 種類があります。

一般的に、これらのタイプのインテンションの間に技術的な違いはありません。これらは、ユーザーによる通常の使用方法のみが異なります。

通常のインテンションはインテンション (バルブ) のリストにリストされており、操作をカスタマイズするパラメーターをユーザーに要求することなく、ノード上で直接変換を実行します。

「囲む」インテンションは、特殊な種類の変換 (一部のノードを別の構造で囲む (たとえば、「括弧で囲む」)) を実装するために使用されます。これらのインテンションは、ノード上で ctrl-alt-T (括弧で囲むコマンド) を押さない限り、ユーザーには提供されません。また、一般的なインテンションポップアップメニューにも表示されません。

ユニバーサルインテンションは 3.4 で導入された新しい実験的機能で、インテンションとパラメーター化されたインテンションを統合できます。さらに、インテンションにメソッドやその他のクラスメンバーを追加でき、java に似たエディターを備えています。この機能はまだ実験段階にあるため、古い機能を完全に置き換えないことにしました。古いインテンションを使用することを引き続きお勧めしますが、新しいエディターの方が好きな人は、新しいエディターを試すことができます。ユニバーサルインテンションの構造は古いインテンションと非常に似ており、使用するのは非常に簡単です。

一般的なインテンション構造

名前

インテンションの名前好きな名前を選択できます。唯一の明らかな制約は、名前がモデルの範囲内で一意でなければならないことです。

概念のため

インテンションは、この概念のインスタンスであるノードとそのサブコンセプトへの適用性についてのみテストされます。

子ノードで利用可能

N がインテンションを適用できるノードであるとします。このフラグが false に設定されている場合、インテンションはキャレットがノード N 自体の上にある場合にのみ表示されます。true に設定すると、N の子孫にも表示されます。(それでも N に適用されます)

子フィルター

一部の子にのみインテンションを表示するために使用されます。たとえば、「make method final」インテンションはメソッド本体内に表示するのではなく、「public」子を含むヘッダー全体に表示される方が望ましいです。

説明

この関数によって返される値は、ユーザーがインテンションのリストに表示するものです。

isApplicable

「概念用」テストに合格したインテンションは、現在のノードへの適用性についてテストされます。このメソッドが "true" を返した場合、インテンションがリストに表示されており、適用することができます。そうでなければ、インテンションはリストに表示されません。このメソッドのノード引数は、"for concept" またはその下位概念の 1 つで指定された概念のインスタンスであることが保証されています。

実行する

このメソッドはコード変換を実行します。ノードパラメーターが「概念用」および「適用可能」テストに合格したことが保証されます。

追加フィールド

このセクションでは、インテンションメソッドへの後続の呼び出し間で値を保存できるフィールドをユーザーが定義できます。フィールドには、名前、タイプ、オプションで初期化子を指定する必要があります。フィールドは private である必要があります。MPS はインテンションインスタンスを再利用するため、フィールドから読み取る値は、おそらく別のノードでのインテンションの以前の呼び出しから取得される可能性があります。isApplicable() に値を常に設定して、description および execute への後続の呼び出しで読み取ることができるようにしてください。

追加のメソッド

このセクションでは、ユーザーは、繰り返しを避けるためにインテンション内から呼び出すことができるユーティリティメソッドを定義できます。追加のメソッドは通常、計算を実行するか、インテンションの複数の場所で必要なタスクを実行します。追加のメソッドは、含まれているノード内からのみ表示されるようにプライベートにする必要があります。

レギュラーインテンション

エラーインテンション - このフラグは、インテンションの表示に関係します。このフラグは、2 種類のインテンションを区別します。コード内の一部のエラー (たとえば、キャストの欠落) を修正する「エラー」インテンションと、ユーザーが本物のコード変換を実行できるようにするための「通常」インテンションです。2 種類を視覚的に区別するために、エラーインテンションは、オレンジ色のバルブではなく赤いバルブで表示され、該当するインテンションリストで通常のインテンションの上に配置されます。

パラメーター化された通常のインテンション

インテンションは、互いに非常に近い場合があります。ノードを使用して、わずかに異なる方法で、すべて同じ変換を実行する必要がある場合があります。たとえば、ジェネレーター内のすべての「マクロを追加」インテンションは最終的にマクロを追加しますが、追加されたマクロ自体は、インテンションごとに異なります。これは、パラメーター化されたインテンションが必要な場合です。個別のインテンションを作成する代わりに、単一のインテンションを作成し、そのパラメーター化を可能にします。インテンションには、パラメーター値のリストを返すパラメーター関数があります。リストに基づいて、それぞれ異なるパラメーター値を持ついくつかのインテンションが作成されます。その後、ほぼすべてのインテンションのメソッドでパラメーター値にアクセスできます。

囲む - インテンション

このタイプのインテンションは、通常のインテンションと非常によく似ています。そして、記載されているすべての詳細は、これらのインテンションにも当てはまります。

インテンションを保管する場所は?

インテンション言語をインポートすることにより、任意のモデルでインテンションを作成できます。ただし、MPS は、インテンション言語の側面からのみインテンションを収集します。インテンションを MPS インテンションサブシステムで使用する場合は、言語のインテンションアスペクトに格納する必要があります。

関連ページ:

型システムのデバッグ

型システムをデバッグするために、MPS は型システムトレースを提供します - それは型システムエンジンの中で起こる評価プロセスへのインサイトをあなたに与える統合された視覚的なツールです。自分で試してみる:型システムを簡単に試すことができるように、専用のサンプル言語を用意しました。MPS にバンドルされている式サンプルプロジェクトを開きます。これは、ユーザーホームフォルダー内のサンプルプロジェクトの中で使用可能になります。サンプル言語実験する言語は、いくつかの型、4 つの算術演算(+、-、*、/...

データフロー

言語のデータフローの側面では、到達不能なステートメントの検索、未使用の代入の検出、変数が読み込まれる前に初期化されていない可能性があるかどうかの確認などを行うことができます。また、「抽出メソッド」リファクタリングなど、いくつかのコード変換を実行することもできます。データフロー分析のほとんどのユーザーは、その内部作業の詳細には関心がありませんが、必要な結果を得ることには関心があります。彼らはどのステートメントに到達できないのか、それが初期化される前に何を読むことができるのかを知りたがっています。こ...