Das ist neu in MPS 2024.1

MPS 2024.1 enthält eine neue asynchrone Implementierung der Logical View im Project-Toolfenster, bietet wesentliche Verbesserungen bei der Kotlin-Unterstützung auf verschiedenen Plattformen und führt Tests spürbar schneller aus. Außerdem gibt es nun bedingte Forks in Generierungsplänen, die Projektpfade in TestInfo wurden als veraltet gekennzeichnet, die neue Bedienoberfläche hat Verbesserungen erhalten und es wurden zahlreiche Plattformaktualisierungen vorgenommen.

Im Folgenden stellen wir Ihnen die Verbesserungen im Detail vor.

Erweiterte Plattformunterstützung für Kotlin

Die Kotlin-Unterstützung in MPS wurde ursprünglich nur für die Unterstützung von Common-Code entwickelt. Der einzige mögliche Anwendungsfall in MPS war jedoch die Kompilierung für die JVM, und die Unterscheidung zwischen Common-Code und JVM-Code war unklar.

In dieser Version führen wir die plattformspezifische Konfiguration von Quellcode-Sets für Kotlin-Knoten ein. So können Sie erkennen, welche Zielplattformen ein Codeabschnitt unterstützt und Deklarationen vor inkompatiblem Code verbergen.

Quellcode-Sets

In einem normalen Kotlin-Projekt können Sie Quellcode-Sets verwenden, um Code für unterschiedliche Plattformen zu trennen. In MPS haben wir dies auf der Stammknoten-Ebene eingeführt, mit der Option, für jeden Kotlin-Stammknoten die unterstützten Plattformen anzugeben. Diese Quellcode-Sets können auf der Stammknoten-Ebene über eine Kontextaktion konfiguriert werden.

In der Praxis bedeutet dies Folgendes:

  • Code in einem bestimmten Quellcode-Set kann nur auf Deklarationen zugreifen, deren Plattformen kompatibel sind. Zum Beispiel kann JVM-spezifischer Code nur auf JVM-spezifischen Code und Common-Code mit der Zielplattform JVM zugreifen.
  • Die generierten Quellen werden in Quellcode-Set-spezifischen Verzeichnissen abgelegt. Wenn kein Verzeichnis angegeben ist, wird das Standard-Quellcode-Set verwendet, das der Standardeinstellung des Moduls entspricht.
  • Erwartete und tatsächliche Deklarationen (expect/actual) werden jetzt unterstützt.

Standardmäßig verwendet Kotlin-Code ohne explizite Plattform die JVM, um die Abwärtskompatibilität zu wahren.

Laden und Kompilieren von Stubs

Stubs wurden verbessert, um neue Multiplattform-Anwendungsfälle zu unterstützen. In der Vergangenheit bot MPS separate Optionen für Kotlin- und Kotlin/JVM-Stubs für das Laden von Common- bzw. JVM-Stubs.

Diese beiden Optionen wurden nun unter der Option für Kotlin-Stubs zusammengeführt. Dabei wird nun automatisch ermittelt, ob ein bereitgestelltes Artefakt Common-Code, JVM-Code oder Code für andere Plattformen enthält.

Da Deklarationen zwischen Common- und plattformspezifischen Bibliotheken redundant sind (da beide Artefakte alle benötigten Deklarationen enthalten), haben wir einen neuen Mechanismus zum Filtern von Duplikaten eingeführt, um bei Stubs die Übersichtlichkeit zu wahren. Wenn plattformspezifische Bibliotheken unter demselben Modul deklariert werden, können sie auf gemeinsame Deklarationen zugreifen, sodass Sie sie nicht erneut deklarieren müssen.

Die Konfiguration der Abhängigkeiten erfolgt unverändert:

  • Sowohl Common- als auch plattformspezifische Bibliotheken können als Stubs verwendet werden.
  • JVM-Bibliotheken müssen Common-Code für die JVM kompilieren, und sie sollten im Java-Facet deklariert werden.

Wenn Sie zum Beispiel Common-Code schreiben, müssen Sie eine Common-Bibliothek für Stubs verwenden, die das Common-Quellcode-Set nutzt, aber Sie müssen auch das Java-Artefakt im Java-Facet deklarieren.

Verbesserte Lesbarkeit von Kotlin ohne CodeRules-Typsystem

Kotlin-Code in MPS führte früher zu zahlreichen typesystem- und Scope-Fehlern, wenn das auf CodeRules basierende Kotlin-Typesystem-Plugin nicht verfügbar war. Um die Lesbarkeit und Testbarkeit zu verbessern, werden diese Prüfungen und Fehler jetzt stummgeschaltet, wenn das CodeRules-basierte Typesystem-Plugin nicht verfügbar ist.

