MPS 2023.2 の新機能

MPS 2023.2 では BaseLanguage のラムダ生成、JUnit 5 のサポート、型システムの推論ルールのオーバーライドなどが改善されています。

JUnit 5 のサポート

JUnit 5

MPS のテストが JUnit 5 テストとして生成されるようになりました。 JUnit 4 のサポートも引き続き限定的に提供されています。

  • 適切にアノテーションが付けられた Java クラスをテストとして実行可能です。
  • MPS テストの実行オプションには、プロセス内とスポーンの両方があります。
  • 既存のテストルートは、以下の JUP Jupiter API アノテーションで生成されます。
    • BTestCase
    • NodeTestCase
    • EditorTestCase
    • MigrationTestCase
    • PatternTest
    • GeneratorTest

JUnit 5 でモジュールテストを起動する Ant タスク

以下の要素をサポートする新しい launchtests Ant タスクを使用できます。

  • ライブラリ
  • マクロ
  • プラグイン
  • testmodules

JUnit 3 を除くすべてのテストアーティファクトの実行をサポートし、テスト構成ビルド部分の新しいターゲットとして機能します。

MPS からのテストの実行

  • 適切にアノテーションが付けられた Java クラスをテストとして実行できます。
  • JUnit 4 には限定的なサポートのみが提供されるようになりました。
  • プロセス内とスポーンの両方の実行が可能です。

テストプラットフォーム API

この API を使用すると、MPS で使用できるテストの種類を拡張し、テストセッションにリスナーを実装できます。

MPS テストプラットフォーム API には、以下の jetbrains.mps.baseLanguage.unitTest.platform のクラスが含まれます。

TestPlatform MPS テストプラットフォームの API を定義します。
TestDescriptor MPS テストプラットフォームの単一のテストを表します。
TestSource SNode などのテストソースを表します。
TestSession テストセッションを表します。
TestDiscoveryParticipant テスト検出プロセスの関連付けを有効にします。
TestSessionListener テストセッションから通知を受け取れるようにします。

カスタムテストエンジンの実験的サポート

JUnit 5 ではカスタムエンジンで実行されるテストの実行がサポートされるようになりました。 このようなエンジンのよくある例には、プロパティベースの jqwik テストフレームワークがあります。

型システムルールのオーバーライドのサポート強化
お客様からのご提案

型システムのオーバーライド

スーパーコンセプトで定義されているルールを型システムルールでオーバーライドできる機能が最近追加されました。 これは、サブコンセプトがスーパーコンセプトを含んでいる言語を拡張する言語で定義されている場合に可能です。 この機能は推論ルールでサポートされています。

BaseLangugage 関連の改善

MPS の前のアップデートでは、メソッド参照と Java ラムダへのクロージャの変換のサポートが強化されました。 このバージョンでは多数の小規模な機能とバグ修正により、このサポートの範囲を拡張しています。

ラムダ

クロージャをラムダとして生成

コレクション演算で使用されるクロージャが Java のラムダとして生成されるようになりました。これは当初、Java インターフェースを使用する通常の関数呼び出しでのみ可能となっていました。 下位互換性を維持するため、以下の場合は引き続きクロージャは匿名クラスとして生成されます。

  • 変数名が外部変数と競合する場合。名前変更を提案する警告が表示されるようになりました。
  • ターゲット Java バージョンが 8 以下である場合。
  • raw 型が使用されている場合。raw 型は Java ラムダではうまく機能しません。

この対応により、全体的に生成されるコードの品質が改善されます。ラムダは可読性が高いだけでなく、誤って生成される可能性が比較的低いためです。 一方、MPS では raw 型を使った機能が許可されていますが、Java ではそのようなインスタンスの検出がまだ困難であるため、許可されていません。 そのため、raw 型が使用されている場所では生成に失敗する可能性があります。

クロージャパラメーター

クロージャパラメーター

従来のクロージャパラメーターには ~param<type> paramparamvar param といったさまざまな形式がありました。 型を省略してパラメーターを追加するのは面倒でした。 このリリースでは ~param 形式の使用を廃止し、単純な型なしのパラメーターを使用するようにしました。現在は、この形式がデフォルトで挿入されるようになっています。 また、クロージャが関数呼び出しで挿入される場合、必要な関数の型のデフォルトパラメーターが挿入されます。 最後になりますが、ソースコードで型が省略されている場合は生成されるパラメーターでも型が省略されるようになります。これにより、コンパイルの品質がさらに向上します。

