Extension support
Extensions provide a possibility to extend certain aspects of a solution or a language, which are not covered by the standard language aspects and the plugin mechanisms. Typically you may need your language to slightly alter its behavior depending on the distribution model - MPS plugin, IntelliJ IDEA plugin or a standalone IDE. In such cases you define your extension points as interfaces to which then different implementations will be provided in different distributions.
Support for extensions exists in
languages
plugin solutions
Create an extension point
Create one or more extensions
Both the extension point and the extension must be in the plugin model
Each extension must provide a get method, returning an object
Each extension may opt to receive the activate/deactivate notifications
An extension may declare fields, just like classes can
The language jetbrains.mps.lang.extension declares concepts necessary for building extensions.
The ExtensionPointDeclaration concept represents an extension point. The extension object type must be specified as a parameter.

The Extension concept is used to create a concrete extension.

An extension point can be accessed by reference using extension point expression.

An extension point includes a way to access all objects provided by its extensions.

note
Objects returned by the extensions have transient nature: they may become obsolete as soon as a module reloading event happens. It is not recommended to e.g. cache these objects. Instead is it better to get a fresh copy each time.
public interface Extension<T> {
String getExtensionPointId ();
T get ();
void activate ();
void deactivate ();
}
public class ExtensionPoint<T> {
public static <T> ExtensionPoint<T> generify(ExtensionPoint raw) { ... }
public ExtensionPoint(String id) { ... }
public String getId() { ... }
}
Extension points and extensions are managed by the ExtensionRegistry core component.
Thanks for your feedback!