In solchen Fällen werden alle Scopes in Kotlin-Sprachen durch einen Standard-Scope ersetzt, der die Knoten aller kompatiblen Concepts umfasst. Dies beseitigt alle Fehlalarme, da sich alle gültigen Knoten im Scope befinden.

Die Richtlinien für die Handhabung von Kotlin-Code bleiben unverändert:

  • Das Schreiben und Prüfen von Kotlin-Code sollte mit aktivierten CodeRules und installiertem Kotlin-Typesystem-Plugin erfolgen.
  • Das Lesen und Generieren von Kotlin-Code ist jedoch problemlos ohne diese möglich.

Neuimplementierung der Leiste Logical View

Die Logical View-Leiste verwendet jetzt eine asynchrone Architektur, die zur Reaktionsschnelligkeit der Bedienoberfläche beiträgt und die allgemeine IDE-Performance verbessert. Die neue Implementierung vereinfacht auch die Umsetzung von Erweiterungen und Änderungen. Für weitere Informationen lesen Sie bitte unseren Artikel ProjectPane implementation on top of ProjectViewTree in der Knowledge Base.

Diese neue Implementierung hat zu einigen erwähnenswerten Änderungen geführt:

  • Fehler- und Warnanzeigen sind nicht mehr verfügbar.
  • Sowohl Fehler als auch Warnungen, die in der Hierarchie gefunden werden, sind rot unterstrichen.
  • Die Option Show Descriptor Models wirkt sich auf alle Deskriptor-Modelle aus.
  • Einige Drag-and-Drop-Vorgänge funktionieren anders als bisher.
  • Die Anordnung der Einstellungen in der Logical View-Leiste wurde leicht geändert.

Platzhalterzellen

Wir haben in der BaseLanguage einen neuen Stil eingeführt, der es ermöglicht, konstante Zellen als Platzhalter für fehlende Werte (untergeordnete Knoten oder Referenzen) zu verwenden. Wenn zum Beispiel kein Konstruktor in einer Klasse vorhanden ist, kann stattdessen die Platzhalterzelle <no default constructor> angezeigt werden. Der Stil bewirkt, dass konstante Zellen ein für Platzhalterzellen erwartbares Verhalten zeigen. Der Cursor kann nur auf die erste Position gesetzt werden, und der Wert ist schreibgeschützt. Erlaubt sind nur Änderungen, die durch zugeordnete Transformationsmenüs vorgenommen werden.

Änderungen an der Build-Sprache

Die boolesche Option doNotCompile von Modulen in der Build-Sprache wurde durch ein Java-Enum ersetzt, um die folgenden Fälle besser zu unterscheiden:

  • Das Modul enthält überhaupt keinen Code.
  • Das Modul enthält Code, aber der Code wird nicht von MPS, sondern von anderen Tools kompiliert.

Beiden Fällen entsprach früher der Wert true.

Das neue Java-Enum hat drei mögliche Werte:

  • compile in MPS
  • compile externally
  • no code

Bei der Migration auf 2024.1 wird in der Option doNotCompile der Wert false in compile in MPS und der Wert true in compile externally geändert.

Bedingte Forks in Generierungsplänen

Eine experimentelle neue Funktion ermöglicht das Forken eines Generierungsplans, ohne den ursprünglichen Plan, auf dem der Fork basiert, zu verändern. Ein Generierungsplan kann als Fork eines anderen Generierungsplans gekennzeichnet werden. Der gekennzeichnete Plan wird so behandelt, als würde er explizit mit der üblichen fork-Anweisung am Anfang des geforkten Generierungsplans referenziert.

Darüber hinaus können Sie beim Definieren eines Forks einen Modifikator-String verwenden, der als Trigger dient. Der Fork wird nur erstellt, wenn das zu generierende Modell einem Modul angehört, das ein Generierungsziel-Facet besitzt, dessen Facet-ID mit dem Trigger-String übereinstimmt.

JUnit5-XML-Berichte in MPS

JUnit-Tests in MPS können jetzt Testberichte nicht nur in den Formaten Vintage und Jupiter, sondern auch im Open-Test-Reporting-Format erzeugen. In den Testoptionen der Build-Sprache steht eine neue Option zur Verfügung, mit der Sie festlegen können, ob der Open-Test-Bericht in den generierten Berichten enthalten sein soll. Wenn die Option auf true gesetzt ist, werden im Projektverzeichnis Berichtsdateien mit dem Namen junit-platform-events*-$BUILD_NAME$.xml angelegt.

Wenn die Option auf false gesetzt ist, werden Berichte in den Altformaten Vintage und Jupiter erstellt.

@DisplayName-Annotation von JUnit5 wird in Testberichte übernommen

