RustRover Module Builders / Project Wizards

It seems that RustRover isn’t extendable in the same way other IDEs (or at least Intellij) are.

I’ve implemented a project wizard / module builder for the framework i’m supporting, and managed to get it up and running in Intellij+Rust Plugin.
Using all three approaches works and they all displayed in the new project dialog.

But in Rust Rover, running the same plugin, none of them are picked up (I can only embedd one pic, so trust me when i say they are not there in the project wizard)

The documentation (Frameworks | IntelliJ Platform Plugin SDK) says that the Java plugin is needed only for the “Framework” feature, but no mention of it being needed for project wizards or module builders

Generally it seems like RR is in some different category than the other IDEs, for example it’s not mentioned here:

Am i missing something?

Please see code below (the repo isn’t public yet, but if need be ,i.e. if the answer is different than: “It’s not possible yet”, i can create a minimal reproduction)

Platform version: 2024.3.3

<idea-plugin allow-bundled-update="true">
    <depends>com.intellij.modules.platform</depends>
    <depends>com.intellij.modules.lang</depends>
    <depends>com.intellij.modules.rust-capable</depends>
    <depends>com.jetbrains.rust</depends>
    <resource-bundle>messages.FooBarPlugin</resource-bundle>

    <extensions defaultExtensionNs="com.intellij">

        <!-- Modules -->
        <moduleType id="FooBar_MODULE" implementationClass="io.github.flaxoos.FooBar.ide.module.FooBarModuleType"/>

        <!-- Only need one of the three below -->
        <!-- Module Builders / Project Wizards -->
        <moduleBuilder builderClass="io.github.flaxoos.FooBar.ide.module.FooBarModuleBuilder"/> 
        <newProjectWizard.generator implementation="io.github.flaxoos.FooBar.ide.newProject.FooBarGeneratorProjectWizard"/>
        <newProjectWizard.languageGenerator implementation="io.github.flaxoos.FooBar.ide.newProject.FooBarLanguageProjectWizard"/>
class FooBarModuleType : ModuleType<FooBarModuleBuilder>(ID) {
    companion object {
        const val ID = "FooBar_MODULE"
        val INSTANCE: FooBarModuleType = FooBarModuleType()
    }

    override fun getNodeIcon(isOpened: Boolean): Icon = FooBarIcons.Open.delegate
    override fun createModuleBuilder(): FooBarModuleBuilder = FooBarModuleBuilder()
    override fun getDescription(): String = "Module for developing FooBar-based blockchains."
    override fun getName(): String = "FooBar Module"
}
class FooBarModuleBuilder : GeneratorNewProjectWizardBuilderAdapter(FooBarGeneratorProjectWizard())
class FooBarGeneratorProjectWizard : GeneratorNewProjectWizard {
    private val coroutineScope = CoroutineScope(Dispatchers.Default)

    override val icon: Icon = FooBarIcons.Open.delegate

    override val id: @NonNls String = FacetNames.FooBar_FRAMEWORK_NAME
    override val name: @Nls(capitalization = Nls.Capitalization.Title) String = FacetNames.FooBar_FRAMEWORK_NAME
    override val ordinal: Int = 100

    override fun createStep(context: WizardContext): NewProjectWizardStep {
        val root = RootNewProjectWizardStep(context)
        val base = NewProjectWizardBaseStep(root)
        val rustModuleStep = RustStep(root, coroutineScope)
        val popStep = PopStep(rustModuleStep)
        return base.nextStep { root }.nextStep { rustModuleStep }.nextStep { popStep }
    }
}
class FooBarLanguageProjectWizard : LanguageGeneratorNewProjectWizard {
    private val coroutineScope = CoroutineScope(Dispatchers.Default)
    override val icon: Icon = FooBarIcons.Open.delegate
    override val name: @Nls(capitalization = Nls.Capitalization.Title) String = FacetNames.FooBar_FRAMEWORK_NAME
    override val ordinal: Int = 100
    override fun createStep(parent: NewProjectWizardStep): NewProjectWizardStep {
        // Ideally we want to break the RS step and only do the stuff we need from it, like setting up the cargo project/module, maybe we can use the RsNewProjectPanel
        val rustModuleStep = RustStep(parent, coroutineScope)
        val popStep = PopStep(parent)
        return parent.nextStep { rustModuleStep }.nextStep { popStep }
    }
}
```kotlin

ProjectWizard works only in IntelliJ IDEA, but not in PyCharm/GoLand/RustRover/etc.
You can use com.intellij.directoryProjectGenerator EP with a com.intellij.ide.util.projectWizard.CustomStepProjectGenerator implementation instead.

See TeXiFy-IDEA/resources/META-INF/extensions/files-and-project.xml at master · Hannah-Sten/TeXiFy-IDEA · GitHub as reference.

@yann.cebron Thanks for your reply

May i suggest that the SDK docs would state this clearly? It’s not obvious from reading them, hence my confusion

Thanks, yes we’re aware that this area needs rework.