JVM IR: introduce ClassGeneratorExtension

This is a low-level extension point for Kotlin/JVM, which is supposed to
be used instead of ClassBuilderInterceptorExtension.

 #KT-54758 Fixed
 #KT-56814 Fixed
This commit is contained in:
Alexander Udalov
2023-02-24 16:52:22 +01:00
parent b1ca9a0f05
commit fba5b96bef
7 changed files with 264 additions and 42 deletions
@@ -397,7 +397,7 @@ class GenerationState private constructor(
?.let { destination -> SignatureDumpingBuilderFactory(it, File(destination)) } ?: it
}
)
.wrapWith(ClassBuilderInterceptorExtension.getInstances(project)) { classBuilderFactory, extension ->
.wrapWith(loadClassBuilderInterceptors()) { classBuilderFactory, extension ->
extension.interceptClassBuilderFactory(classBuilderFactory, originalFrontendBindingContext, diagnostics)
}
@@ -405,6 +405,16 @@ class GenerationState private constructor(
this.factory = ClassFileFactory(this, interceptedBuilderFactory, finalizers)
}
@Suppress("UNCHECKED_CAST")
private fun loadClassBuilderInterceptors(): List<ClassBuilderInterceptorExtension> {
// Using Class.forName here because we're in the old JVM backend, and we need to load extensions declared in the JVM IR backend.
val adapted = Class.forName("org.jetbrains.kotlin.backend.jvm.extensions.ClassBuilderExtensionAdapter")
.getDeclaredMethod("getExtensions", Project::class.java)
.invoke(null, project) as List<ClassBuilderInterceptorExtension>
return ClassBuilderInterceptorExtension.getInstances(project) + adapted
}
fun beforeCompile() {
markUsed()
}