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 package org.jetbrains.kotlin.jvm.abi
import com.intellij.mock.MockProject 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.ClassBuilderInterceptorExtension
import org.jetbrains.kotlin.codegen.extensions.ClassFileFactoryFinalizerExtension import org.jetbrains.kotlin.codegen.extensions.ClassFileFactoryFinalizerExtension
import org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar 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. // Use the single-pass implementation, using the new ABI flag in the metadata.
configuration.put(JVMConfigurationKeys.RETAIN_OUTPUT_IN_MEMORY, true) configuration.put(JVMConfigurationKeys.RETAIN_OUTPUT_IN_MEMORY, true)
val builderExtension = JvmAbiClassBuilderInterceptor() 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) ClassBuilderInterceptorExtension.registerExtension(project, builderExtension)
ClassFileFactoryFinalizerExtension.registerExtension(project, outputExtension) 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.kotlin.load.java.JvmAnnotationNames
import org.jetbrains.org.objectweb.asm.* import org.jetbrains.org.objectweb.asm.*
import org.jetbrains.org.objectweb.asm.commons.Method 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 import java.io.File
class JvmAbiOutputExtension( class JvmAbiOutputExtension(
private val outputPath: File, private val outputPath: File,
private val abiClassInfos: Map<String, AbiClassInfo>, private val abiClassInfos: Map<String, AbiClassInfo>,
private val messageCollector: MessageCollector,
) : ClassFileFactoryFinalizerExtension { ) : ClassFileFactoryFinalizerExtension {
override fun finalizeClassFactory(factory: ClassFileFactory) { override fun finalizeClassFactory(factory: ClassFileFactory) {
// We need to wait until the end to produce any output in order to strip classes // 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) val outputFiles = AbiOutputFiles(abiClassInfos, factory)
if (outputPath.extension == "jar") { if (outputPath.extension == "jar") {
// We don't include the runtime or main class in interface jars and always reset time stamps. // 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 { } else {
outputFiles.writeAllTo(outputPath) outputFiles.writeAllTo(outputPath)
} }