Skip to content

Conversation

@kyay10
Copy link
Contributor

@kyay10 kyay10 commented Oct 22, 2025

This is important for more complex plugins that share state between FIR and IR; also important for plugins that extract info from the compiler configuration.

FirExtensionRegistrarAdapter.registerExtension(SimplePluginRegistrar())
IrGenerationExtension.registerExtension(SimpleIrGenerationExtension())
}
) = with(registrar) { registerExtensions(configuration) }
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm... I'm not sure how I feel about this specifically as a pattern to recommend. While I like and agree with the overall direction of deduplicating this registration logic, delegating directly to the registerExtensions member function of SimplePluginComponentRegistrar doesn't feel like the right choice. As an example, it's common for complex compiler plugins to have lots of custom directives to control various configuration options. There might also be test specific configuration to help debug failures.

I think we should follow the Kotlin Serialization pattern here and have a companion-level function to hold the logic. A companion-level extension function should work a little cleaner as well. And name it something like registerPlugin so we don't accidentally recurse.

Copy link
Contributor Author

@kyay10 kyay10 Oct 22, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looking at Metro's version, they prepare all these options from directives yes, but then ultimately pack it into a MetroOptions object, and the rest of the registration is almost the same logic as the normal registrar, except that they turn off the lookup tracker and expect-actual tracker. Their normal registration gets the same options thru the compiler configuration. Thus, I don't see why they couldn't just do it in configureCompilerConfiguration.
Similarly for the serialization plugin. They can add their singular option into configuration easily.
My point is that the normal registrar always gets its info from the configuration, so for tests, one should just put the necessary info into configuration, and then call registerExtensions.
In some sense, parsing directives into the compiler configuration is the same idea as parsing cli options into the compiler configuration.
Btw, there's no fear of accidental recursion since this method is called registerCompilerExtensions and the normal one is registerExtensions.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants