Nouveautés de MPS 2023.2

MPS 2023.2 améliore la génération de lambdas BaseLanguage, la prise en charge de JUnit 5, la redéfinition des règles d'inférence du système de types, et bien plus.

Prise en charge de JUnit 5

JUnit 5

Avec la nouvelle version de MPS, les tests sont générés en tant que tests JUnit 5. JUnit 4 reste pris en charge, mais de manière limitée.

  • Toute classe Java correctement annotée peut être exécutée en tant que test.
  • Les tests MPS peuvent être exécutés au sein d'un processus ou en générant un nouveau processus.
  • Les racines de test existantes sont générées avec les annotations de l'API JUP Jupiter :
    • BTestCase
    • NodeTestCase
    • EditorTestCase
    • MigrationTestCase
    • PatternTest
    • GeneratorTest

Tâche Ant pour lancer les tests de modules avec JUnit 5

Une nouvelle tâche Ant launchtests est disponible et prend en charge les éléments suivants :

  • library
  • macro
  • plugin
  • testmodules

Cette prise en charge inclut l'exécution de tous les artefacts de tests, à l'exception de JUnit 3, et sert de nouvelle cible pour la partie build de la configuration de test.

Exécution de tests

  • Toute classe Java correctement annotée peut être exécutée en tant que test.
  • La prise en charge de JUnit 4 est désormais limitée.
  • Il est possible d'exécuter les tests dans un processus existant ou en générant un nouveau processus.

API de la plateforme de tests

Cette API vous permet d'ajouter de nouveaux types de tests pour MPS et d'implémenter des listeners pour les sessions de tests.

Les classes inclused dans jetbrains.mps.baseLanguage.unitTest.platform forment l'API de la plateforme de tests MPS :

TestPlatform Définit l'API pour la plateforme de tests MPS.
TestDescriptor Représente un test unique sur la plateforme de tests MPS.
TestSource Représente la source du test, par exemple un SNode.
TestSession Représente une session de test.
TestDiscoveryParticipant Permet de rejoindre le processus de découverte des tests.
TestSessionListener Permet de recevoir les notifications de la session de tests.

Prise en charge expérimentale des moteurs de tests personnalisés

JUnit 5 fournit prise en charge de l'implémentation de tests exécutés avec un moteur personnalisé, tel que le framework de tests basé sur les propriétés jqwik .

Amélioration de la prise en charge de la redéfinition des règles du système de types
Sponsorisée par nos utilisateurs

Redéfinition du système de types

Nous avons ajouté une fonctionnalité qui permet aux règles du système de types de remplacer les règles basées sur les super-concepts. Cela s'applique aux cas dans lesquels les sous-concepts sont définis dans un langage qui étend le langage contenant le super-concept. Cette fonctionnalité est prise en charge pour les règles de type Inference.

Améliorations pour BaseLanguage

Une précédente mise à jour de MPS avait déjà amélioré la prise en charge des références de méthodes et de la conversion des fermetures (closures) en lambdas Java. Avec la nouvelle version de MPS, nous poursuivons l'amélioration de cette prise en charge en apportant plusieurs nouvelles fonctionnalités et correctifs de bugs.

Lambdas

Générer des fermetures en tant que lambdas

Les fermetures utilisées dans les opérations de collecte sont désormais générées en tant que lambdas Java. Initialement, cette fonctionnalité était seulement disponible pour les appels de fonction classiques utilisant des interfaces Java. Pour maintenir la rétrocompatibilité, une fermeture sera toujours générée en tant que classe anonyme dans les cas suivants :

  • Lorsqu'un nom de variable est en conflit avec une variable externe – désormais, un avertissement s'affiche pour vous suggérer de la renommer.
  • Lorsque la version cible de Java est la version 8 ou antérieure.
  • Lorsque des types bruts sont utilisés – ces types ne fonctionnent pas bien avec les lambdas Java.

Cela permet d'améliorer la qualité du code généré en rendant les lambdas plus lisibles et en réduisant le risque qu'elles soient générées de manière incorrecte. D'un autre côté, MPS permet l'utilisation de types bruts que Java ne permettrait pas, la détection de telles instances étant toujours compliquée. Par conséquent, la génération peut échouer lorsque des types bruts sont utilisés.

Paramètres de fermeture

Paramètres de fermeture

Auparavant, les paramètres de fermeture pouvaient prendre les formes suivantes : ~param, <type> param, param et var param. L'ajout de paramètres en omettant le type était fastidieux. Pour la nouvelle version, nous avons abandonné la forme ~param au profit d'un simple paramètre non typé, inséré par défaut. De plus, lorsqu'une fermeture est insérée dans un appel de fonction, les paramètres par défaut du type de fonction attendu seront insérés. Enfin, si le type des paramètres est omis dans le code source, il sera dorénavant omis dans les paramètres générés aussi, ce qui améliore la qualité de la compilation.

