Das ist neu in MPS 2023.2

MPS 2023.2 bietet Verbesserungen für die Generierung von BaseLanguage-Lambdas, Unterstützung für JUnit 5, überschreibbare Typsystem-Inferenzregeln und mehr.

Unterstützung für JUnit 5

JUnit 5

Tests in MPS werden jetzt als JUnit-5-Tests generiert. Eine begrenzte Unterstützung für JUnit 4 ist weiterhin verfügbar.

  • Jede entsprechend annotierte Java-Klasse kann als Test ausgeführt werden.
  • Beide Optionen für die Ausführung von MPS-Tests – prozessintern und gespawnt – sind verfügbar.
  • Existierende Test-Roots werden mit JUP-Jupiter-API-Annotationen generiert:
    • BTestCase
    • NodeTestCase
    • EditorTestCase
    • MigrationTestCase
    • PatternTest
    • GeneratorTest

Ant-Task zum Starten von Modultests mit JUnit 5

Ein neuer Ant-Task launchtests unterstützt die folgenden Elemente:

  • bibliothek
  • Makro
  • Plugin
  • testmodules

Der Task unterstützt die Ausführung aller Testartefakte mit Ausnahme von JUnit 3 und dient als neues Ziel für die Testkonfiguration.

Ausführen von Tests aus MPS

  • Jede entsprechend annotierte Java-Klasse kann als Test ausgeführt werden.
  • Für JUnit 4 wird nur noch begrenzte Unterstützung bereitgestellt.
  • Die Ausführung ist sowohl prozessintern als auch in einem separaten Prozess (gespawnt) möglich.

Testplattform-API

Mit dieser API können Sie die in MPS verfügbaren Testtypen erweitern und Listener für Testsitzungen implementieren.

Die MPS-Testplattform-API besteht aus Klassen in jetbrains.mps.baseLanguage.unitTest.platform:

TestPlatform Definiert die API für die MPS-Testplattform.
TestDescriptor Repräsentiert einen einzelnen Test auf der MPS-Testplattform.
TestSource Repräsentiert die Testquelle, z. B. einen SNode.
TestSession Repräsentiert eine Testsitzung.
TestDiscoveryParticipant Ermöglicht den Beitritt zum Testerkennungsprozess.
TestSessionListener Ermöglicht den Empfang von Benachrichtigungen aus der Testsitzung.

Experimentelle Unterstützung für benutzerspezifische Testengines

JUnit 5 bietet unter anderem Unterstützung für Tests, die mit einer benutzerdefinierten Engine ausgeführt werden. Eine häufig verwendete Engine ist das eigenschaftsbasierte Testframework jqwik.

Verbesserte Unterstützung für das Überschreiben von Typsystemregeln
Von Kunden gewünscht

Typsystem-Überschreibungen

Wir haben vor kurzem die Möglichkeit hinzugefügt, Typsystemregeln, die für übergeordnete Konzepte definiert wurden, zu überschreiben. Möglich ist dies, wenn das Unterkonzept in einer Sprache definiert ist, die die Sprache des übergeordneten Konzepts erweitert. Die Funktion wird für Inference-Regeln unterstützt.

BaseLanguage-Verbesserungen

In einem früheren Update erhielt MPS eine verbesserte Unterstützung für Methodenreferenzen und die Umwandlung von Closures in Java-Lambdas. Wir haben diese Unterstützung durch zahlreiche kleinere Ergänzungen und Bugfixes erweitert.

Lambdas

Generierung von Closures als Lambdas

Closures, die in Collection-Operationen verwendet werden, werden jetzt als Java-Lambdas generiert. Dies war ursprünglich nur für reguläre Funktionsaufrufe verfügbar, die Java-Schnittstellen verwendeten. Um die Abwärtskompatibilität zu wahren, werden Closures in bestimmten Fällen weiterhin als anonyme Klasse generiert:

  • Wenn ein Variablenname mit einer externen Variablen kollidiert – eine Warnung wird jetzt angezeigt, die vorschlägt, die Variable umzubenennen.
  • Wenn die Java-Zielversion 8 oder niedriger ist.
  • Wenn Raw-Typen verwendet werden – diese vertragen sich nicht gut mit Java-Lambdas.

Dies führt im Allgemeinen zu einer höheren Qualität des generierten Codes, denn Lambdas sind nicht nur leichter lesbar, sondern weisen auch eine geringere Fehlerwahrscheinlichkeit bei der Generierung auf. Andererseits erlaubt MPS Features mit Raw-Typen, die in Java nicht zulässig wären, da die Erkennung solcher Fälle immer noch schwierig ist. Bei der Verwendung von Raw-Typen kann daher die Generierung fehlschlagen.

Closure-Parameter

Closure-Parameter

Closure-Parameter konnten früher verschiedene Formen annehmen: ~param, <type> param, param und var param. Das Hinzufügen von Parametern ohne Typangabe war umständlich. In dieser Version haben wir die Form ~param als veraltet gekennzeichnet, zugunsten des einfachen typenlosen Parameters, der nun standardmäßig eingefügt wird. Wenn außerdem eine Closure in einen Funktionsaufruf eingefügt wird, werden Standardparameter vom erwarteten Funktionstyp eingefügt. Und wenn ihr Typ im Quellcode weggelassen wird, werden die generierten Parameter nun ohne Typ angegeben, wodurch die Kompilierungsqualität weiter verbessert wird.

