diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/JvmCodegenUtil.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/JvmCodegenUtil.java index 67bfbd9796a..d30453f87f7 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/JvmCodegenUtil.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/JvmCodegenUtil.java @@ -28,6 +28,7 @@ import org.jetbrains.kotlin.codegen.binding.CalculatedClosure; import org.jetbrains.kotlin.codegen.context.CodegenContext; import org.jetbrains.kotlin.codegen.context.MethodContext; import org.jetbrains.kotlin.codegen.context.PackageContext; +import org.jetbrains.kotlin.codegen.context.RootContext; import org.jetbrains.kotlin.codegen.state.JetTypeMapper; import org.jetbrains.kotlin.descriptors.*; import org.jetbrains.kotlin.load.java.descriptors.JavaClassDescriptor; @@ -108,7 +109,7 @@ public class JvmCodegenUtil { @NotNull CodegenContext context, @Nullable File outDirectory ) { - if (context == CodegenContext.STATIC) { + if (context instanceof RootContext) { return true; } DeclarationDescriptor contextDescriptor = context.getContextDescriptor(); diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/PackageCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/PackageCodegen.java index 52f52ff0da8..70f2d73b948 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/PackageCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/PackageCodegen.java @@ -169,7 +169,7 @@ public class PackageCodegen { generateCallableMemberTasks.put(member, new Runnable() { @Override public void run() { - FieldOwnerContext context = CodegenContext.STATIC.intoPackageFacade( + FieldOwnerContext context = state.getRootContext().intoPackageFacade( AsmUtil.asmTypeByFqNameWithoutInnerClasses(PackagePartClassUtils.getPackagePartFqName(member)), compiledPackageFragment ); @@ -313,7 +313,7 @@ public class PackageCodegen { private ClassBuilder generate(@NotNull JetFile file, @NotNull Map generateCallableMemberTasks) { boolean generatePackagePart = false; Type packagePartType = state.getFileClassesProvider().getFileClassType(file); - PackageContext packagePartContext = CodegenContext.STATIC.intoPackagePart(packageFragment, packagePartType); + PackageContext packagePartContext = state.getRootContext().intoPackagePart(packageFragment, packagePartType); for (JetDeclaration declaration : file.getDeclarations()) { if (declaration instanceof JetProperty || declaration instanceof JetNamedFunction) { @@ -345,7 +345,7 @@ public class PackageCodegen { new PackagePartCodegen(builder, file, packagePartType, packagePartContext, state).generate(); - FieldOwnerContext packageFacade = CodegenContext.STATIC.intoPackageFacade(packagePartType, packageFragment); + FieldOwnerContext packageFacade = state.getRootContext().intoPackageFacade(packagePartType, packageFragment); final MemberCodegen memberCodegen = createCodegenForPartOfPackageFacade(packageFacade); @@ -415,7 +415,7 @@ public class PackageCodegen { public void generateClassOrObject(@NotNull JetClassOrObject classOrObject) { JetFile file = classOrObject.getContainingJetFile(); Type packagePartType = state.getFileClassesProvider().getFileClassType(file); - CodegenContext context = CodegenContext.STATIC.intoPackagePart(packageFragment, packagePartType); + CodegenContext context = state.getRootContext().intoPackagePart(packageFragment, packagePartType); MemberCodegen.genClassOrObject(context, classOrObject, state, null); } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/SamWrapperCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/SamWrapperCodegen.java index fa8bdb10e25..1b4d0e4a853 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/SamWrapperCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/SamWrapperCodegen.java @@ -144,8 +144,8 @@ public class SamWrapperCodegen { SimpleFunctionDescriptor erasedInterfaceFunction, JetType functionJetType ) { - // using static context to avoid creating ClassDescriptor and everything else - FunctionCodegen codegen = new FunctionCodegen(CodegenContext.STATIC.intoClass( + // using root context to avoid creating ClassDescriptor and everything else + FunctionCodegen codegen = new FunctionCodegen(state.getRootContext().intoClass( (ClassDescriptor) erasedInterfaceFunction.getContainingDeclaration(), OwnerKind.IMPLEMENTATION, state), cv, state, parentCodegen); FunctionDescriptor invokeFunction = diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/context/CodegenContext.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/context/CodegenContext.java index 481ec4bdd06..1be0d8fa702 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/context/CodegenContext.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/context/CodegenContext.java @@ -39,8 +39,6 @@ import static org.jetbrains.org.objectweb.asm.Opcodes.ACC_PRIVATE; import static org.jetbrains.org.objectweb.asm.Opcodes.ACC_PROTECTED; public abstract class CodegenContext { - public static final CodegenContext STATIC = new RootContext(); - private final T contextDescriptor; private final OwnerKind contextKind; private final CodegenContext parentContext; @@ -78,6 +76,11 @@ public abstract class CodegenContext { } } + @NotNull + public GenerationState getState() { + return parentContext.getState(); + } + @NotNull public final ClassDescriptor getThisDescriptor() { if (thisDescriptor == null) { diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/context/PackageContext.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/context/PackageContext.java index 826bc1b780b..90a63cf0742 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/context/PackageContext.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/context/PackageContext.java @@ -17,16 +17,14 @@ package org.jetbrains.kotlin.codegen.context; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.codegen.OwnerKind; import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor; import org.jetbrains.org.objectweb.asm.Type; public class PackageContext extends FieldOwnerContext { - private final Type packagePartType; - public PackageContext(@NotNull PackageFragmentDescriptor contextDescriptor, @Nullable CodegenContext parent, Type packagePartType) { + public PackageContext(@NotNull PackageFragmentDescriptor contextDescriptor, @NotNull CodegenContext parent, Type packagePartType) { super(contextDescriptor, OwnerKind.PACKAGE, parent, null, null, null); this.packagePartType = packagePartType; } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/context/PackageFacadeContext.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/context/PackageFacadeContext.java index f9319ae9b0c..8260c8ae17a 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/context/PackageFacadeContext.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/context/PackageFacadeContext.java @@ -17,7 +17,6 @@ package org.jetbrains.kotlin.codegen.context; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor; import org.jetbrains.org.objectweb.asm.Type; @@ -25,7 +24,7 @@ public class PackageFacadeContext extends PackageContext { public PackageFacadeContext( @NotNull PackageFragmentDescriptor contextDescriptor, - @Nullable CodegenContext parent, + @NotNull CodegenContext parent, @NotNull Type delegateTo ) { super(contextDescriptor, parent, delegateTo); diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/context/RootContext.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/context/RootContext.java index 3e63db79663..7a34ed2807c 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/context/RootContext.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/context/RootContext.java @@ -18,15 +18,25 @@ package org.jetbrains.kotlin.codegen.context; import org.jetbrains.annotations.NotNull; import org.jetbrains.kotlin.codegen.OwnerKind; +import org.jetbrains.kotlin.codegen.state.GenerationState; import org.jetbrains.kotlin.descriptors.DeclarationDescriptor; import org.jetbrains.kotlin.descriptors.DeclarationDescriptorVisitor; import org.jetbrains.kotlin.descriptors.annotations.Annotations; import org.jetbrains.kotlin.name.Name; import org.jetbrains.kotlin.types.TypeSubstitutor; -class RootContext extends CodegenContext { - public RootContext() { +public class RootContext extends CodegenContext { + private final GenerationState state; + + public RootContext(@NotNull GenerationState state) { super(new FakeDescriptor(), OwnerKind.PACKAGE, null, null, null, null); + this.state = state; + } + + @Override + @NotNull + public GenerationState getState() { + return state; } @Override diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/InlineCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/InlineCodegen.java index 1d040069a92..34d8341d3bc 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/InlineCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/InlineCodegen.java @@ -589,7 +589,7 @@ public class InlineCodegen extends CallGenerator { public static CodegenContext getContext(DeclarationDescriptor descriptor, GenerationState state) { if (descriptor instanceof PackageFragmentDescriptor) { - return new PackageContext((PackageFragmentDescriptor) descriptor, null, null); + return new PackageContext((PackageFragmentDescriptor) descriptor, state.getRootContext(), null); } CodegenContext parent = getContext(descriptor.getContainingDeclaration(), state); 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 2898996728e..14e9a80e17d 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/GenerationState.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/GenerationState.kt @@ -21,6 +21,8 @@ import org.jetbrains.kotlin.builtins.ReflectionTypes import org.jetbrains.kotlin.codegen.* import org.jetbrains.kotlin.codegen.`when`.MappingsClassesForWhenByEnum 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.intrinsics.IntrinsicMethods import org.jetbrains.kotlin.codegen.optimization.OptimizationClassBuilderFactory @@ -60,9 +62,6 @@ public class GenerationState jvmOverloads constructor( public val incrementalCompilationComponents: IncrementalCompilationComponents? = null, public val progress: Progress = Progress.DEAF ) { - - public val moduleName: String = moduleName ?: JvmCodegenUtil.getModuleName(module) - public interface GenerateClassFilter { public fun shouldAnnotateClass(classOrObject: JetClassOrObject): Boolean public fun shouldGenerateClass(classOrObject: JetClassOrObject): Boolean @@ -111,6 +110,10 @@ public class GenerationState jvmOverloads constructor( public val isInlineEnabled: Boolean = !disableInline @jvmName("isInlineEnabled") get + public val moduleName: String = moduleName ?: JvmCodegenUtil.getModuleName(module) + + public val rootContext: CodegenContext<*> = RootContext(this) + init { val optimizationClassBuilderFactory = OptimizationClassBuilderFactory(builderFactory, disableOptimization) var interceptedBuilderFactory: ClassBuilderFactory = BuilderFactoryForDuplicateSignatureDiagnostics(