jvm-abi-gen: Use the configured MessageCollector to write ABI jars

This commit is contained in:
Steven Schäfer
2021-08-19 14:14:49 +02:00
committed by Alexander Udalov
parent 6d518c8e57
commit 023db4f376
2 changed files with 17 additions and 3 deletions
@@ -6,6 +6,8 @@
package org.jetbrains.kotlin.jvm.abi
import com.intellij.mock.MockProject
import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys
import org.jetbrains.kotlin.cli.common.messages.MessageCollector
import org.jetbrains.kotlin.codegen.extensions.ClassBuilderInterceptorExtension
import org.jetbrains.kotlin.codegen.extensions.ClassFileFactoryFinalizerExtension
import org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar
@@ -30,7 +32,8 @@ class JvmAbiComponentRegistrar : ComponentRegistrar {
// Use the single-pass implementation, using the new ABI flag in the metadata.
configuration.put(JVMConfigurationKeys.RETAIN_OUTPUT_IN_MEMORY, true)
val builderExtension = JvmAbiClassBuilderInterceptor()
val outputExtension = JvmAbiOutputExtension(File(outputPath), builderExtension.abiClassInfo)
val messageCollector = configuration.get(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, MessageCollector.NONE)
val outputExtension = JvmAbiOutputExtension(File(outputPath), builderExtension.abiClassInfo, messageCollector)
ClassBuilderInterceptorExtension.registerExtension(project, builderExtension)
ClassFileFactoryFinalizerExtension.registerExtension(project, outputExtension)
}
@@ -16,12 +16,15 @@ import org.jetbrains.kotlin.codegen.extensions.ClassFileFactoryFinalizerExtensio
import org.jetbrains.kotlin.load.java.JvmAnnotationNames
import org.jetbrains.org.objectweb.asm.*
import org.jetbrains.org.objectweb.asm.commons.Method
import org.jetbrains.org.objectweb.asm.tree.*
import org.jetbrains.org.objectweb.asm.tree.AnnotationNode
import org.jetbrains.org.objectweb.asm.tree.FieldNode
import org.jetbrains.org.objectweb.asm.tree.ParameterNode
import java.io.File
class JvmAbiOutputExtension(
private val outputPath: File,
private val abiClassInfos: Map<String, AbiClassInfo>,
private val messageCollector: MessageCollector,
) : ClassFileFactoryFinalizerExtension {
override fun finalizeClassFactory(factory: ClassFileFactory) {
// We need to wait until the end to produce any output in order to strip classes
@@ -29,7 +32,15 @@ class JvmAbiOutputExtension(
val outputFiles = AbiOutputFiles(abiClassInfos, factory)
if (outputPath.extension == "jar") {
// We don't include the runtime or main class in interface jars and always reset time stamps.
CompileEnvironmentUtil.writeToJar(outputPath, false, true, true, null, outputFiles, MessageCollector.NONE)
CompileEnvironmentUtil.writeToJar(
outputPath,
false,
true,
true,
null,
outputFiles,
messageCollector
)
} else {
outputFiles.writeAllTo(outputPath)
}