Flux

Interopérabilité des flux

Bien que les séquences soient largement utilisées dans MPS, il arrive aussi qu'il soit nécessaire d'utiliser des flux Java. Cette mise à jour améliore l'inférence afin d'atténuer les problèmes de système de types liés aux méthodes complexes que l'API Stream peut utiliser. Nous avons ajouté deux opérations pour relier les flux et les séquences :

  • <stream>.asSequence convertit une séquence en flux.
  • <sequence>.toStream(parallel=…) fait l'inverse.

En plus de vous permettre de choisir quelle API utiliser, cela permet de combiner les avantages des séquences (répétabilité) à ceux des flux (divers collecteurs, davantage d'opérateurs).

Améliorations concernant les collections

Nous avons introduit l'opérateur diamant (new ArrayList<>()) pour les constructeurs BaseLanguage lors dune précédente mise à jour de MPS, mais cela n'avait pas eu d'impact sur la création de collections. Dans cette nouvelle version, vous pouvez omettre les paramètres de types de nouvelles collections pour simplifier le processus d'écriture du code :

  • Type inféré à partir des valeurs initiales : var myList = new arraylist<> {myInitialValue}
  • Type inféré à partir d'une déclaration de variable : map<int, string> myMap = new hashmap<>

Nous avons aussi amélioré la prise en charge de la variance dans les collections. Il n'est par exemple plus possible d'attribuer une notation ? extends Number. Le système de types ne s'opposera toutefois plus à l'utilisation de ces types bornés (bounded) lorsqu'ils sont valides. Le type sequence<> restera covariant par défaut. Cela n'aura aucune conséquence négative puisque vous ne pouvez pas l'insérer dans une séquence d'éléments qui ne sont pas de son type. Cela peut entraîner de nouveaux problèmes de vérification de type là où du code non sécurisé n'était pas détecté auparavant. Ces problèmes peuvent être résolus avec des types bornés list<? extends node<>> ou avec des types de séquences sequence<node<>> .

Paramètres de configuration

Désactiver Make

Désactiver Make

Nous avons ajouté une nouvelle option, Disable Make On Startup, disponible dans Settings | Project Settings | Make. Lorsque cette option est sélectionnée, MPS ne génère pas tous les modules du projet au démarrage. Cela peut notamment permettre d'accélérer le démarrage lorsque le processus de création initial est trop long ou qu'il risque d'échouer car une configuration manuelle est requise en amont pour que le projet puisse être créé.

Modifier la bibliothèque

Modifier les chemins d'accès aux bibliothèques et au code source sources dans les propriétés Java du module

Une nouvelle option Edit a été ajoutée à l'onglet Java de la boîte de dialogue des propriétés du module. Elle n'est pas immédiatement repérable, mais très pratique : si vous devez modifier l'ensemble des bibliothèques jar d'un module, vous pouvez simplement utiliser cette option au lieu de devoir supprimer puis ajouter des bibliothèques une par une.

Autres modifications

Commentaire TODO

TODO pour les commentaires personnalisés

L'extension du concept IGenericComment permet aux concepts qui représentent des commentaires dans des langages personnalisés de participer à la fonctionnalité TODO de MPS. Les commentaires représentant des objets TODO seront collectés par le TODO Finder, répertoriés dans le TODO Viewer et vérifiés lors du processus de commit.

Aspects linguistiques : gérer les actions Create New

Auparavant, pour la création d'instances dans le modèle d'aspect, MPS suivait une logique générale qui impliquait des concepts non abstraits pouvant être enracinés et classés par nom ou flag. Dorénavant, une configuration supplémentaire peut être spécifiée avec une déclaration d'aspect afin de permettre aux concepteurs de langage de choisir quels concepts sont présentés à l'utilisateur et la façon dont ils sont regroupés et ordonnés.

La vérification « Please re-export dependency… » est désormais obsolète

Cet avertissement déroutant s'affichait lorsqu'un ClassConcept étendait ou exposait d'une autre manière son utilisation d'un ClassConcept d'un autre module. Avant la version 2023.2, MPS s'appuyait sur les dépendances de module spécifiées dans les descripteurs de module pour créer le graphique des dépendances. Maintenant que MPS organise les informations de dépendance en fonction des générateurs et des langages réels impliqués dans la transformation d'un modèle, il n'est plus nécessaire de spécifier explicitement ces dépendances, et il n'y a donc plus de vérification à faire.

Fonctionnalités sponsorisées par des clients utilisateurs de précédentes versions

Le partage est fondamental dans toute communauté. Les fonctionnalités suivantes ont été implémentées à la demande de clients utilisateurs de MPS, qui nous ont sponsorisés pour contribuer à leur développement. Ces nouvelles fonctionnalités sont maintenant accessibles à tous.

Vérificateur de modèles en parallèle

Le vérificateur de modèles peut maintenant utiliser efficacement le matériel en parallèle, ce qui accélère le processus de vérification. En fonction des paramètres dans Settings | Tools | Model Checker, il peut générer plusieurs threads lors du démarrage de ce processus.

Amélioration des performances de la persistance File-per-root

La méthode FilePerRootDataSource.getStreamByName() a été optimisée afin d’améliorer les performances du chargement des données des modèles. Si vous utilisez la persistance File-per-root pour stocker des modèles plutôt volumineux, vous constaterez les effets de cette optimisation.

Boîte de dialogue Find

Amélioration de la prise en charge de Find text in project

Désormais, l'action Find text in project recherche aussi les références des nœuds nommés afin de donner davantage de résultats pertinents. Nous avons ajouté un panneau de prévisualisation pour vous permettre de consulter les résultats directement dans la boîte de dialogue de recherche. Un texte contenant du HTML s’affiche désormais en tant que texte brut dans les résultats et non plus en tant que HTML.

Ignorer la migration des dépendances dans les tâches Ant

Lorsqu'on procède à la migration d'un projet en utilisant des tâches Ant fournies par MPS, il peut arriver que la migration des dépendances ne se fasse pas correctement. Nous avons ajouté un flag qui permet de poursuivre la migration d'un projet même dans de telles situations. L'arrêt du processus de migration dès la découverte d'une erreur de migration de dépendances reste toutefois le comportement par défaut. Pour utiliser ce flag, ajoutez haltOnDependencyError="false" à votre tâche Ant migrate.

Nouveautés de la plateforme

Zoom sur l'ensemble de l'IDE

Dans la version 2023.2, il est possible de faire un zoom avant ou arrière sur l'ensemble de l'IDE, afin d'augmenter ou de réduire la taille de tous les éléments de l'interface en même temps. Dans le menu principal, sélectionnez View | Appearance et ajustez la mise à l'échelle de l'IDE. Vous pouvez également affecter des raccourcis personnalisés à ces actions dans Settings/Preferences | Keymap | Main Menu | View | Appearance.

Nouveau paramètre Remember size for each tool window

MPS 2023.2 apporte une nouvelle option de mise en page qui permet d'unifier la largeur des fenêtres d'outils latérales ou de conserver la possibilité d'ajuster leur taille librement. La nouvelle case à cocher Remember size for each tool window est disponible dans Settings/Preferences | Appearance & Behavior | Appearance | Tool Windows. Apprenez-en plus sur le fonctionnement de ce paramètre pour la nouvelle interface utilisateur et pour l'ancienne dans cet article de blog.

Mise en évidence de la syntaxe dans les descriptions d'inspections

Mise en évidence de la syntaxe dans les descriptions d'inspections

Dans Settings / Preferences | Editor | Inspections, la syntaxe des extraits de code est désormais mise en évidence, ce qui vous permet de mieux comprendre ce qui déclenche une inspection et de décider si vous souhaitez l'activer ou pas.

Fill Paragraph pour les fichiers Markdown

Fill Paragraph pour les fichiers Markdown

L'action de l'éditeur Fill Paragraph est maintenant prise en charge pour les fichiers Markdown, ce qui permet de fractionner de longs textes en plusieurs lignes de même longueur. Pour ce faire, placez le curseur dans le paragraphe à modifier et cherchez la commande Fill Paragraph à l'aide de Find Action (Ctrl+Maj+A).

Fenêtre contextuelle Branches améliorée

Fenêtre Branches améliorée

Nous avons amélioré l'ergonomie de la fenêtre contextuelle Branches. Par exemple, la navigation entre les branches est maintenant facilitée, car elles sont regroupées et stockées dans des listes que vous pouvez développer.

Saisie semi-automatique dans la fenêtre contextuelle Create New Branch

Saisie semi-automatique dans la fenêtre contextuelle Create New Branch

MPS 2023.2 fournit la saisie semi-automatique dans la fenêtre contextuelle Create New Branch. Lorsque vous commencez à saisir le nom de votre nouvelle branche, l'IDE vous propose des préfixes basés sur les noms des branches locales existantes.

Guide de migration

Pour chaque nouvelle version majeure de MPS, nous fournissons des instructions pour vous aider à effectuer la migration dans les meilleures conditions. Nous vous invitons à en prendre connaissance.