Quick Definition Action 

Quick definition is similar to its counterpart from IntelliJ IDEA. Point a cursor onto a node and press ctrl-shift-i. You will see a popup with the definition of the node. You might navigate, select and perform find action in the popup. Thus, you don't need to open a new tab to simply get a glance at the node.

Quick definition works in a completion menu as well. If you are not familiar with the node meaning you might press ctrl-shift-i and see its definition alongside the completion menu. As you navigate through the completion menu, the contents of the popup will change accordingly.

Model unloading 

In previous versions, MPS was unable to unload models. This meant that if one is working with MPS for a long time and accesses many models, all these models would become loaded into memory. So, the memory consumption grew over time time and this also affected GC pauses. Now, it's possible to remove all models from memory explicitly by clicking the memory indicator or by setting a scheduled cleanup in Registry ( Cmd/Ctrl + Shift + A -> "Registry...", set "ide.memory.cleanup.interval" parameter). This feature in now experimental and we'll improve it in next releases.


Create from usage (concept, method, class) 

Now it's possible to create concepts, methods and classes from usages in code

The intention can create

Generating valid java identifiers from INamedConcepts 

A new generator statement allows generating a valid java identifier from any INamedConcept. This will make a unique name by removing illegal symbols, capitalizing and adding prefix if needed. Then, this name will be made unique by adding a numerical suffix. E.g. for node with name "my named concept %1" string "MyNamedConcept1" would be generated

Concept<->Interface conversion 

An intention which converts concept to interface concept and vice versa. Usable when creating language structure. Does not change usages. 

Sync styles and editing experience in meta-languages

Meta-languages were made similar to each other in terms of

JavaStubs loading performance improved [sponsored?]

We have significantly improved performance of loading stub models, especially from large and strongly connected sets of jars. On our target project, loading became 2 to 3 times faster; backported to 2019.1 and 2019.2 

Surround with...

The action is now available when multiple nodes are selected. Previously it was enabled only for selections containing a single node.

Constraint rules and feedback improvements
We have fixed several problems within the aspect 'feedback'. There are additional Problems available there now (like the wrong cardinality problem).

Standalone generator modules and multiple generators per language

We expose this experimental functionality that has been available, yet hidden, in 19.2. Now you can create more than 1 generator for a language, and host them either inside a language as it used to be, or put them next to a language as a regular top-level module. Note, to take full advantage of multiple generators, one have to use Generator Plans. To help transition, only one of language generators would continue to get involved for a model without explicit generation plan. (major feature; language designer; MPS-9349 and MPS-13308)


Find Usages: new statement to report arbitrary search result when writing a finder

(target audience: Language Designer; MPS-31134) In previous MPS versions, add result statement in a finder allows for node<>-based search results only. Now with add raw result, language designer could report any result Find Usages view is capable to visualize.


Generator: new setting to control dynamic reference warning 

For a long time, MPS generator has setting 'Resort to static reference', which helps to address performance issues. MPS generator issues a warning when it tried to resolve a dynamic reference and failed, and there were quite a lot of warnings for almost any project given the fact not all generators out there adhere to strict reference construction approach using label mappings (i.e. stick to plain strings for identify reference target instead). As long as user have no means to address the issue (it is author of a language that could make sure its generator is pedantic about references), there's little warning in the message in most cases. Therefore, there's a new setting to control whether to show the warning ("Warn static reference could not replace dynamic", off by default). The issue is one of most voted in Generator subsystem, 9 votes to date (MPS-25548)

 'Resort to static reference' explained:

When a reference macro gives a string as reference target, MPS creates a dynamic reference which is usually much more expensive to resolve (involves scope construction) than a regular ‘static’ reference. The option means that the moment MPS got dynamic reference, it tries to resolve its target, and, if succeed, replaces dynamic reference with a static one, which saves scope resolution next time the reference is accessed. Given there might be quite a lot of steps/intermediate models, constructing a scope might take noticeable time and use of ‘static’ reference in this case helps a lot.


Show Affected Files action in Root History dialog

For a revision in a root history, one can take a look at other files changed in the same revision (both end user and language designer; MPS-30570)


Root History for models in per-root persistence

Show Root History action, introduced in 2019.2, was available for roots from a models kept in a single file. Now, models in per-root persistence are supported as well  (both end user and language designer; MPS-30659)


Build language: explicit model roots

MPS used to treat only specific set of files as models, namely *.mps and *.mpsr. With custom model persistence, file names differ. To make sure all necessary model files get bundled when a module is build, there's explicit model root declaration for a module in build script, that facilitates custom file name patterns (language designer; MPS-30707)


Quick Fix to update module/model identity objects

Objects smodel language uses to identify models and modules keep respective target name, which might become stale if module/model is renamed. Now MPS detects outdated names and provides quick fix to bring them up to date (language designer; MPS-29486)


Module Facet story update

For a long time, 'Java' and 'Tests' module facets were unavoidable attributes of a module, with filesystem locations they imply being hard-coded in implementation. We move towards greater control for a language designer over various module aspects, therefore made a change in MPS to store these facets and their settings explicitly. With 'Tests' module facet, language designer have complete freedom now, and MPS no longer demands the facet to be present for Language module. To ensure transition, we still force Language module to keep 'Java' facet all the time, we are going to lift this restriction in the next release. The change also helps towards profound module deployment story (language designer; MPS-23359)

Update of Favorites view

Old favorites view tool was pretty outdated and full of issues. We decided to get rid of it completely and integrate into stable and well maintained IntelliJ platform Favorites tool. For now we supported modules, models, nodes and properties as entries, that can be added to favorites. We are planning to extend this integration to allow more functionality over elements from favorites view to improve user control over project and ways to access often used project elements.


Greatly updated custom persistence samples and documentation
Numerous documentation fixes and corrections
Fixed broken cross-links from MPS to documentation pages/topics
Fixed generation-time errors of the math sample
Updated documentation for the new build solution wizard
Documented the individual language aspects
Corrected the documentation of several MPS dialogs and tool windows

Base Language
Numerous fixes across the board
Binary and octal literals are now supported
Fixed handling of type parameters in javadoc