ストリーム

ストリームの相互運用性

MPS ではシーケンスが広範に使用されていますが、Java ストリームを使用する必要がある場合もあります。 このアップデートでは推論を改善することで、Stream API が使用する複合メソッドに関連する型システムの問題を緩和しています。 ストリームとシーケンスをブリッジする以下の 2 つの演算を追加しました。

  • <stream>.asSequence: シーケンスをストリームに変換します。
  • <sequence>.toStream(parallel=…): 上記と逆の操作を行います。

これにより、使用する API を選択できるだけでなく、シーケンスのメリット(繰り返しが可能)とストリームのメリット(各種のコレクター、より多くの演算子)を組み合わせることが可能です。

コレクション関連の改善

BaseLanguage コンストラクターにはすでにダイアモンド演算子(new ArrayList<>())が導入されていましたが、コレクションクリエーターはこの改善の対象外となっていました。 このアップデートでは以下のように新しいコレクションから型パラメーターを省略し、コーディングプロセスを単純化できるようになりました。

  • 初期値から推論される型: var myList = new arraylist<> {myInitialValue}
  • 変数宣言から推論される型: map<int, string> myMap = new hashmap<>

また、コレクションでの変性のサポートが改善されました。 たとえば、? extends Number 表記を割り当てられなくなっています。 ただし、このような境界型が有効な場合に型システムがその使用についてエラーを発しなくなりました。 sequence<> 型はデフォルトで共変性のままとなります。その型ではない要素のシーケンスには挿入できないため、危険な結果をもたらさないからです。 これにより、従来は危険なコードが検出されなかった場所で新たな型チェックの問題が発生する可能性があります。 このような問題は、境界型 list<? extends node<>> またはシーケンス型 sequence<node<>> のいずれかで解決可能です。

構成の設定

Make の無効化

Disable Make On Startup(起動時に Make を無効化する)

Settings(設定)| Project Settings(プロジェクト設定)| Make に新しい Disable Make On Startup(起動時に Make を無効化する)オプションが追加されました。 このオプションが選択されている場合、MPS は起動時にプロジェクトのすべてのモジュールを作成しません。 これは、最初の作成プロセスに時間がかかりすぎる場合や、プロジェクトが正常に作成される前に手動構成が必要なために作成プロセスが失敗する可能性がある場合に起動速度を速めたい場合に役立ちます。

ライブラリの編集

モジュールの Java プロパティに含まれるライブラリとソースのパスの編集

モジュールプロパティダイアログの Java タブに新しい Edit(編集)オプションが追加されました。 見つけにくいですが、非常に便利なオプションです。 モジュールの jar ライブラリのセットを変更したい場合、この新しいオプションを使用すればエントリを削除して追加するという面倒な手順が不要になります。

その他

TODO コメント

カスタムコメントの TODO 機能

IGenericComment 概念を拡張すると、カスタム言語でコメントを表す概念を MPS の TODO 機能に関連付けることができます。 TODO を表すコメントは TODO Finder によって収集され、TODO Viewer にリストされ、コミットプロセス中にチェックされます。

言語アスペクト: Create New(新規作成)アクションの管理

アスペクトモデルでのインスタンス作成については、MPS はこれまで名前またはフラグで順序付けされたルート化可能な非抽象的な概念を伴う一般的なロジックに従ってきました。 このバージョンからはオプションの構成をアスペクト宣言と共に指定できるようになったため、言語デザイナーがユーザーにどの概念を提示するかだけでなく、そのグループ化と順番付けを制御できるようになりました。

“Please re-export dependency…”(依存関係を再エクスポートしてください...)チェックの廃止

混乱を招くこの警告は、ClassConcept が別のモジュールの ClassConcept を拡張したか、その使用箇所が公開されている場合に表示されていました。 バージョン 2023.2 より古い MPS はモジュール記述子に指定されたモジュール依存関係を頼りに依存関係グラフを構築していました。 このバージョンの MPS は実際のジェネレーターとモデルの変換に関わる言語に基づいて依存関係情報を作成するようになっているため、このような依存関係を明示的に指定する必要がなくなり、結果的にチェックする必要がなくなりました。

お客様からの資金援助により過去のリリースから移植された機能

コミュニティには物事を共有できるという有益な特徴があります。 以下の機能は商用 MPS ユーザーから資金援助を受け、そのリクエストに基づいて実装されたものです。 誰もがこれらの便利な追加機能をフル活用できるようになりました。