Streams

Stream-Interoperabilität

In MPS werden vornehmlich Sequenzen verwendet, aber es gibt auch Fälle, in denen Java-Streams benötigt werden. In diesem Update wurde die Typinferenz verbessert, um Typsystem-Probleme im Zusammenhang mit komplexen Methoden, die die Stream-API verwenden kann, zu vermeiden. Wir haben zwei Operationen hinzugefügt, um zwischen Streams und Sequenzen zu konvertieren:

  • <stream>.asSequence konvertiert eine Sequenz in einen Stream.
  • <sequence>.toStream(parallel=...) bewirkt das Gegenteil.

So können Sie nicht nur auswählen, welche API verwendet werden soll, sondern auch die Vorteile von Sequenzen (Wiederholbarkeit) mit denen von Streams (verschiedene Kollektoren, mehr Operatoren) kombinieren.

Collection-Verbesserungen

Der Diamant-Operator (new ArrayList<>()) für BaseLanguage-Konstruktoren wurde bereits früher eingeführt, aber die Erstellung von Collections war von dieser Verbesserung ausgeschlossen. Ab diesem Update können Sie die Typparameter bei neuen Collections weglassen und so einfacheren Code schreiben:

  • Typinferenz aus Ursprungswerten: var myList = new arraylist<> {myInitialValue}
  • Typinferenz aus Variablendeklaration: map<int, string> myMap = new hashmap<>

Darüber hinaus haben wir die Unterstützung von Varianz in Collections verbessert. Zum Beispiel ist es nicht mehr möglich, die Notation ? extends Number zuzuweisen. Das Typsystem hingegen bemängelt nicht mehr die Verwendung solcher begrenzter Typen, wenn sie gültig sind. Der Typ sequence<> bleibt standardmäßig kovariant, denn dies hat keine unsicheren Konsequenzen, da Sie ihn nicht in eine Sequenz von Elementen einfügen können, die nicht mit seinem Typ übereinstimmen. Dies kann zu neuen Problemen bei der Typprüfung in Fällen führen, in denen unsicherer Code zuvor unerkannt blieb. Diese können entweder mit begrenzten Typen – list<? extends node<>> – oder mit Sequenztypen – sequence<node<>> – gelöst werden.

Konfigurations­einstellungen

Deaktivierung von Make

Deaktivieren von Make beim Start

Wir haben eine neue Option Disable Make On Startup unter Settings | Project Settings | Make hinzugefügt. Wenn diese Option aktiviert ist, führt MPS beim Start nicht make für alle Module des Projekts aus. Dadurch können Sie die Startzeit verkürzen, wenn der Make-Prozess zu lange dauert oder mit hoher Wahrscheinlichkeit fehlschlägt, da für eine erfolgreiche Ausführung eine manuelle Konfiguration benötigt wird.

Bearbeitung von Bibliothekspfaden

Bearbeiten von Bibliotheks- und Quellpfaden in den Java-Eigenschaften von Modulen

Auf dem Java-Tab des Moduleigenschaften-Dialogs wurde eine neue Option Edit hinzugefügt. Sie ist sehr praktisch, wenn auch nicht ganz einfach zu finden. Wenn Sie die Zusammensetzung der Jar-Bibliotheken Ihres Moduls ändern müssen, verwenden Sie einfach diese neue Option, um die Einträge nicht mühsam einzeln entfernen und hinzufügen zu müssen.

Sonstiges

TODO-Kommentar

TODO für benutzerdefinierte Kommentare

Durch die Erweiterung des Konzepts IGenericComment können Konzepte, die Kommentare in benutzerdefinierten Sprachen darstellen, die TODO-Funktionalität von MPS nutzen. TODO-Kommentare werden vom TODO Finder gesammelt, im TODO Viewer aufgelistet und beim Commit-Prozess geprüft.

Sprachaspekte: Create New-Aktionen verwalten

Bei der Erstellung von Instanzen in einem Aspektmodell hat MPS bisher eine allgemeine Logik befolgt, die rootfähige, nicht-abstrakte Konzepte verwendete, die nach Namen oder Flags geordnet waren. Bei einer Deklaration eines Aspekts können jetzt optionale Konfigurationseinstellungen angegeben werden, sodass Sprachdesigner steuern können, welche Konzepte den Benutzer*innen präsentiert und wie sie gruppiert und geordnet werden.

Prüfung „Please re-export dependency…“ obsolet

Diese verwirrende Warnung wurde früher angezeigt, wenn in einem ClassConcept ein ClassConcept aus einem anderen Modul erweitert oder anderweitig zugänglich gemacht wurde. Vor Version 2023.2 verließ sich MPS beim Anlegen des Abhängigkeitsdiagramms auf die in den Moduldeskriptoren angegebenen Modulabhängigkeiten. Da MPS die Abhängigkeitsinformationen jetzt auf Grundlage der tatsächlichen Generatoren und Sprachen erstellt, die an der Transformation eines Modells beteiligt sind, müssen Sie diese Abhängigkeiten nicht mehr explizit angeben, sodass die Prüfung nicht mehr erforderlich ist.

