Das ist neu in MPS 2018.3

BaseLanguage

Symbole für Konzept überschrieben/implementiert

MPS kennzeichnet Konzepte mit einem Symbol als überschrieben/implementiert. Mit Hilfe dieses Symbols können Sie einfach zum Ober- oder Unterkonzept des aktuellen Konzepts navigieren.

Benutzerdefinierte Pakete für BaseLanguage-Klassen

Lange Zeit war der Name eines übergeordneten Modells die einzige Möglichkeit, Java-Pakete generierter Klassen zu verwalten. Mit der neuen Classifier-Eigenschaft „packageName“ können Sie jetzt das Java-Paket einer generierten Klasse verwalten. Diese Eigenschaft ist auch für Root-Klassifizierer verfügbar.

Neue Generierungsmöglichkeiten für BaseLanguage-Erweiterungen

Die BaseLanguage war immer dafür ausgelegt, mit vielen Erweiterungen angepasst werden zu können. Bei manchen Erweiterungen kann es jedoch schwierig sein, einen geeigneten Generator zu implementieren. Jetzt bietet die BaseLanguage mehrere neue Generierungszeit-Konzepte, um das Schreiben der Generatoren für die Erweiterungen zu vereinfachen.

Generierung von Lvalue-Ausdrücken

Lvalue-Ausdrücke werden zu Variablen ausgewertet, die ausgelesen oder beschrieben werden können. In manchen Fällen ist das Generieren eines L-Wert-Ausdrucks schwierig, da es von der Art des Kontexts abhängen kann, in dem der Ausdruck verwendet wird. Jetzt kann das neue Generierungszeit-Konzept „generic lvalue-expression“ verwendet werden, um einen Generator einfacher und kontextunabhängiger zu gestalten.

Glücklicherweise können Sie in der neuen Version einen beliebigen Lvalue-Ausdruck mit dem Ausdruck „@byRef“ einbinden. Der BaseLanguage-Generator wandelt dann den eingebundenen Ausdruck in einen Ausdruck vom Typ „Reference <T>“ um, der Ihnen die get- und set-Operationen über die eingebundene Variable zur Verfügung stellt.

Diese beiden neu eingeführten Generierungszeit-Konzepte werden in diesem Artikel ausführlicher beschrieben.

Transformieren von Lvalues zu Referenzen

Manche Ausdrücke aggregieren andere Lvalue-Ausdrücke, um zusammengesetzte Operationen mit einer Variablen durchzuführen, die aus einem aggregierten Ausdruck erzeugt wird (z. B. Plus-Zuweisung, Inkrementieren oder get-Ausdrücke). Das Einführen neuer Ausdrücke mit einer solchen Semantik war normalerweise nicht möglich, da es schwierig war, einen geeigneten Generator für solche Konstruktionen zu schreiben.

Unterstützung von Default-Methoden in der BaseLanguage

In Version 2018.3 kann MPS die „default“-Methoden in BaseLanguage-Schnittstellen erstellen. Das Schlüsselwort „default“ wird vom DefaultModifier-Konzept implementiert, welches das Modifier-Konzept in der BaseLanguage erweitert. Der DefaultModifier befindet sich in der Sprache jetbrains.mps.baseLanguage.jdk8. Das bedeutet, dass Sie die Sprache jdk8 importieren müssen, um eine „default“-Methode in der Schnittstelle zu erstellen.

Generator

Die Generatorsprache

Das Makro $INCLUDE$ ist veraltet und es gibt eine Migration, um seine Instanzen durch $CALL$ zu ersetzen. Ersteres hat keine Vorlagen mit Argumenten unterstützt und wir haben keinen Grund gesehen, beide Mechanismen zum Aufrufen einer Vorlage beizubehalten.

Das Makro $WEAVE$ und die Weave-Regeln können jetzt Vorlagen mit Argumenten aufrufen. Wenn eine interpretierte Vorlage eine externe Vorlage aus einem „kompilierten“ Generator per Weave einbindet, wird sie nicht weiter interpretiert, der kompilierte Vorlagencode wird jedoch ausgeführt. „Kompilierte“ Vorlagen können nun interpretierte Vorlagen mittels Weave einbinden.