MPS-Testberichte berücksichtigen jetzt die @DisplayName-Annotation von JUnit und übernehmen den Namen in die Berichte, die im Testbericht-Toolfenster angezeigt werden.

Verkürzte Testlaufzeiten

Beim Durchführen eines Knoten- oder Editortests kopierte MPS bisher das gesamte Testmodell in transiente Modelle und erstellte zusätzliche Kopien von jedem Testfallknoten (ausgehend vom Stammknoten NodeTestCase oder EditorTestCase). Bei großen Testmodellen konnte dies die Performance spürbar bremsen. Außerdem entstanden dadurch recht merkwürdige Setups mit duplizierten Testknoten. MPS 2024.1 kopiert Modelle mit Tests nicht mehr. Kopiert werden nur noch die TestNode-Unterknoten des NodeTestCase bzw. EditorTestCase zusammen mit ihren jeweiligen Umgebungsknoten (den Zielen ihrer Referenzen).

Projektpfad in TestInfo nicht mehr benötigt

TestInfo-Deklarationen sind nicht mehr erforderlich für Tests, die ein geöffnetes MPS-Projekt voraussetzen. Dies gilt für alle Ausführungsmethoden von JUnit-Tests:

  • Wenn der Test von der IDE aus – entweder im IDE-Prozess oder separat – ausgeführt wird, wird das aktuell geöffnete Projekt verwendet.
  • Wenn der Test mit dem Task <launchtests> ausgeführt wird, kann der Projektpfad als zusätzliche project path-Option des Tasks angegeben werden. Wenn nichts angegeben ist, wird ${basedir} verwendet, was dem Home-Verzeichnis des aktuellen Projekts entspricht.
  • In speziellen Fällen, in denen keiner der beiden oben genannten Ansätze verwendet werden kann, können Sie den Projektpfad über die Systemeigenschaft -Dmps.test.project.path angeben.

Bestehende TestInfo-Deklarationen werden weiterhin unterstützt und können beibehalten werden.

Komplett überarbeitete Lademethode für Modulklassen

Um das Laden von Klassen vom Modellzugriff zu trennen und der Deprecation von ReloadableSModule Rechnung zu tragen, haben wir den Ablauf beim Laden von Klassen in Modulen geändert. Obwohl wir uns bemüht haben, die Änderungen so vorzunehmen, dass sie für Anwender*innen nicht spürbar sind, können die Updates möglicherweise zu bisher nicht beobachteten Problemen beim Laden von Klassen führen.

Im Rahmen dieser Überarbeitung hält sich MPS nun an die in module.xml für die bereitgestellten Module deklarierten Abhängigkeiten, ohne zu versuchen, diese beim Start anhand der in den Moduldateien verstreuten Informationen zu berechnen. In der Designphase werden die Abhängigkeiten aus Informationen abgeleitet, die in der Phase der Modelltransformation gesammelt wurden, und auch hier werden sie nicht neu berechnet. Die alte Logik, die Modulabhängigkeiten aus .mpl- oder .msd-Dateien berechnet, ist immer noch als Ausweichmethode vorhanden, falls die neue Methode versagt.

Diese Änderungen sind Teil unserer laufenden Bemühungen, Java-Modul-Facets und Modul-Facets im Allgemeinen zu verbessern.

Ausschluss auskommentierter Knoten aus dem Scope (auch in 2022.3.2 verfügbar)

Bei Verwendung der Standard-Scope-Berechnung werden auskommentierte potenzielle Zielknoten jetzt automatisch aus dem Scope ausgeschlossen.

Sonstiges

  • In der BaseLanguage wurde ein hexadezimales Long-Literal eingeführt.
  • Wenn bei der Migration eines Projekts Versionsinkompatibilitäten zwischen Modulen und Modellen auftreten (z. B. wenn ein Modul eine andere Sprachversion angibt als ein Modell), wird ein Popup-Benachrichtigungsfenster mit einer Aktion angezeigt, die alle Module mit Inkompatibilitäten auflistet. Dies ist hilfreich, wenn Sie migrierten Code mergen, da Sie so sicherstellen können, dass nach dem Merge die korrekten Sprach- und Modulversionen verwendet werden.
  • Module unter einem Entwicklungskit werden in der Logical View-Leiste als Modul-Referenzknoten angezeigt. Dies ist analog zur Darstellung von Laufzeitmodulen unter einem Sprachmodul.

Zahlreiche Fehlerkorrekturen

  • Wie üblich behebt dieser Build eine Reihe von Fehlern. Eine vollständige Liste aller behobenen Probleme finden Sie hier.

Plattform-Updates

Neues Terminal in neuer UI

Beta

