All language operations (loading, unloading, activating, deactivating, and
discovery) should go through the
IIdeaLanguageManager interface. The implementations take care in
registering, unregistering, activating and deactivating the languages such that
the IDE can use them.
Discovering a language doesn’t load it. Loading a language makes Metaborg Core aware of it. Activating a language makes it usable in the IDE. For JPS plugins language activation is not available, as it doesn’t have an IDE.
A Metaborg language might be found in a Maven repository, or installed locally.
ILanguageSource interface was introduced to abstract this. Given a
language identifier, it will return the location of a language component for
that language identifier.
Currently it only looks in the plugin’s resources, but future implementations may search Maven Central or artifacts.metaborg.org.
Languages in IntelliJ¶
IntelliJ expects a unique implementation of the abstract
Language class for
each language. It considers two
Language to be the same if they are instances
of the same class. Therefore, to represent multiple Spoofax languages, we need
to create our own
Language class implementations dynamically.
java.lang.reflect.Proxy class is not sufficient. First of all
I’m not sure whether different proxies are different classes, but most
Proxy class only supports implementing interfaces. We need
to implement the abstract class
Language, so this won’t work.
There are several third-party libraries that allow you to create classes at runtime. A very promising one is Javassist, which I’ve used before when trying to build a profiler for Stratego. Here is some information.