Nouveautés de MPS 2018.3

BaseLanguage

Icônes de concept remplacé/implémenté

MPS marque les concepts avec une icône remplacé/implémenté, ce qui vous permet d'accéder facilement au superconcept ou sous-concept du concept actuel.

Paquets personnalisés pour les classes BaseLanguage

Depuis déjà longtemps, la seule façon de gérer les packages Java de classes générées était de passer par le nom d'un modèle contenant. Avec la nouvelle propriété Classifier 'packageName' vous pouvez gérer le package Java d'une classe générée. Cette propriété est également disponible pour les classificateurs racine.

Nouvelles possibilités de génération des extensions BaseLanguage

BaseLanguage a dès le départ été conçu pour être personnalisé avec de nombreuses extensions. Cependant, pour certaines extensions, il peut être compliqué d'implémenter un générateur correct. Désormais, BaseLanguage fournit plusieurs nouveaux concepts de temps de génération pour faciliter l'écriture des générateurs des extensions.

Générer des expressions Lvalue

Les expressions Lvalue sont évaluées en tant que variables qui peuvent être lues ou écrites avec une valeur. Dans certains cas, la génération d'une expression Lvalue est difficile dans la mesure où elle dépend du type de contexte dans lequel l'expression est utilisée. Désormais, le nouveau concept de temps de génération "generic lvalue-expression" peut être utilisé pour rendre un générateur plus simple et dissocié du contexte.

Heureusement, dans la nouvelle version, vous pouvez encapsuler une expression lvalue arbitraire avec l'expression "@byRef". Le générateur BaseLanguage transforme cette expression en une expression de type "Reference <T>", ce qui permet d'obtenir les opérations get et set de la variable encapsulée.

Ces deux nouveaux concepts de génération sont décrits plus en détails dans cet article.

Transformer des Lvalues en références

Certaines expressions agrègent d'autres expressions Lvalue pour créer des opérations composées avec une variable qui provient d'une expression agrégée (p. ex., affectation plus ou expressions increment et get). L'introduction de nouvelles expressions avec cette sémantique n'était pas considérée comme réalisable auparavant, car il était difficile d'écrire un générateur correct pour ces constructions.

Prise en charge des méthodes default dans BaseLanguage

Dans la version 2018.3, MPS peut créer les méthodes 'default' dans les interfaces BaseLanguage. Le mot clé 'default' est implémenté par le concept DefaultModifier, qui étend le concept Modifier dans BaseLanguage. DefaultModifier est situé dans le langage jetbrains.mps.baseLanguage.jdk8. Cela signifie que pour créer une méthode 'default' dans l'interface, vous devez importer le langage jdk8.

Générateur

Langage du générateur

La macro $INCLUDE$ a été déclarée obsolète et une migration a été prévue pour remplacer ses instances par $CALL$. L'ancienne version ne prenait pas en charge les modèles avec des arguments, et nous n'avons vu aucune raison de conserver les deux mécanismes pour appeler un modèle.

La macro $WEAVE$ et les règles de tissage correspondantes peuvent désormais appeler des modèles avec des arguments. Lorsqu'un modèle interprété tisse un modèle externe à partir d'un générateur « compilé », il n'est plus interprété, mais le code du modèle compilé s'exécute quand même. Les modèles « compilés » peuvent désormais tisser des modèles interprétés.

La réflexion Java n'est pas utilisée pour accéder à la collection de requêtes à partir d'un schéma de modèle, ce qui est également appelé QueriesGenerated.

Interface/expérience utilisateur

Barre tactile de MacBook

Le contexte par défaut inclut des contrôles d'exécution, de génération et de débogage de l'application, avec la capacité de sélectionner rapidement ou de créer une nouvelle configuration run/debug. Une nouvelle page Touch Bar a été prévue pour personnaliser les actions dans la section Preferences | Appearance & Behavior | Menus and Toolbars.

Et oui, elle est extensible ! Ajoutez simplement les actions requises à un 'InterfaceGroup' MPS spécial.

Thème d'interface à fort contraste

Nous avons inclus la prise en charge d'un nouveau thème High-contrast, accessible depuis la liste déroulante des options de thèmes, dans la section Preferences -> Appearance & Behavior.

Nouvelles actions de recherche du code obsolète

L'action Find Usages of Deprecated permet de trouver toutes les utilisations d'éléments obsolètes. Maintenant, le rapport d'utilisation regroupe les entrées en fonction de la version attendue de suppression du code, de sorte qu'il est plus facile d'identifier leur degré de gravité et de déterminer lesquels doivent être éliminés en premier.

Nouvelle icône pour les méthodes de comportement remplacé ou implémenté

Les méthodes de comportement ont été associées à une nouvelle icône. La capture d'écran suivante montre la liste des méthodes getPresentation() qui remplacent ou implémentent celle qui est sélectionnée, et cette liste vous permet également d'accéder à ces méthodes.

Autres améliorations des icônes remplacé/implémenté