Java-Reflektion wird nicht verwendet, um auf die Auflistung von Abfragen aus einem Vorlagenmodell (auch als QueriesGenerated bezeichnet) zuzugreifen.

UI/UX

MacBook Touch Bar

Der Standardkontext enthält Steuerelemente zum Ausführen, Erstellen und Debuggen der Anwendung, mit denen Sie schnell eine neue „Run/Debug“-Konfiguration auswählen oder erstellen können. Es gibt jetzt eine neue Touch-Bar-Seite zum Anpassen der Aktionen: Preferences | Appearance & Behavior | Menus and Toolbars.

Und ja, eine Erweiterung ist möglich! Fügen Sie einfach alle benötigten Aktionen zu einer speziellen MPS-„InterfaceGroup“ hinzu.

Kontrastreiches Design der Benutzeroberfläche

Wir haben Unterstützung für ein neues kontrastreiches Design hinzugefügt, auf das über die Dropdown-Liste in den Designoptionen unter Preferences -> Appearance & Behavior zugegriffen werden kann.

Neue Aktionen zum Auffinden von veraltetem Code

Mit der Aktion Find Usages of Deprecated können Sie alle Verwendungsstellen veralteter Elemente finden. Im Bericht der gefundenen Verwendungen werden die Einträge nun nach der erwarteten Version der Codebeseitigung gruppiert, sodass es einfacher ist, den Schweregrad zu erkennen und zu die Korrekturen zu priorisieren.

Ein neues Symbol für überschriebene oder implementierte Verhaltensmethoden

Die Verhaltensmethoden wurden mit einem neuen Symbol versehen. Der folgende Screenshot zeigt eine Liste von getPresentation()-Methoden, welche die ausgewählte Methode überschreiben oder implementieren. Von dort aus können Sie zu diesen navigieren.

Symbole „Überschrieben/implementiert” – weitere Verbesserungen

Die Popups mit den überschriebenen oder implementierten Konzepten, Klassen oder Methoden sind jetzt asynchron: Das Popup wird im Hintergrund mit den Suchergebnissen gefüllt. Zudem können Sie jetzt auch anhand des Namens der Suchobjekte filtern.

Finder-Änderungen

Die von MPS bereitgestellten Finder wurden aktualisiert und optimiert. Um einen Finder asynchron auszuführen, müssen Sie den speziellen Ausdruck OnEachNodeFoundByExpression verwenden, der einen einfachen Finder-Aufruf mit einem Callback darstellt, der für jeden gefundenen Knoten ausgeführt wird. Dementsprechend wurden die „Find Usages“-Optionen für Konzepte geändert. Die Optionen wurden um Derived Concepts und Concept Ancestors erweitert, welche eine Liste der Unterkonzepte bzw. Oberkonzepte zurückgeben. Die „Find Usages“-Optionen für Verhaltensmethoden wurden um „Overridden Methods“ und „Overriding Methods“ erweitert.

Unterdrücken bestimmter Fehler

Früher war die Fehlerunterdrückung ein grobes Werkzeug, um zu verhindern, dass MPS einen Fehler anzeigt, der vom Typensystemprüfer unzutreffend gemeldet wurde. Wenn ein Knoten unter Verwendung der Intention „Suppress error for node ...“ mit dem Attribut „SuppressErrorAnnotation“ kommentiert wurde, wurden für diesen Knoten und dessen Unterknoten keine Fehlermeldungen angezeigt.

Nun besteht die Möglichkeit, nur bestimmte Fehlermeldungen zu unterdrücken. Die Fehlermeldung wird für den Knoten und alle seine untergeordneten Knoten unterdrückt, alle anderen Meldungen bleiben jedoch weiterhin vorhanden. Weitere Informationen finden Sie in der Dokumentation.

Editor

Wiederverwendbare Cell Action Maps

Cell-Action-Map-Elemente aus einer vorhandenen Action Map können durch Importieren in einer neuen Map wiederverwendet werden.

