エディター言語生成 API
エディター言語は多くの MPS ユーザによって拡張されることになっているため、エディター言語用のジェネレーターを、使いやすいように設計しました - わかりやすいテンプレート、人間が読めるコード、実行時よりも生成時のメタ情報の使用 - 時間。新しいセルタイプを提供するために、いずれかの言語でエディターの言語を拡張している場合は、このドキュメントが役立ちます。
API: EditorCell 契約
EditorCell.setBig()/.getBig() メソッドの契約がわずかに変更されました。詳細については、javadoc を参照してください。
API: EditorCellFactory は UpdateSession 内でのみ利用可能になりました
EditorCellFactory インスタンスを現在の UpdateSession によって制御するようにしました。同時に、EditorCellFactory 実装内にいくつかのキャッシュを配置し、状況によってはエディター構築プロセスを高速化します。EditorContext.getCellFactory() メソッドは非推奨になり、次のリリースで削除される予定です。
言語ランタイム: AbstractEditorBuilder
AbstractEditorBuilder ランタイムクラスが導入され、セルファクトリメソッドを含むすべてのクラスの共通のスーパークラスとして使用する必要があります。このクラスは、一般的なユーティリティメソッドを実装し、次のようなエディターセル作成プロセスの一般的なコンテキストパラメーターへのアクセスを提供します。
editorContext
ノード
CellFactory
UpdateSession
AbstractEditorBuilder は、セル作成プロセスのコンテキストをキャプチャーし、このコンテキスト内で結果として生じるセルファクトリメソッドを実行するために使用されます。
生成プログラム: EditorBuilder クラス
AbstractEditorBuilder クラスの個別のサブクラスが、使用可能な各エディター宣言階層のルートクラスとして生成されます。
ConceptEditorDeclaration.cellModel
ConceptEditorDeclaration.inspectedCellModel
EditorComponentDeclaration
InlineEditorComponent
MPS エディタージェネレーターは引き続きクラスを作成し、ConceptEditor と ConceptEditorComponent を実装します。これらのクラスは、以前はセルファクトリメソッドのコンテナーとして使用されていました。MPS の新しいバージョンでは、これらのクラスは、コンテキストヒント情報へのアクセスを提供し、実際の EditorBuilder をインスタンス化する記述子として使用されます。記述子クラスは、EditorCellFactory 実装によってキャッシュされる場合があります。
セルビルダーで利用可能なコンテキストパラメーター
AbstractEditorBuilder サブクラスの一部として生成されたコードは、AbstractEditorBuilder クラスの既存のメソッドを使用してコンテキストパラメーターにアクセスできます。それに加えて、利用可能なすべてのメタ情報は、AbstractEditorBuilder のメソッドシグネチャーで利用可能なものよりも具体的な型のプライベートフィールドを生成するために使用されます。今のところ、AbstractEditorBuilder の各サブクラスはプライベート node <TheConcept> myNode フィールドを保持します。ここで、TheConcept はこの AbstractEditorBuilder に関連付けられた実際の概念です。つまり、セルファクトリメソッドは、コンテキストノードへの型付きアクセスを取得し、s-model 言語を使用してコンテキストノードから利用可能なプロパティ、リンク、その他の情報に直接アクセスするために、このようなプライベートフィールドを使用できます。
CellFactoryContextClass
CellFactoryContextClass は、テンプレートに必要なコンテキストを提供する便利なユーティリティクラスであり、生成された AbstractEditorBuilder サブクラスの 1 つに含まれるコードを生成します。このクラスをコンテキストクラステンプレートとして使用することにより、作成者は使用可能なすべてのメソッドとフィールドを自動的に取得し、コード生成環境は MPS プラットフォームでサポートされるため、エディターテンプレートごとに再構築する必要がなくなります。同時に、CellFactoryContextClass は、テンプレートをハイライトするマーカーインターフェースとして使用できます。これにより、EditorBuilder の 1 つのコードが生成され、そのようなコードを見つけて将来サポートするプロセスが簡素化されます。
GenericCellCreationContext
GenericCellCreationContext インターフェースは、EditorBuilders の一部として、またはセル作成 (エディター更新) プロセスの一部として実行される別のクラスから呼び出されるコードで常に使用できる、コンテキスト情報の限定されたサブセットを提供します。テンプレート作成者が EditorBuilders 生成プロセスやその他の場所で同じテンプレートを再利用する場合は、このインターフェースを CellFactoryContextClass の代わりにテンプレートコンテキストとして使用する必要があります。例: EditorBuilders 内または一部のスタイルクラス内で生成されるクエリメソッド。
createCell() メソッドの新しいシグネチャー
以前のバージョンの MPS では、セルファクトリメソッドは常に、セル作成のコンテキストを指定する 2 つの追加パラメーター EditorContext と node <> を使用して生成されていました。今後、これらのパラメーターを指定する必要はありません。生成されたコードは、含まれている EditorBuilder クラスからメソッドを呼び出すことにより、常にこの情報(およびその他のコンテキスト情報)にアクセスできます。新しいエディタージェネレーターは、パラメーターなしでセルファクトリメソッドを生成します。
新しい createCell() メソッド用の自動移行スクリプト
既存のジェネレーターとの互換性のために、使用可能なテンプレートにパッチを適用し、フォールバックとして古いメソッド(2 つの追加パラメーターを含む)に委譲する新しい createCell() メソッドを導入する移行スクリプトを提供します。最初にこのスクリプトを実行してから、すべての変更を確認し、変更されたジェネレーターが引き続き正しく機能するかどうかを確認することをお勧めします。提供されている自動移行は、最も頻繁な状況のみをサポートするため、特定のケースでは、ジェネレーターを再び機能させるために手動で変更する必要がある場合があります。互換性メソッドを生成するテンプレートは、template_cellFactoryCompatibility と呼ばれます。後でジェネレーターを変更して新しい createCellMethods を 直接生成する場合は、template_cellFactoryCompatibility の呼び出しをすべて削除する必要があります。現在の MPS リリースのスコープ内でレガシー createCell(...)メソッドを生成するすべての既存のジェネレーターとパッチの廃止されたテンプレートを確認することをお勧めします。次のバージョンで互換性テンプレートを削除する予定です。
マッピングラベル
いくつかのマッピングラベルがエディタージェネレーター(MAPPING_main)に導入され、コード生成を簡素化するために使用できます。
cellFactory.class.concept
cellFactory.class.concept:ConceptEditorDeclaration-> ClassConcept
このラベルは、ConceptEditorDeclaration.cellModel の EditorBuilder 用に生成された java クラスを公開します
cellFactory.class.inspector
cellFactory.class.inspector:ConceptEditorDeclaration-> ClassConcept
このラベルは、ConceptEditorDeclaration.inspectedCellModel の EditorBuilder 用に生成された java クラスを公開します。
cellFactory.class.component
cellFactory.class.component:EditorComponentDeclaration-> ClassConcept
このラベルは、EditorComponentDeclaration の EditorBuilder 用に生成された java クラスを公開します。
cellFactory.constructor
cellFactory.constructor : EditorCellModel-> ConstructorDeclaration
生成された EditorBuilder クラスのコンストラクターをマークするために使用されます。
cellFactory.factoryMethod
cellFactory.factoryMethod : EditorCellModel-> InstanceMethodDeclaration
新しい cellFactory メソッドを含む廃止された cellFactoryMethod ラベルの置き換え。既存のテンプレートを変更して新しい cellFactory メソッドを生成する場合は、cellFactoryMethod の代わりにこのラベルを使用する必要があります。
generated.constructor
generated.constructor : <入力概念なし>-> ConstructorDeclaration
このラベルは、既存の generateClass 1 と一緒に使用して、生成されたコンストラクターインスタンスをマークできます。このラベルは、generateClass マッピングから返される node <ClassConcept> 内の最初のコンストラクターインスタンスを見つけるための醜いコードを回避するために使用できます。
CellLayoutConstructor スイッチが導入されました
このテンプレートスイッチは、コレクションセルの作成中に適切なセルレイアウトをインスタンス化するために使用されます。EditorCell_Collection クラス内で以前に使用されていた静的 createxxx() メソッドは非推奨になり、削除されます。
RefCellCellProvider サブクラス用の新しいジェネレーター
CellModel_RefCell のジェネレーターが変更されます。RefCellCellProvider 用に新しく生成された匿名内部クラスは、RefCellCellProvider.createRefCell() ランタイムメソッド内にあるロジックを使用しません。生成時に利用可能なメタ情報は、このメソッドの完全なコンテンツを作成するために使用されます。ジェネレーター内で RefCellCellProvider のサブクラスを生成する場合は、そのような場所を確認し、テンプレートを MPS のテンプレートと位置合わせすることを検討する必要があります。
InlineCellProvider は EditorBuilder サブクラスに置き換えられました
InlineCellProvider は MPS ジェネレーターによって使用されなくなりました。MPS は、代わりに、AbstractEditorBuilder の生成されたサブクラスを使用します。それでも、ライフサイクルをより透過的にするために、InlineCellProvider 内のいくつかの制約を変更しました。まだ使用している場合は、Javadoc で InlineCellProvider を確認することをお勧めします。
エディタースタイルジェネレーター
StyleSheet および StyleKeyPack インスタンス内のエントリごとに、個別の静的内部クラスが生成されます。提供されている applyStyleClass テンプレートを使用して、新しいスタイルクラスを適切にインスタンス化して呼び出すことができます。レガシー静的。applyxxx() メソッドは、次のリリースで削除される必要があります。
StyleClassItem 制約の修正
StyleClassItem の概念から canBeChild 制約を削除しました。これらの制約は、StyleClassItem を含むノードの canBeParent 制約に置き換えられました。これに加えて、isApplicableToCell(node <EditorCellModel> cellModel)動作メソッドは非推奨になり、使用されなくなりました。代わりに、次の方法を導入しました。
isApplicableToCellConcept()
isApplicableForLayout()
isApplicableInLayout()
言語でカスタム StyleClassItem を実装している場合は、StyleClassItem 動作メソッドの javadoc を確認することをお勧めします。
関連ページ:
ダイアグラム作成エディター
MPS のダイアグラム表化サポートは言語デザイナーが彼らの概念にグラフィカルエディターを提供することを可能にします。ダイアグラムは通常、ボックスで表されるブロックと、ボックスを結ぶ線で表されるコネクターで構成されています。ブロックとコネクターはどちらも、基礎となるモデルからのノードを視覚化したものです。ポート(オプション)は、ブロックの形状上の事前定義された場所であり、コネクターを接続できます。MPS では、入力ポートと出力ポートの 2 種類のポートを使用できます。任意選択で、利用可能なブロック...
制約
構造言語は、言語構造に対する高度な制約を表現するには不十分な場合があります。制約アスペクトは、そのような追加の制約を定義する方法を提供します。デフォルトの具体的な概念:抽象概念の場合、制約アスペクトを使用して、抽象概念のノードを作成する必要がある場合に代わりにどの概念を使用するかを示すことができます。例: 子コレクションが AbstractCommands を保持することになっていて、ユーザーが Enter キーを押して新しい子をコレクションに挿入すると、EmptyLine コンセプトのノードが...