IntelliJ Platform Plugin SDK Help

Legacy Project Wizard API

Implementing a New Module Type

Additional support for specific tools and technologies is usually done via implementing some certain module type, which is attached to the project. A new module type should be derived from the class ModuleType.

Custom Project Wizard

The main utilities to configure a custom project wizard can be found in the package lang-api.ide.util.projectWizard. These classes and interfaces serve the following purposes:

  • Modification of the configuration wizard view

  • Adding new steps to the wizard

  • Providing additional settings for project creation

  • Handling activities during project creation

  • Initial environment configuration

Module Type

To create a new module type, implement ModuleType parameterized by ModuleBuilder and register it in the com.intellij.moduleType extension point in plugin.xml file.

Implementing Module Builder

To set up a new module environment, ModuleBuilder should be extended and registered in the com.intellij.moduleBuilder extension point.

Functionality which is mandatory to implement consists of:

  • void setupRootModel(ModifiableRootModel) - sets up a root model for the new module

  • ModuleType getModuleType() - returns a module type

See JavaModuleBuilder to understand better how to implement a module builder.

Implementing Module Builder Listener

Module builder listener reacts on a new module creation, which could be done either as a part of the project creation process or as adding a new module to the already existing project. To provide a certain behavior right after a module has been created, a module builder must implement ModuleBuilderListener.moduleCreated(Module).

Examples of the tasks executed right after a module has been created may include configuring module roots, looking up for an SDK and setting it up, adding a specific facet if required, etc.

Adding New Wizard Steps

Adding new steps to the module wizard can be done by overriding AbstractModuleBuilder.createWizardSteps(WizardContext, ModulesProvider).

If this method returns a non-empty array of ModuleWizardStep objects, new steps will be shown in their indexing order while creating a new module.

ModuleWizardStep has two methods to be overridden:

  • JComponent getComponent() - defines the step's UI

  • void updateDataModel() - commits data from UI into ModuleBuilder and WizardContext

Facet

Facets in IntelliJ are the way to store multiple kinds of module-specific settings, for example, to make a language support or framework available in some given module. To understand facets better from the end-user's point of view, see the Facet documentation section.

Implementing Project Structure Detector

To support the creation of your module when a project is imported from existing sources, extend ProjectStructureDetector. To detect the files your module supports, implement ProjectStructureDetector.detectRoots().

Detecting files is not enough - it is also required to create a module for the project, if appropriate, by implementing setupProjectStructure(). Here is an example that creates a module if no other modules exist in the project structure.

@Override public void setupProjectStructure( @NotNull Collection<DetectedProjectRoot> roots, @NotNull ProjectDescriptor projectDescriptor, @NotNull ProjectFromSourcesBuilder builder) { List<ModuleDescriptor> modules = projectDescriptor.getModules(); if (modules.isEmpty()) { modules = new ArrayList<>(); for (DetectedProjectRoot root : roots) { modules.add(new ModuleDescriptor(root.getDirectory(), MyModuleType.getInstance(), ContainerUtil.emptyList())); } projectDescriptor.setModules(modules); } }
12 May 2025