A Metaborg project can contain source files written in Metaborg languages. Such projects are represented by classes derived from the IProject interface. In the IDEA plugin this is the IdeaProject class, but in the JPS plugin this is the MetaborgJpsProject class.

A Metaborg language specification defines a new language. Such projects are represented by IdeaLanguageSpec (IDEA) and JpsLanguageSpec (JPS), both of which derive from the ISpoofaxLanguageSpec interface, which indirectly derives from IProject.

Additionally, there is the ArtifactProject for language artifacts.


IntelliJ IDEA uses the concept of modules, which are similar to projects in Eclipse. To get the Metaborg project that corresponds to a module, use the IIdeaProjectService methods (in IDEA), or the IJpsProjectService (or JPS) methods.

An IntelliJ module lives in a project, which corresponds to a workspace in Eclipse. And projects live in the application, which is application-wide.

A module has so-called content roots: folders that hold the content of the module. A simple module just has the module’s root folder as a content root, but a more complex module might have several content roots from all over the place. A single file may belong to multiple modules.

Module Type

A language specification project is represented in IntelliJ IDEA as a module with the MetaborgModuleType. Such a module is created and managed by the MetaborgModuleBuilder. Its setupRootModel() method is responsible for setting up the module and creating its files.