MPS 2024.1 führt ein überarbeitetes Terminal ein, das sowohl visuelle als auch funktionale Verbesserungen aufweist, um Befehlszeilenaktivitäten zu optimieren. Dieses Update verleiht dem vertrauten Tool ein frisches Aussehen. Die Befehle sind in Blöcke unterteilt und der Funktionsumfang wurde erweitert. Sie können zum Beispiel einfach zwischen den Blöcken navigieren, Completion-Vorschläge für Befehle nutzen und unkompliziert auf den Befehlsverlauf zugreifen. Mehr dazu erfahren Sie in diesem Blogbeitrag.

Option zum Herunterskalieren der gesamten IDE

Sie können jetzt die IDE auf 90%, 80% oder 70% herunterskalieren. Dadurch haben Sie die Flexibilität, die IDE-Elemente nach Bedarf zu vergrößern oder zu verkleinern.

Update der Gradle-Versionsunterstützung

Ab dieser Version unterstützt MPS keine Projekte, die Gradle-Versionen vor 4.5 verwenden. Die IDE führt keine Gradle-Synchronisierung für Projekte mit nicht unterstützten Gradle-Versionen durch.

Zahlreiche VCS-Funktionen

Optionale Anzeige von Branch-Änderungen auf dem Log-Tab

MPS 2024.1 vereinfacht den Code-Review-Workflow durch eine fokussierte Anzeige von Branch-bezogenen Änderungen. Bei Verwendung von GitHub, GitLab und Space können Änderungen in einem bestimmten Branch jetzt in einem separaten Log-Tab des Git-Toolfensters eingesehen werden. Klicken Sie dazu auf den Branchnamen im Toolfenster Pull Requests und wählen Sie im Menü Show in Git Log aus.

Unterstützung von Reaktionen auf Code-Review-Kommentare

MPS 2024.1 ermöglicht das Posten von Reaktionen auf Review-Kommentare bei GitHub-Pull-Requests und GitLab-Merge-Requests. Dabei wird eine Vorauswahl von Emojis angeboten.

Erstellen von Pull-/Merge-Requests aus Push-Benachrichtigungen

Nachdem Sie Ihre Änderungen erfolgreich in die Versionsverwaltung gepusht haben, informiert Sie die IDE nun mit einer einzigen Benachrichtigung über den erfolgreichen Push und empfiehlt eine Aktion, mit der Sie einen Pull-/Merge-Request erstellen können.

Anstehende GitHub-Updates werden visuell angezeigt

Wir haben visuelle Markierungen eingeführt, die Sie über anstehende Updates innerhalb Ihres Code-Review-Workflows informieren. Wenn es Änderungen gibt, die Ihre Aufmerksamkeit erfordern, wird auf dem Toolfenster-Symbol ein Punkt angezeigt. Ungelesene Pull-Requests werden ebenfalls mit einem blauen Punkt gekennzeichnet, damit Sie keine Updates in Ihrem Code-Review-Prozess verpassen.

Verhindern von Commits großer Dateien

Um Abweisungen durch die Versionsverwaltung aufgrund übergroßer Dateien zu vermeiden, bietet die IDE jetzt eine Pre-Commit-Prüfung, die Commits solcher Dateien verhindert und Sie über die Einschränkung informiert.

Branch-Filter im History-Tab des Git-Toolfensters

Im Git-Toolfenster wurde die Schaltfläche Show all branches durch einen Branch-Filter ersetzt, mit dem Sie Änderungen in einer Datei innerhalb eines bestimmten Branches überprüfen können. Für eine einfachere Bedienung haben wir außerdem die Symbolleiste horizontal ausgerichtet.

Verbesserte Suche im Branches-Popup

Im Branches-Popup können Sie die Suchergebnisse jetzt nach Aktionen und Repositories filtern. Auf diese Weise können Sie schneller und präziser in Ihrem Versionsverwaltungssystem navigieren.

Merge-Option „Allow unrelated histories“

Der Merge into-Dialog bietet jetzt im Dropdown-Menü die Option Allow unrelated histories. Wenn diese Option aktiviert ist, ist das Mergen von zwei Branches selbst dann möglich, wenn sie keine gemeinsame Historie haben.

Optionaler Ausschluss von Ordnern und Dateien von Vergleichen

Im Diff-Betrachter können Sie jetzt Ordner und Dateien angeben, die beim Vergleichen ignoriert werden sollen, um sich ausschließlich auf relevante Änderungen zu konzentrieren. Klicken Sie einfach mit der rechten Maustaste auf die Datei oder den Ordner, der nicht in den Vergleichsergebnissen erscheinen soll, und wählen Sie im Kontextmenü Exclude from results aus.

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 überprüfen Sie sie sorgfältig im aktualisierten Migrationsleitfaden.