Add GenerationState to CodegenContext

This commit is contained in:
Alexander Udalov
2015-09-08 14:30:04 +03:00
parent 67d683bc59
commit 1ccd0f9fc2
9 changed files with 34 additions and 20 deletions
@@ -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();
@@ -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<CallableMemberDescriptor, Runnable> 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);
}
@@ -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 =
@@ -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<T extends DeclarationDescriptor> {
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<T extends DeclarationDescriptor> {
}
}
@NotNull
public GenerationState getState() {
return parentContext.getState();
}
@NotNull
public final ClassDescriptor getThisDescriptor() {
if (thisDescriptor == null) {
@@ -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<PackageFragmentDescriptor> {
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;
}
@@ -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);
@@ -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<RootContext.FakeDescriptor> {
public RootContext() {
public class RootContext extends CodegenContext<RootContext.FakeDescriptor> {
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
@@ -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);
@@ -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(