From a54503cede2589c86d75779d3312989faff83d29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Steven=20Sch=C3=A4fer?= Date: Mon, 30 Nov 2020 14:01:28 +0100 Subject: [PATCH] JVM: Add an extension point for file output --- .../kotlin/codegen/ClassFileFactory.java | 8 +++++++- .../ClassFileFactoryFinalizerExtension.kt | 20 +++++++++++++++++++ .../kotlin/codegen/state/GenerationState.kt | 4 +++- .../cli/jvm/compiler/KotlinCoreEnvironment.kt | 2 ++ 4 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 compiler/backend/src/org/jetbrains/kotlin/codegen/extensions/ClassFileFactoryFinalizerExtension.kt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ClassFileFactory.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ClassFileFactory.java index 796c3a76ecf..87678e3e871 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ClassFileFactory.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ClassFileFactory.java @@ -26,6 +26,7 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.TestOnly; import org.jetbrains.kotlin.backend.common.output.OutputFile; import org.jetbrains.kotlin.backend.common.output.OutputFileCollection; +import org.jetbrains.kotlin.codegen.extensions.ClassFileFactoryFinalizerExtension; import org.jetbrains.kotlin.codegen.state.GenerationState; import org.jetbrains.kotlin.config.JvmAnalysisFlags; import org.jetbrains.kotlin.load.kotlin.ModuleMappingUtilKt; @@ -50,6 +51,7 @@ import static org.jetbrains.kotlin.codegen.JvmCodegenUtil.getMappingFileName; public class ClassFileFactory implements OutputFileCollection { private final GenerationState state; private final ClassBuilderFactory builderFactory; + private final List finalizers; private final Map generators = Collections.synchronizedMap(new LinkedHashMap<>()); private boolean isDone = false; @@ -57,9 +59,10 @@ public class ClassFileFactory implements OutputFileCollection { private final Set sourceFiles = new HashSet<>(); private final PackagePartRegistry packagePartRegistry = new PackagePartRegistry(); - public ClassFileFactory(@NotNull GenerationState state, @NotNull ClassBuilderFactory builderFactory) { + public ClassFileFactory(@NotNull GenerationState state, @NotNull ClassBuilderFactory builderFactory, @NotNull List finalizers) { this.state = state; this.builderFactory = builderFactory; + this.finalizers = finalizers; } public GenerationState getGenerationState() { @@ -111,6 +114,9 @@ public class ClassFileFactory implements OutputFileCollection { if (!isDone) { isDone = true; writeModuleMappings(); + for (ClassFileFactoryFinalizerExtension extension : finalizers) { + extension.finalizeClassFactory(this); + } } } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/extensions/ClassFileFactoryFinalizerExtension.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/extensions/ClassFileFactoryFinalizerExtension.kt new file mode 100644 index 00000000000..a0a57943b8d --- /dev/null +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/extensions/ClassFileFactoryFinalizerExtension.kt @@ -0,0 +1,20 @@ +/* + * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.codegen.extensions + +import org.jetbrains.kotlin.codegen.ClassFileFactory +import org.jetbrains.kotlin.extensions.ProjectExtensionDescriptor + +/** + * Extension point which is called after the compiler outputs have been finalized, + * which allows inspecting all output files, except for jar manifests. + */ +interface ClassFileFactoryFinalizerExtension { + companion object : ProjectExtensionDescriptor( + "org.jetbrains.kotlin.classFileFactoryFinalizerExtension", ClassFileFactoryFinalizerExtension::class.java) + + fun finalizeClassFactory(factory: ClassFileFactory) +} \ No newline at end of file diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/GenerationState.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/GenerationState.kt index bacb3991931..9aeab3aaecf 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/GenerationState.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/GenerationState.kt @@ -14,6 +14,7 @@ import org.jetbrains.kotlin.codegen.binding.CodegenBinding import org.jetbrains.kotlin.codegen.context.CodegenContext import org.jetbrains.kotlin.codegen.context.RootContext import org.jetbrains.kotlin.codegen.extensions.ClassBuilderInterceptorExtension +import org.jetbrains.kotlin.codegen.extensions.ClassFileFactoryFinalizerExtension import org.jetbrains.kotlin.codegen.inline.GlobalInlineContext import org.jetbrains.kotlin.codegen.inline.InlineCache import org.jetbrains.kotlin.codegen.intrinsics.IntrinsicMethods @@ -369,7 +370,8 @@ class GenerationState private constructor( extension.interceptClassBuilderFactory(classBuilderFactory, originalFrontendBindingContext, diagnostics) } - this.factory = ClassFileFactory(this, interceptedBuilderFactory) + val finalizers = ClassFileFactoryFinalizerExtension.getInstances(project) + this.factory = ClassFileFactory(this, interceptedBuilderFactory, finalizers) } fun beforeCompile() { diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment.kt index bc9bf8baa27..09b3d429051 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment.kt @@ -76,6 +76,7 @@ import org.jetbrains.kotlin.cli.jvm.modules.CliJavaModuleFinder import org.jetbrains.kotlin.cli.jvm.modules.CliJavaModuleResolver import org.jetbrains.kotlin.cli.jvm.modules.CoreJrtFileSystem import org.jetbrains.kotlin.codegen.extensions.ClassBuilderInterceptorExtension +import org.jetbrains.kotlin.codegen.extensions.ClassFileFactoryFinalizerExtension import org.jetbrains.kotlin.codegen.extensions.ExpressionCodegenExtension import org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar import org.jetbrains.kotlin.config.* @@ -641,6 +642,7 @@ class KotlinCoreEnvironment private constructor( SyntheticResolveExtension.registerExtensionPoint(project) SyntheticJavaResolveExtension.registerExtensionPoint(project) ClassBuilderInterceptorExtension.registerExtensionPoint(project) + ClassFileFactoryFinalizerExtension.registerExtensionPoint(project) AnalysisHandlerExtension.registerExtensionPoint(project) PackageFragmentProviderExtension.registerExtensionPoint(project) StorageComponentContainerContributor.registerExtensionPoint(project)