Add GenerationState to CodegenContext
This commit is contained in:
@@ -28,6 +28,7 @@ import org.jetbrains.kotlin.codegen.binding.CalculatedClosure;
|
|||||||
import org.jetbrains.kotlin.codegen.context.CodegenContext;
|
import org.jetbrains.kotlin.codegen.context.CodegenContext;
|
||||||
import org.jetbrains.kotlin.codegen.context.MethodContext;
|
import org.jetbrains.kotlin.codegen.context.MethodContext;
|
||||||
import org.jetbrains.kotlin.codegen.context.PackageContext;
|
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.codegen.state.JetTypeMapper;
|
||||||
import org.jetbrains.kotlin.descriptors.*;
|
import org.jetbrains.kotlin.descriptors.*;
|
||||||
import org.jetbrains.kotlin.load.java.descriptors.JavaClassDescriptor;
|
import org.jetbrains.kotlin.load.java.descriptors.JavaClassDescriptor;
|
||||||
@@ -108,7 +109,7 @@ public class JvmCodegenUtil {
|
|||||||
@NotNull CodegenContext context,
|
@NotNull CodegenContext context,
|
||||||
@Nullable File outDirectory
|
@Nullable File outDirectory
|
||||||
) {
|
) {
|
||||||
if (context == CodegenContext.STATIC) {
|
if (context instanceof RootContext) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
DeclarationDescriptor contextDescriptor = context.getContextDescriptor();
|
DeclarationDescriptor contextDescriptor = context.getContextDescriptor();
|
||||||
|
|||||||
@@ -169,7 +169,7 @@ public class PackageCodegen {
|
|||||||
generateCallableMemberTasks.put(member, new Runnable() {
|
generateCallableMemberTasks.put(member, new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
FieldOwnerContext context = CodegenContext.STATIC.intoPackageFacade(
|
FieldOwnerContext context = state.getRootContext().intoPackageFacade(
|
||||||
AsmUtil.asmTypeByFqNameWithoutInnerClasses(PackagePartClassUtils.getPackagePartFqName(member)),
|
AsmUtil.asmTypeByFqNameWithoutInnerClasses(PackagePartClassUtils.getPackagePartFqName(member)),
|
||||||
compiledPackageFragment
|
compiledPackageFragment
|
||||||
);
|
);
|
||||||
@@ -313,7 +313,7 @@ public class PackageCodegen {
|
|||||||
private ClassBuilder generate(@NotNull JetFile file, @NotNull Map<CallableMemberDescriptor, Runnable> generateCallableMemberTasks) {
|
private ClassBuilder generate(@NotNull JetFile file, @NotNull Map<CallableMemberDescriptor, Runnable> generateCallableMemberTasks) {
|
||||||
boolean generatePackagePart = false;
|
boolean generatePackagePart = false;
|
||||||
Type packagePartType = state.getFileClassesProvider().getFileClassType(file);
|
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()) {
|
for (JetDeclaration declaration : file.getDeclarations()) {
|
||||||
if (declaration instanceof JetProperty || declaration instanceof JetNamedFunction) {
|
if (declaration instanceof JetProperty || declaration instanceof JetNamedFunction) {
|
||||||
@@ -345,7 +345,7 @@ public class PackageCodegen {
|
|||||||
|
|
||||||
new PackagePartCodegen(builder, file, packagePartType, packagePartContext, state).generate();
|
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);
|
final MemberCodegen<?> memberCodegen = createCodegenForPartOfPackageFacade(packageFacade);
|
||||||
|
|
||||||
@@ -415,7 +415,7 @@ public class PackageCodegen {
|
|||||||
public void generateClassOrObject(@NotNull JetClassOrObject classOrObject) {
|
public void generateClassOrObject(@NotNull JetClassOrObject classOrObject) {
|
||||||
JetFile file = classOrObject.getContainingJetFile();
|
JetFile file = classOrObject.getContainingJetFile();
|
||||||
Type packagePartType = state.getFileClassesProvider().getFileClassType(file);
|
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);
|
MemberCodegen.genClassOrObject(context, classOrObject, state, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -144,8 +144,8 @@ public class SamWrapperCodegen {
|
|||||||
SimpleFunctionDescriptor erasedInterfaceFunction,
|
SimpleFunctionDescriptor erasedInterfaceFunction,
|
||||||
JetType functionJetType
|
JetType functionJetType
|
||||||
) {
|
) {
|
||||||
// using static context to avoid creating ClassDescriptor and everything else
|
// using root context to avoid creating ClassDescriptor and everything else
|
||||||
FunctionCodegen codegen = new FunctionCodegen(CodegenContext.STATIC.intoClass(
|
FunctionCodegen codegen = new FunctionCodegen(state.getRootContext().intoClass(
|
||||||
(ClassDescriptor) erasedInterfaceFunction.getContainingDeclaration(), OwnerKind.IMPLEMENTATION, state), cv, state, parentCodegen);
|
(ClassDescriptor) erasedInterfaceFunction.getContainingDeclaration(), OwnerKind.IMPLEMENTATION, state), cv, state, parentCodegen);
|
||||||
|
|
||||||
FunctionDescriptor invokeFunction =
|
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;
|
import static org.jetbrains.org.objectweb.asm.Opcodes.ACC_PROTECTED;
|
||||||
|
|
||||||
public abstract class CodegenContext<T extends DeclarationDescriptor> {
|
public abstract class CodegenContext<T extends DeclarationDescriptor> {
|
||||||
public static final CodegenContext STATIC = new RootContext();
|
|
||||||
|
|
||||||
private final T contextDescriptor;
|
private final T contextDescriptor;
|
||||||
private final OwnerKind contextKind;
|
private final OwnerKind contextKind;
|
||||||
private final CodegenContext parentContext;
|
private final CodegenContext parentContext;
|
||||||
@@ -78,6 +76,11 @@ public abstract class CodegenContext<T extends DeclarationDescriptor> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
public GenerationState getState() {
|
||||||
|
return parentContext.getState();
|
||||||
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public final ClassDescriptor getThisDescriptor() {
|
public final ClassDescriptor getThisDescriptor() {
|
||||||
if (thisDescriptor == null) {
|
if (thisDescriptor == null) {
|
||||||
|
|||||||
@@ -17,16 +17,14 @@
|
|||||||
package org.jetbrains.kotlin.codegen.context;
|
package org.jetbrains.kotlin.codegen.context;
|
||||||
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
|
||||||
import org.jetbrains.kotlin.codegen.OwnerKind;
|
import org.jetbrains.kotlin.codegen.OwnerKind;
|
||||||
import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor;
|
import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor;
|
||||||
import org.jetbrains.org.objectweb.asm.Type;
|
import org.jetbrains.org.objectweb.asm.Type;
|
||||||
|
|
||||||
public class PackageContext extends FieldOwnerContext<PackageFragmentDescriptor> {
|
public class PackageContext extends FieldOwnerContext<PackageFragmentDescriptor> {
|
||||||
|
|
||||||
private final Type packagePartType;
|
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);
|
super(contextDescriptor, OwnerKind.PACKAGE, parent, null, null, null);
|
||||||
this.packagePartType = packagePartType;
|
this.packagePartType = packagePartType;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,7 +17,6 @@
|
|||||||
package org.jetbrains.kotlin.codegen.context;
|
package org.jetbrains.kotlin.codegen.context;
|
||||||
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
|
||||||
import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor;
|
import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor;
|
||||||
import org.jetbrains.org.objectweb.asm.Type;
|
import org.jetbrains.org.objectweb.asm.Type;
|
||||||
|
|
||||||
@@ -25,7 +24,7 @@ public class PackageFacadeContext extends PackageContext {
|
|||||||
|
|
||||||
public PackageFacadeContext(
|
public PackageFacadeContext(
|
||||||
@NotNull PackageFragmentDescriptor contextDescriptor,
|
@NotNull PackageFragmentDescriptor contextDescriptor,
|
||||||
@Nullable CodegenContext parent,
|
@NotNull CodegenContext parent,
|
||||||
@NotNull Type delegateTo
|
@NotNull Type delegateTo
|
||||||
) {
|
) {
|
||||||
super(contextDescriptor, parent, delegateTo);
|
super(contextDescriptor, parent, delegateTo);
|
||||||
|
|||||||
@@ -18,15 +18,25 @@ package org.jetbrains.kotlin.codegen.context;
|
|||||||
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.kotlin.codegen.OwnerKind;
|
import org.jetbrains.kotlin.codegen.OwnerKind;
|
||||||
|
import org.jetbrains.kotlin.codegen.state.GenerationState;
|
||||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor;
|
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor;
|
||||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptorVisitor;
|
import org.jetbrains.kotlin.descriptors.DeclarationDescriptorVisitor;
|
||||||
import org.jetbrains.kotlin.descriptors.annotations.Annotations;
|
import org.jetbrains.kotlin.descriptors.annotations.Annotations;
|
||||||
import org.jetbrains.kotlin.name.Name;
|
import org.jetbrains.kotlin.name.Name;
|
||||||
import org.jetbrains.kotlin.types.TypeSubstitutor;
|
import org.jetbrains.kotlin.types.TypeSubstitutor;
|
||||||
|
|
||||||
class RootContext extends CodegenContext<RootContext.FakeDescriptor> {
|
public class RootContext extends CodegenContext<RootContext.FakeDescriptor> {
|
||||||
public RootContext() {
|
private final GenerationState state;
|
||||||
|
|
||||||
|
public RootContext(@NotNull GenerationState state) {
|
||||||
super(new FakeDescriptor(), OwnerKind.PACKAGE, null, null, null, null);
|
super(new FakeDescriptor(), OwnerKind.PACKAGE, null, null, null, null);
|
||||||
|
this.state = state;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@NotNull
|
||||||
|
public GenerationState getState() {
|
||||||
|
return state;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -589,7 +589,7 @@ public class InlineCodegen extends CallGenerator {
|
|||||||
|
|
||||||
public static CodegenContext getContext(DeclarationDescriptor descriptor, GenerationState state) {
|
public static CodegenContext getContext(DeclarationDescriptor descriptor, GenerationState state) {
|
||||||
if (descriptor instanceof PackageFragmentDescriptor) {
|
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);
|
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.*
|
||||||
import org.jetbrains.kotlin.codegen.`when`.MappingsClassesForWhenByEnum
|
import org.jetbrains.kotlin.codegen.`when`.MappingsClassesForWhenByEnum
|
||||||
import org.jetbrains.kotlin.codegen.binding.CodegenBinding
|
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.ClassBuilderInterceptorExtension
|
||||||
import org.jetbrains.kotlin.codegen.intrinsics.IntrinsicMethods
|
import org.jetbrains.kotlin.codegen.intrinsics.IntrinsicMethods
|
||||||
import org.jetbrains.kotlin.codegen.optimization.OptimizationClassBuilderFactory
|
import org.jetbrains.kotlin.codegen.optimization.OptimizationClassBuilderFactory
|
||||||
@@ -60,9 +62,6 @@ public class GenerationState jvmOverloads constructor(
|
|||||||
public val incrementalCompilationComponents: IncrementalCompilationComponents? = null,
|
public val incrementalCompilationComponents: IncrementalCompilationComponents? = null,
|
||||||
public val progress: Progress = Progress.DEAF
|
public val progress: Progress = Progress.DEAF
|
||||||
) {
|
) {
|
||||||
|
|
||||||
public val moduleName: String = moduleName ?: JvmCodegenUtil.getModuleName(module)
|
|
||||||
|
|
||||||
public interface GenerateClassFilter {
|
public interface GenerateClassFilter {
|
||||||
public fun shouldAnnotateClass(classOrObject: JetClassOrObject): Boolean
|
public fun shouldAnnotateClass(classOrObject: JetClassOrObject): Boolean
|
||||||
public fun shouldGenerateClass(classOrObject: JetClassOrObject): Boolean
|
public fun shouldGenerateClass(classOrObject: JetClassOrObject): Boolean
|
||||||
@@ -111,6 +110,10 @@ public class GenerationState jvmOverloads constructor(
|
|||||||
public val isInlineEnabled: Boolean = !disableInline
|
public val isInlineEnabled: Boolean = !disableInline
|
||||||
@jvmName("isInlineEnabled") get
|
@jvmName("isInlineEnabled") get
|
||||||
|
|
||||||
|
public val moduleName: String = moduleName ?: JvmCodegenUtil.getModuleName(module)
|
||||||
|
|
||||||
|
public val rootContext: CodegenContext<*> = RootContext(this)
|
||||||
|
|
||||||
init {
|
init {
|
||||||
val optimizationClassBuilderFactory = OptimizationClassBuilderFactory(builderFactory, disableOptimization)
|
val optimizationClassBuilderFactory = OptimizationClassBuilderFactory(builderFactory, disableOptimization)
|
||||||
var interceptedBuilderFactory: ClassBuilderFactory = BuilderFactoryForDuplicateSignatureDiagnostics(
|
var interceptedBuilderFactory: ClassBuilderFactory = BuilderFactoryForDuplicateSignatureDiagnostics(
|
||||||
|
|||||||
Reference in New Issue
Block a user