Build-Sprache

Tipps und Tricks

Die voreingestellten Tipps und Tricks für MPS können jetzt angepasst werden. Dies kann mit dem neuen Tipps-und-Tricks-Konzept im Build-Skript erfolgen. Tipps können aus der allgemeinen MPS-Distribution wiederverwendet oder aus einem Verzeichnis oder einer Lösung importiert werden.

Tipps und Tricks – Sprache

Wenn Sie Tipps und Tricks aus einer Lösung importieren möchten, erstellen Sie eine Lösung mit einem Modell und fügen Sie die Sprachen jetbrains.mps.build.tips und jetbrains.mps.core.xml hinzu, um die verwendeten Sprachen zu modellieren. Anschließend können Sie eine Instanz des Konzepts MPSTipsAndTricks erstellen, in der mehrere Tipps erstellt werden können. Ein Tipp besteht aus HTML-formatiertem Text und darf ein Bild enthalten.

Build-Packaging-Optionen

Die benutzerdefinierte Paketerstellungsoption im BuildMps_IdeaPlugin ist veraltet und sollte von nun an nicht mehr verwendet werden. Jetzt ist es möglich, die Paketerstellung direkt in der Layoutkonstruktion BuildMpsLayout_Plugin auszuwählen.

Bei der automatischen Paketerstellung werden alle bereitgestellten Sprachen und Lösungen im Ordner „languages“ unter dem Plugin-Stammverzeichnis abgelegt. Bei der manuellen Paketerstellung hingegen muss der Entwickler das gesamte Plugin-Layout selbst bereitstellen.

Neue Konstruktion in der Build-Sprache

Die Testmodul-Konfiguration in der Build-Sprache wurde erweitert, um zusätzliche IntelliJ-IDEA-Plugins anzugeben, die geladen werden müssen, wenn MPS-Ant-Tests ausgeführt werden.

Es gibt Szenarien, in denen der Test ein bestimmtes Plugin in seiner Umgebung benötigt, das die MPS Build Language Engine nicht aus den Modulen ableiten konnte, in denen die Tests enthalten sind. Jetzt können Sie sicherstellen, dass das benötigte Plugin während der Ausführung des MPS Ant-Tests vorhanden ist.

Verschiedenes

Vollständig kompilierte Datentypen

Wir lassen Datentypen vollständig generieren. Alle generierten Informationen in Bezug auf Datentypen sind jetzt über die SModel-API verfügbar.

Migrationsdaten als Annotations speichern

MPS unterstützt jetzt einen neuen Mechanismus zum Übertragen von Migrationsdaten, den wir für neu erstellte Migrationen dringend empfehlen. Der erzeugte Knoten, der Daten enthält, sollte jetzt an einen beliebigen Knoten angehängt werden, der nahe genug an der Stelle ist, auf die sich die Daten beziehen.

Das Migrationsskript, das Knoten mit Daten erstellt, sollte das Konzept solcher Knoten deklarieren und ein putData()-Konstrukt verwenden, um jede solche Annotation in das Modell einzufügen:

Das Abrufen von Knoten, die Daten enthalten, erfolgt auf ganz ähnliche Weise wie früher:

Verbesserte Konfliktauflösung

Bisher war es nicht möglich, Änderungen sowohl von der lokalen als auch von der Remote-Seite anzuwenden, da durch das Anwenden von einer Seite die Änderungen der anderen Seite einfach abgelehnt wurden.

Bei untergeordneten Elementen mit mehreren Rollen ist es nicht praktikabel, beide Änderungen anzuwenden. Aus diesem Grund werden jetzt, wenn bei einem Konflikt Änderungen von einer Seite übernommen wurden, die in Konflikt stehenden Änderungen auf der anderen Seite in einen Zusatz am Ende der geänderten Gruppe konvertiert. Diese müssen separat angewendet oder ignoriert werden.

Nachdem Sie die linke Seite des Konflikts angewendet haben, können Sie die Zeile auf der rechten Seite immer noch anwenden oder ignorieren: