JVM: Add an extension point for file output
This commit is contained in:
committed by
Alexander Udalov
parent
de9d2919a8
commit
a54503cede
@@ -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<ClassFileFactoryFinalizerExtension> finalizers;
|
||||
private final Map<String, OutAndSourceFileList> generators = Collections.synchronizedMap(new LinkedHashMap<>());
|
||||
|
||||
private boolean isDone = false;
|
||||
@@ -57,9 +59,10 @@ public class ClassFileFactory implements OutputFileCollection {
|
||||
private final Set<File> 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<ClassFileFactoryFinalizerExtension> 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+20
@@ -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<ClassFileFactoryFinalizerExtension>(
|
||||
"org.jetbrains.kotlin.classFileFactoryFinalizerExtension", ClassFileFactoryFinalizerExtension::class.java)
|
||||
|
||||
fun finalizeClassFactory(factory: ClassFileFactory)
|
||||
}
|
||||
@@ -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() {
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user