Aus älteren Releases portierte kundenspezifische Funktionen

Teilen ist in jeder Gemeinschaft sinnvoll. Die folgenden Funktionen wurden auf Anfrage und mit finanzieller Unterstützung von Unternehmen entwickelt, die MPS kommerziell einsetzen. Jetzt stehen diese nützlichen Erweiterungen auch Ihnen zur Verfügung.

Parallelisierte Modellprüfung

Durch die effektive Nutzung paralleler Hardware kann der Prozess der Modellprüfung jetzt beschleunigt werden. Je nach den Einstellungen in Settings | Tools | Model Checker können beim Starten des Prozesses mehrere Threads erzeugt werden.

Verbesserte Performance für File-per-Root-Persistenz

Die Methode FilePerRootDataSource.getStreamByName() wurde optimiert, um die Leistung beim Laden von Modelldaten zu verbessern. Wenn Sie größere Modelle mittels File-per-Root-Persistenz speichern, wird diese Änderung die Leistung spürbar verbessern.

Suchdialog

Verbesserte projektinterne Textsuche

Die Aktion Find text in project wurde verbessert. Sie sucht jetzt auch nach Verweisen auf benannte Knoten und liefert so zusätzliche relevante Ergebnisse. In einem neuen Vorschaubereich können Sie sich die Ergebnisse direkt im Suchdialog ansehen. Text mit HTML-Inhalten wird jetzt in den Ergebnissen in reiner Textform und nicht wie in früheren Versionen als HTML dargestellt.

Migration von Abhängigkeiten in Ant-Tasks überspringen

Bei der Migration eines Projekts mit von MPS bereitgestellten Ant-Tasks kann es vorkommen, dass Abhängigkeiten nicht korrekt migriert werden. Wir haben ein Flag hinzugefügt, um die Migration des Projekts auch in solchen Fällen fortzusetzen. Standardmäßig wird jedoch der Migrationsprozess weiterhin angehalten, sobald eine nicht migrierte Abhängigkeit erkannt wird. Um dieses Flag zu verwenden, fügen Sie haltOnDependencyError="false" zum Ant-Task migrate hinzu.

Plattform-Updates

Vollständiger IDE-Zoom

Ab v2023.2 können Sie in die IDE hinein- und herauszoomen und dabei alle Bedienelemente gleichzeitig verkleinern oder vergrößern. Wählen Sie dazu im Hauptmenü View | Appearance und passen Sie die IDE-Skalierung nach Wunsch an. Außerdem können Sie unter Settings/Preferences | Keymap | Main Menu | View | Appearance benutzerdefinierte Tastenkürzel für diese Aktionen festlegen.

Neue Einstellung Remember size for each tool window

In MPS 2023.2 haben wir eine neue Layout-Option eingeführt, mit der Sie die Breite der seitlichen Toolfenster vereinheitlichen oder aber ihre Größe individuell anpassen können. Das neue Kontrollkästchen Remember size for each tool window finden Sie unter Settings/Preferences | Appearance & Behavior | Appearance | Tool Windows. Dieser Blogartikel bietet detailliertere Informationen über die Funktionsweise dieser Einstellung in der neuen und der alten Bedienoberfläche.

Syntaxhervorhebung in Inspektionsbeschreibungen

Syntaxhervorhebung in Inspektionsbeschreibungen

Dank der neuen Syntaxeinfärbung der Codebeispiele in Settings / Preferences | Editor | Inspections lässt sich jetzt einfacher nachvollziehen, was eine Inspektion auslöst und ob sie lieber aktiviert oder deaktiviert werden soll.

Fill Paragraph für Markdown-Dateien

Fill Paragraph für Markdown-Dateien

Mit der Editoraktion Fill Paragraph können Sie jetzt in Markdown-Dateien lange Texte in gleichmäßige Zeilen umbrechen. Setzen Sie dazu die Einfügemarke auf den entsprechenden Absatz und suchen Sie mit Find Action (Strg+Umschalt+A) nach dem Befehl Fill Paragraph.

Verbessertes Branches-Popup

Verbessertes Branches-Popup

Wir haben die Bedienfreundlichkeit des Popup-Fensters Branches verbessert. So ist zum Beispiel die Navigation zwischen den Branches jetzt einfacher, da sie in erweiterbaren Listen gruppiert sind.

Auto-Completion im Popup Create New Branch

Auto-Completion im Popup Create New Branch

MPS 2023.2 unterstützt Sie durch Auto-Completion im Popup Create New BranchBranch. Sobald Sie mit der Eingabe eines Namens für Ihren neuen Branch beginnen, schlägt die IDE anhand der lokalen Branchnamen relevante Präfixe vor.

Migrationsleitfaden

Für jede Hauptversion bieten wir eine Anleitung für die Migration von älteren MPS-Versionen, um einen reibungslosen Umstieg zu gewährleisten. Bitte lesen Sie diese sorgfältig durch.