Les fenêtres contextuelles des concepts/classes/méthodes remplacés/implémentés sont devenues asynchrones, ce qui signifie qu'en arrière-plan, MPS remplit cette fenêtre avec les résultats de la recherche. D'autre part, vous pouvez également procéder au filtrage en utilisant le nom des objets de recherche.

Modification des modules de recherche

Les modules de recherche distribués par MPS ont été mis à jour et optimisés. Pour exécuter un module de recherche de façon asynchrone, vous devez utiliser l'expression spéciale OnEachNodeFoundByExpression qui représente un appel de module de recherche avec un rappel qui s'exécute pour chaque nœud trouvé. Par conséquent, les options de recherche des utilisations d'un concept ont été modifiées. Les options ont été étendues avec Derived Concepts et Concept Ancestors qui donnent respectivement la liste des sous-concepts et des super-concepts. D'autre part, les options de recherche des utilisations pour les méthodes de comportement ont été étendues avec « Overridden Methods » et « Overriding Methods ».

Suppression d'erreurs spécifiques

L'outil de suppression d'erreurs se bornait jusqu'à présent à empêcher MPS d'afficher les erreurs détectées de façon incorrecte par le vérificateur de système de typage. Si un nœud était annoté avec l'attribut « SuppressErrorAnnotation » utilisant l'intention « Suppress error for node ... », aucun message d'erreur ne s'affichait pour ce nœud ou l'un de ses descendants.

Désormais, il est possible de supprimer uniquement certains messages d'erreur. Le message d'erreur sera supprimé pour le nœud et tous ses descendants, mais tout autre message d'erreur sera laissé tel quel. Pour en savoir plus, consultez la documentation.

Éditeur

Cell action maps réutilisables

Les éléments Cell action map d'une carte d'actions existante peuvent être réutilisés dans une nouvelle carte au moyen d'importations.

Langage de build

Conseils et astuces

Les conseils et astuces par défaut pour MPS peuvent désormais être personnalisés. Cela peut se faire avec le nouveau concept de conseils et astuces dans le script de build. Les conseils peuvent être réutilisés à partir de la distribution MPS générale ou importés à partir d'un annuaire ou d'une solution.

Langage de conseils et astuces

Pour importer des conseils et astuces à partir d'une solution, créez une solution avec un modèle et ajoutez les langages jetbrains.mps.build.tips et jetbrains.mps.core.xml pour modéliser les langages utilisés. Ensuite, vous pouvez créer une instance du concept MPSTipsAndTricks, où plusieurs conseils peuvent être créés. Chaque conseil est un texte au format HTML et peut inclure une image.

Options de packaging de build

L'option de packaging personnalisée dans BuildMps_IdeaPlugin est obsolète et ne doit plus être utilisée à partir de maintenant. Il est désormais possible de choisir le packaging directement dans la construction BuildMpsLayout_Plugin.

Avec Auto packaging, tous les langages et solutions fournis sont placés dans le dossier "languages" sous le répertoire du plugin racine. Le packaging manuel quant à lui requiert que le développeur fournisse lui-même la mise ne forme du plugin.

Nouvelle construction dans le langage de build

La configuration du module de test du langage de build a été étendue pour indiquer les extensions IntelliJ IDEA supplémentaires à charger lorsque les tests ant de MPS s'exécutent.

Il y a des scénarios dans lesquels le test nécessite un plugin spécifique dans son environnement que le langage de build MPS ne pouvait pas déduire des modules contenant les tests. Vous pouvez désormais vous assurer que le plugin dont vous avez besoin est présent pendant l'exécution du test Ant de MPS.

Divers

Types de données intégralement compilés

Nous avons rendu les types de données totalement générés. Toutes les informations générées sur les types de données sont désormais disponibles depuis l'API SModel.

Enregistrement des données de migration en tant qu'annotations

Désormais, MPS prend en charge un nouveau mécanisme de transfert des données de migration que nous recommandons fortement pour les nouvelles migrations. Le nœud produit contenant les données doit être maintenant attaché à tout nœud suffisamment proche de l'endroit auquel les données sont liées.

Le script de migration produisant des nœuds avec les données doit déclarer le concept de ces nœuds et utiliser une construction putData() pour insérer chacune de ces annotations dans le modèle :

La récupération des nœuds contenant les données reste à peu près identique :

Résolution des conflits améliorée

Auparavant, il était impossible d'appliquer des modifications que ce soit localement ou à distance, car l'application d'un côté impliquait le rejet des modifications de l'autre.

Pour les enfants dans des rôles multiples, l'application de ces deux modifications pose problème. C'est pourquoi dorenavant, après avoir appliqué les modifications d'un côté du conflit, les autres modifications en conflit sont converties en un ajout à la fin du groupe modifié. Vous devez les appliquer ou les ignorer séparément.

Après avoir appliqué la version de gauche du conflit, vous pouvez appliquer ou ignorer la ligne du côté droit :