並列モデルチェッカー

モデルチェッカーが並列ハードウェアを効率よく利用できるようになりました。これにより、モデルチェックのプロセスが高速化されました。 Settings(設定)| Tools(ツール)| Model Checker(モデルチェッカー)の設定に応じて、このプロセスを起動する際に複数のスレッドを生成することができます。

File-per-root(ルートごとのファイル)永続性のパフォーマンス改善

FilePerRootDataSource.getStreamByName() メソッドが最適化され、モデルデータを読み込む際のパフォーマンスが改善されました。 File-per-root(ルートごとのファイル)永続性を使用して大きめのモデルを保存すると、違いがはっきりと分かります。

検索ダイアログ

Find text in project(プロジェクト内のテキスト検索)のサポート改善

既存の Find text in project(プロジェクト内でテキストを検索)アクションが改善され、名前付きノードの参照を検索して追加の関連結果も表示するようになりました。 検索ダイアログで結果を直接確認できるプレビューパネルも追加されています。 HTML コンテンツを含むテキストが旧バージョンのような HTML ではなく、プレーンテキストで表示されるようになりました。

Ant タスクでの依存関係の移行の省略

MPS が提供する Ant タスクを使ってプロジェクトを移行する際に依存関係が適切に移行されない場合があります。 このような場合でもプロジェクトの移行を続行するためのフラグを追加しました。 移行されない依存関係が検出された際に移行プロセスを停止する動作はデフォルトのままです。 このフラグを使用するには、migrate Ant タスクに haltOnDependencyError="false" を追加してください。

プラットフォーム関連の更新

IDE 全体のズーム機能

バージョン 2023.2 では IDE 全体を拡大・縮小し、すべての UI 要素のサイズをまとめて増減できるようになりました。 メインメニューから View(表示)| Appearance(外観)を選択し、IDE の表示倍率を調整します。 また、Settings(設定)/Preferences(環境設定)| Keymap(キーマップ)| Main Menu(メインメニュー)| View(表示)| Appearance(外観)で、これらのアクションを呼び出すためのカスタムショートカットを割り当てることが可能です。

新しい Remember size for each tool window(各ツールウィンドウのサイズを記憶する)設定

MPS 2023.2 では、サイドツールウィンドウの幅を統一するか、レイアウトのカスタマイズに合わせてサイズを自由に調整する機能を保持する新しいレイアウトオプションを導入しました。 新しい Remember size for each tool window(各ツールウィンドウのサイズを記憶する)チェックボックスは、Settings(設定)/ Preferences(環境設定)| Appearance & Behavior(外観と動作)| Appearance(外観)| Tool Windows(ツールウィンドウ)にあります。 新しい UI と以前の UI でこの設定がどのように動作するかについては、こちらのブログ記事をご覧ください。

インスペクションの説明に構文ハイライトを実装

インスペクションの説明に構文ハイライトを実装

Settings(設定)/ Preferences(環境設定)| Editor(エディター)| Inspections(インスペクション)のコードサンプルで構文がハイライトされるようになりました。インスペクションのトリガー元を把握し、そのインスペクションを有効または無効にするかを決めやすくなっています。

Markdown ファイルの Fill Paragraph(段落の整形)

Markdown ファイルの Fill Paragraph(段落の整形)

Markdown ファイルで Fill Paragraph(段落の整形)エディターアクションがサポートされ、長いテキストを長さが同じ複数の行に分割できるようになりました。 これを行うには、編集する段落内にキャレットを置いて Find Action(アクションを検索)(Ctrl+Shift+A)を使って Fill Paragraph(段落の整形)コマンドを検索します。

Branches(ブランチ)ポップアップの改善

Branches(ブランチ)ポップアップの改善

Branches(ブランチ)ポップアップのユーザビリティを改善しました。 たとえば、ブランチが展開可能なリストにグループ化されて保管されるようになり、ブランチ間の移動操作がより簡単になっています。

Create New Branch(新規ブランチの作成)ポップアップの自動補完

Create New Branch(新規ブランチの作成)ポップアップの自動補完

MPS 2023.2 では、Create New Branch(新規プロジェクトの作成)ポップアップに自動補完が実装されています。 新しいブランチの名前を入力し始めると、IDE が既存のローカルブランチの名前を基に関連性のある接頭辞を提案します。

移行ガイド

各メジャーリリースでは、旧バージョンの MPS から円滑に移行するための手順が用意されています。 必要な手順をよく確認してください。