Refactor codegen hierarchy

- pull generate() and a bunch of abstract methods from ClassBodyCodegen up to
  MemberCodegen
- implement these methods in ScriptCodegen and PackagePartCodegen
- make MemberCodegen generic on the type of the element it is generating
This commit is contained in:
Alexander Udalov
2014-04-23 21:50:01 +04:00
parent ff8e282c4a
commit 1efdd33dbd
18 changed files with 166 additions and 164 deletions
@@ -33,9 +33,8 @@ import java.util.Collections;
import java.util.List;
import static org.jetbrains.jet.codegen.binding.CodegenBinding.enumEntryNeedSubclass;
import static org.jetbrains.org.objectweb.asm.Opcodes.RETURN;
public abstract class ClassBodyCodegen extends MemberCodegen {
public abstract class ClassBodyCodegen extends MemberCodegen<JetClassOrObject> {
protected final JetClassOrObject myClass;
protected final OwnerKind kind;
protected final ClassDescriptor descriptor;
@@ -45,34 +44,16 @@ public abstract class ClassBodyCodegen extends MemberCodegen {
@NotNull ClassContext context,
@NotNull ClassBuilder v,
@NotNull GenerationState state,
@Nullable MemberCodegen parentCodegen
@Nullable MemberCodegen<?> parentCodegen
) {
super(state, parentCodegen, context, v);
super(state, parentCodegen, context, aClass, v);
myClass = aClass;
kind = context.getContextKind();
descriptor = bindingContext.get(BindingContext.CLASS, aClass);
}
public void generate() {
generateDeclaration();
generateClassBody();
generateSyntheticParts();
completeStaticInitializer();
generateKotlinAnnotation();
}
protected abstract void generateDeclaration();
protected abstract void generateKotlinAnnotation();
protected void generateSyntheticParts() {
}
private void generateClassBody() {
@Override
protected void generateBody() {
FunctionCodegen functionCodegen = new FunctionCodegen(context, v, state, this);
PropertyCodegen propertyCodegen = new PropertyCodegen(context, v, functionCodegen, this);
@@ -150,11 +131,4 @@ public abstract class ClassBodyCodegen extends MemberCodegen {
}
return Collections.emptyList();
}
private void completeStaticInitializer() {
if (clInit != null) {
clInit.v.visitInsn(RETURN);
FunctionCodegen.endVisit(clInit.v, "static initializer", myClass);
}
}
}
@@ -21,10 +21,6 @@ import com.intellij.psi.PsiElement;
import com.intellij.util.ArrayUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.org.objectweb.asm.MethodVisitor;
import org.jetbrains.org.objectweb.asm.Type;
import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter;
import org.jetbrains.org.objectweb.asm.commons.Method;
import org.jetbrains.jet.codegen.binding.CalculatedClosure;
import org.jetbrains.jet.codegen.context.CodegenContext;
import org.jetbrains.jet.codegen.context.LocalLookup;
@@ -40,15 +36,19 @@ import org.jetbrains.jet.lang.resolve.java.sam.SingleAbstractMethodUtils;
import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.types.JetType;
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns;
import org.jetbrains.org.objectweb.asm.MethodVisitor;
import org.jetbrains.org.objectweb.asm.Type;
import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter;
import org.jetbrains.org.objectweb.asm.commons.Method;
import java.util.Collection;
import java.util.List;
import static org.jetbrains.org.objectweb.asm.Opcodes.*;
import static org.jetbrains.jet.codegen.AsmUtil.*;
import static org.jetbrains.jet.codegen.CodegenUtil.isConst;
import static org.jetbrains.jet.codegen.binding.CodegenBinding.*;
import static org.jetbrains.jet.lang.resolve.java.JvmAnnotationNames.KotlinSyntheticClass;
import static org.jetbrains.org.objectweb.asm.Opcodes.*;
public class ClosureCodegen extends ParentCodegenAwareImpl {
private final PsiElement fun;
@@ -74,7 +74,7 @@ public class ClosureCodegen extends ParentCodegenAwareImpl {
@NotNull KotlinSyntheticClass.Kind syntheticClassKind,
@NotNull LocalLookup localLookup,
@NotNull FunctionGenerationStrategy strategy,
@Nullable MemberCodegen parentCodegen
@Nullable MemberCodegen<?> parentCodegen
) {
super(state, parentCodegen);
@@ -16,12 +16,9 @@
package org.jetbrains.jet.codegen;
import com.intellij.openapi.util.Condition;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.containers.Stack;
import jet.runtime.typeinfo.JetValueParameter;
import kotlin.Function1;
import kotlin.KotlinPackage;
import org.jetbrains.annotations.NotNull;
@@ -240,12 +237,11 @@ public class CodegenUtil {
}
@NotNull
public static ImplementationBodyCodegen getParentBodyCodegen(@Nullable MemberCodegen classBodyCodegen) {
assert classBodyCodegen != null &&
classBodyCodegen
.getParentCodegen() instanceof ImplementationBodyCodegen : "Class object should have appropriate parent BodyCodegen";
public static ImplementationBodyCodegen getParentBodyCodegen(@Nullable MemberCodegen<?> classBodyCodegen) {
assert classBodyCodegen != null && classBodyCodegen.getParentCodegen() instanceof ImplementationBodyCodegen
: "Class object should have appropriate parent BodyCodegen";
return ((ImplementationBodyCodegen) classBodyCodegen.getParentCodegen());
return (ImplementationBodyCodegen) classBodyCodegen.getParentCodegen();
}
static int getPathHashCode(@NotNull VirtualFile file) {
@@ -99,7 +99,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
private final Stack<BlockStackElement> blockStackElements = new Stack<BlockStackElement>();
@Nullable
private final MemberCodegen parentCodegen;
private final MemberCodegen<?> parentCodegen;
/*
* When we create a temporary variable to hold some value not to compute it many times
@@ -120,16 +120,11 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
ClassDescriptor classDescriptor = bindingContext.get(CLASS, objectDeclaration);
assert classDescriptor != null;
//noinspection SuspiciousMethodCalls
CalculatedClosure closure = bindingContext.get(CLOSURE, classDescriptor);
ClassContext objectContext = context.intoAnonymousClass(classDescriptor, this);
ImplementationBodyCodegen implementationBodyCodegen =
new ImplementationBodyCodegen(objectDeclaration, objectContext, classBuilder, state, getParentCodegen());
implementationBodyCodegen.generate();
new ImplementationBodyCodegen(objectDeclaration, objectContext, classBuilder, state, getParentCodegen()).generate();
return closure;
return bindingContext.get(CLOSURE, classDescriptor);
}
static class BlockStackElement {
@@ -167,7 +162,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
@NotNull Type returnType,
@NotNull MethodContext context,
@NotNull GenerationState state,
@Nullable MemberCodegen parentCodegen
@Nullable MemberCodegen<?> parentCodegen
) {
this.myFrameMap = myMap;
this.parentCodegen = parentCodegen;
@@ -209,7 +204,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
@Nullable
@Override
public MemberCodegen getParentCodegen() {
public MemberCodegen<?> getParentCodegen() {
return parentCodegen;
}
@@ -279,7 +274,6 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
ClassContext objectContext = context.intoAnonymousClass(descriptor, this);
new ImplementationBodyCodegen(declaration, objectContext, classBuilder, state, getParentCodegen()).generate();
classBuilder.done();
return StackValue.none();
}
@@ -3778,7 +3772,7 @@ The "returned" value of try expression with no finally is either the last expres
@NotNull
private ScriptCodegen getParentScriptCodegen() {
MemberCodegen codegen = parentCodegen;
MemberCodegen<?> codegen = parentCodegen;
while (codegen != null) {
if (codegen instanceof ScriptCodegen) {
return (ScriptCodegen) codegen;
@@ -80,7 +80,12 @@ public class FunctionCodegen extends ParentCodegenAwareImpl {
private final ClassBuilder v;
public FunctionCodegen(@NotNull CodegenContext owner, @NotNull ClassBuilder v, @NotNull GenerationState state, MemberCodegen parentCodegen) {
public FunctionCodegen(
@NotNull CodegenContext owner,
@NotNull ClassBuilder v,
@NotNull GenerationState state,
MemberCodegen<?> parentCodegen
) {
super(state, parentCodegen);
this.owner = owner;
this.v = v;
@@ -277,7 +282,7 @@ public class FunctionCodegen extends ParentCodegenAwareImpl {
@NotNull MethodContext context,
@NotNull JvmMethodSignature signature,
@NotNull FunctionGenerationStrategy strategy,
@NotNull MemberCodegen parentCodegen
@NotNull MemberCodegen<?> parentCodegen
) {
mv.visitCode();
@@ -18,13 +18,13 @@ package org.jetbrains.jet.codegen;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.org.objectweb.asm.MethodVisitor;
import org.jetbrains.jet.codegen.context.MethodContext;
import org.jetbrains.jet.codegen.signature.JvmMethodSignature;
import org.jetbrains.jet.codegen.state.GenerationState;
import org.jetbrains.jet.codegen.state.JetTypeMapper;
import org.jetbrains.jet.lang.descriptors.CallableDescriptor;
import org.jetbrains.jet.lang.psi.JetDeclarationWithBody;
import org.jetbrains.org.objectweb.asm.MethodVisitor;
public abstract class FunctionGenerationStrategy {
@@ -34,7 +34,7 @@ public abstract class FunctionGenerationStrategy {
@NotNull MethodVisitor mv,
@NotNull JvmMethodSignature signature,
@NotNull MethodContext context,
@Nullable MemberCodegen parentCodegen
@Nullable MemberCodegen<?> parentCodegen
);
@NotNull
@@ -82,7 +82,7 @@ public abstract class FunctionGenerationStrategy {
@NotNull MethodVisitor mv,
@NotNull JvmMethodSignature signature,
@NotNull MethodContext context,
@Nullable MemberCodegen parentCodegen
@Nullable MemberCodegen<?> parentCodegen
) {
ExpressionCodegen codegen = new ExpressionCodegen(mv, getFrameMap(state.getTypeMapper(), context),
signature.getReturnType(), context, state, parentCodegen);
@@ -84,10 +84,10 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
public ImplementationBodyCodegen(
@NotNull JetClassOrObject aClass,
@NotNull ClassContext context,
@NotNull ClassBuilder v,
@NotNull GenerationState state,
@Nullable MemberCodegen parentCodegen
@NotNull ClassContext context,
@NotNull ClassBuilder v,
@NotNull GenerationState state,
@Nullable MemberCodegen<?> parentCodegen
) {
super(aClass, context, v, state, parentCodegen);
this.classAsmType = typeMapper.mapClass(descriptor);
@@ -478,7 +478,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
private void generateDelegatedPropertyMetadataArray() {
if (state.getClassBuilderMode() == ClassBuilderMode.FULL) {
generatePropertyMetadataArrayFieldIfNeeded(classAsmType, myClass);
generatePropertyMetadataArrayFieldIfNeeded(classAsmType);
}
}
@@ -875,7 +875,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
@NotNull MethodVisitor mv,
@NotNull JvmMethodSignature signature,
@NotNull MethodContext context,
@Nullable MemberCodegen parentCodegen
@Nullable MemberCodegen<?> parentCodegen
) {
Type componentType = signature.getReturnType();
InstructionAdapter iv = new InstructionAdapter(mv);
@@ -900,7 +900,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
@NotNull MethodVisitor mv,
@NotNull JvmMethodSignature signature,
@NotNull MethodContext context,
@Nullable MemberCodegen parentCodegen
@Nullable MemberCodegen<?> parentCodegen
) {
InstructionAdapter iv = new InstructionAdapter(mv);
@@ -1280,14 +1280,14 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
final ImplementationBodyCodegen parentCodegen = getParentBodyCodegen(this);
//generate object$
parentCodegen.genInitSingleton(descriptor, StackValue.singleton(descriptor, typeMapper));
generateInitializers(myClass.getDeclarations(), new Function0<ExpressionCodegen>() {
generateInitializers(new Function0<ExpressionCodegen>() {
@Override
public ExpressionCodegen invoke() {
return parentCodegen.createOrGetClInitCodegen();
}
});
} else {
generateInitializers(myClass.getDeclarations(), new Function0<ExpressionCodegen>() {
generateInitializers(new Function0<ExpressionCodegen>() {
@Override
public ExpressionCodegen invoke() {
return codegen;
@@ -55,7 +55,8 @@ import static org.jetbrains.jet.lang.resolve.BindingContext.VARIABLE;
import static org.jetbrains.jet.lang.resolve.java.AsmTypeConstants.*;
import static org.jetbrains.org.objectweb.asm.Opcodes.*;
public abstract class MemberCodegen extends ParentCodegenAwareImpl {
public abstract class MemberCodegen<T extends JetElement/* TODO: & JetDeclarationContainer*/> extends ParentCodegenAwareImpl {
protected final T element;
protected final FieldOwnerContext context;
protected final ClassBuilder v;
protected ExpressionCodegen clInit;
@@ -64,15 +65,47 @@ public abstract class MemberCodegen extends ParentCodegenAwareImpl {
public MemberCodegen(
@NotNull GenerationState state,
@Nullable MemberCodegen parentCodegen,
@Nullable MemberCodegen<?> parentCodegen,
@NotNull FieldOwnerContext context,
T element,
ClassBuilder builder
) {
super(state, parentCodegen);
this.element = element;
this.context = context;
this.v = builder;
}
public void generate() {
generateDeclaration();
generateBody();
generateSyntheticParts();
generateKotlinAnnotation();
done();
}
protected abstract void generateDeclaration();
protected abstract void generateBody();
protected void generateSyntheticParts() {
}
protected abstract void generateKotlinAnnotation();
private void done() {
if (clInit != null) {
clInit.v.visitInsn(RETURN);
FunctionCodegen.endVisit(clInit.v, "static initializer", element);
}
v.done();
}
public void genFunctionOrProperty(
@NotNull JetTypeParameterListOwner functionOrProperty,
@NotNull ClassBuilder classBuilder
@@ -115,7 +148,7 @@ public abstract class MemberCodegen extends ParentCodegenAwareImpl {
@NotNull CodegenContext parentContext,
@NotNull JetClassOrObject aClass,
@NotNull GenerationState state,
@Nullable MemberCodegen parentCodegen
@Nullable MemberCodegen<?> parentCodegen
) {
ClassDescriptor descriptor = state.getBindingContext().get(BindingContext.CLASS, aClass);
@@ -131,13 +164,11 @@ public abstract class MemberCodegen extends ParentCodegenAwareImpl {
ClassBuilder classBuilder = state.getFactory().forClassImplementation(descriptor, aClass.getContainingFile());
ClassContext classContext = parentContext.intoClass(descriptor, OwnerKind.IMPLEMENTATION, state);
new ImplementationBodyCodegen(aClass, classContext, classBuilder, state, parentCodegen).generate();
classBuilder.done();
if (aClass instanceof JetClass && ((JetClass) aClass).isTrait()) {
ClassBuilder traitBuilder = state.getFactory().forTraitImplementation(descriptor, state, aClass.getContainingFile());
new TraitImplBodyCodegen(aClass, parentContext.intoClass(descriptor, OwnerKind.TRAIT_IMPL, state), traitBuilder, state, parentCodegen)
.generate();
traitBuilder.done();
ClassBuilder traitImplBuilder = state.getFactory().forTraitImplementation(descriptor, state, aClass.getContainingFile());
ClassContext traitImplContext = parentContext.intoClass(descriptor, OwnerKind.TRAIT_IMPL, state);
new TraitImplBodyCodegen(aClass, traitImplContext, traitImplBuilder, state, parentCodegen).generate();
}
}
@@ -151,11 +182,6 @@ public abstract class MemberCodegen extends ParentCodegenAwareImpl {
genClassOrObject(context, aClass, state, this);
}
@NotNull
public ClassBuilder getBuilder() {
return v;
}
@NotNull
public NameGenerator getInlineNameGenerator() {
if (inlineNameGenerator == null) {
@@ -183,9 +209,9 @@ public abstract class MemberCodegen extends ParentCodegenAwareImpl {
return clInit;
}
protected void generateInitializers(@NotNull List<JetDeclaration> declarations, @NotNull Function0<ExpressionCodegen> createCodegen) {
protected void generateInitializers(@NotNull Function0<ExpressionCodegen> createCodegen) {
NotNullLazyValue<ExpressionCodegen> codegen = LockBasedStorageManager.NO_LOCKS.createLazyValue(createCodegen);
for (JetDeclaration declaration : declarations) {
for (JetDeclaration declaration : ((JetDeclarationContainer) element).getDeclarations()) {
if (declaration instanceof JetProperty) {
if (shouldInitializeProperty((JetProperty) declaration)) {
initializeProperty(codegen.invoke(), (JetProperty) declaration);
@@ -197,7 +223,7 @@ public abstract class MemberCodegen extends ParentCodegenAwareImpl {
}
}
protected void initializeProperty(@NotNull ExpressionCodegen codegen, @NotNull JetProperty property) {
private void initializeProperty(@NotNull ExpressionCodegen codegen, @NotNull JetProperty property) {
PropertyDescriptor propertyDescriptor = (PropertyDescriptor) bindingContext.get(VARIABLE, property);
assert propertyDescriptor != null;
@@ -221,7 +247,7 @@ public abstract class MemberCodegen extends ParentCodegenAwareImpl {
propValue.store(type, codegen.v);
}
protected boolean shouldInitializeProperty(@NotNull JetProperty property) {
private boolean shouldInitializeProperty(@NotNull JetProperty property) {
JetExpression initializer = property.getDelegateExpressionOrInitializer();
if (initializer == null) return false;
@@ -287,9 +313,9 @@ public abstract class MemberCodegen extends ParentCodegenAwareImpl {
return false;
}
protected void generatePropertyMetadataArrayFieldIfNeeded(@NotNull Type thisAsmType, @NotNull JetDeclarationContainer container) {
protected void generatePropertyMetadataArrayFieldIfNeeded(@NotNull Type thisAsmType) {
List<JetProperty> delegatedProperties = new ArrayList<JetProperty>();
for (JetDeclaration declaration : container.getDeclarations()) {
for (JetDeclaration declaration : ((JetDeclarationContainer) element).getDeclarations()) {
if (declaration instanceof JetProperty) {
JetProperty property = (JetProperty) declaration;
if (property.getDelegate() != null) {
@@ -167,7 +167,7 @@ public class PackageCodegen extends GenerationStateAware {
@NotNull MethodVisitor mv,
@NotNull JvmMethodSignature signature,
@NotNull MethodContext context,
@Nullable MemberCodegen parentCodegen
@Nullable MemberCodegen<?> parentCodegen
) {
throw new IllegalStateException("shouldn't be called");
}
@@ -295,7 +295,7 @@ public class PackageCodegen extends GenerationStateAware {
FieldOwnerContext packageFacade = CodegenContext.STATIC.intoPackageFacade(packagePartType, packageFragment);
final MemberCodegen memberCodegen = getMemberCodegen(packageFacade);
final MemberCodegen<?> memberCodegen = getMemberCodegen(packageFacade);
for (final JetDeclaration declaration : file.getDeclarations()) {
if (declaration instanceof JetNamedFunction || declaration instanceof JetProperty) {
@@ -307,8 +307,7 @@ public class PackageCodegen extends GenerationStateAware {
new Runnable() {
@Override
public void run() {
memberCodegen.genFunctionOrProperty(
(JetTypeParameterListOwner) declaration, v.getClassBuilder());
memberCodegen.genFunctionOrProperty((JetTypeParameterListOwner) declaration, v.getClassBuilder());
}
}
);
@@ -319,12 +318,21 @@ public class PackageCodegen extends GenerationStateAware {
}
//TODO: FIX: Default method generated at facade without delegation
private MemberCodegen getMemberCodegen(@NotNull FieldOwnerContext packageFacade) {
return new MemberCodegen(state, null, packageFacade, null) {
@NotNull
private MemberCodegen<?> getMemberCodegen(@NotNull FieldOwnerContext packageFacade) {
return new MemberCodegen<JetFile>(state, null, packageFacade, null, null) {
@Override
public ClassBuilder getBuilder() {
return PackageCodegen.this.v.getClassBuilder();
protected void generateDeclaration() {
throw new UnsupportedOperationException();
}
@Override
protected void generateBody() {
throw new UnsupportedOperationException();
}
@Override
protected void generateKotlinAnnotation() {
throw new UnsupportedOperationException();
}
};
}
@@ -24,64 +24,63 @@ import org.jetbrains.jet.codegen.state.GenerationState;
import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.org.objectweb.asm.Type;
import java.util.List;
import static org.jetbrains.jet.codegen.AsmUtil.writeKotlinSyntheticClassAnnotation;
import static org.jetbrains.jet.lang.resolve.java.JvmAnnotationNames.KotlinSyntheticClass;
import static org.jetbrains.org.objectweb.asm.Opcodes.*;
public class PackagePartCodegen extends MemberCodegen {
private final JetFile jetFile;
public class PackagePartCodegen extends MemberCodegen<JetFile> {
private final Type packagePartType;
public PackagePartCodegen(
@NotNull ClassBuilder v,
@NotNull JetFile jetFile,
@NotNull JetFile file,
@NotNull Type packagePartType,
@NotNull FieldOwnerContext context,
@NotNull GenerationState state
) {
super(state, null, context, v);
this.jetFile = jetFile;
super(state, null, context, file, v);
this.packagePartType = packagePartType;
}
public void generate() {
v.defineClass(jetFile, V1_6,
@Override
protected void generateDeclaration() {
v.defineClass(element, V1_6,
ACC_PUBLIC | ACC_FINAL,
packagePartType.getInternalName(),
null,
"java/lang/Object",
ArrayUtil.EMPTY_STRING_ARRAY
);
v.visitSource(jetFile.getName(), null);
v.visitSource(element.getName(), null);
}
writeKotlinSyntheticClassAnnotation(v, KotlinSyntheticClass.Kind.PACKAGE_PART);
List<JetDeclaration> declarations = jetFile.getDeclarations();
for (JetDeclaration declaration : declarations) {
@Override
protected void generateBody() {
for (JetDeclaration declaration : element.getDeclarations()) {
if (declaration instanceof JetNamedFunction || declaration instanceof JetProperty) {
genFunctionOrProperty((JetTypeParameterListOwner) declaration, v);
}
}
if (state.getClassBuilderMode() == ClassBuilderMode.FULL) {
generateInitializers(declarations, new Function0<ExpressionCodegen>() {
generateInitializers(new Function0<ExpressionCodegen>() {
@Override
public ExpressionCodegen invoke() {
return createOrGetClInitCodegen();
}
});
generatePropertyMetadataArrayFieldIfNeeded(packagePartType, jetFile);
if (clInit != null) {
clInit.v.visitInsn(RETURN);
FunctionCodegen.endVisit(clInit.v, "static initializer for package", jetFile);
}
}
}
v.done();
@Override
protected void generateSyntheticParts() {
if (state.getClassBuilderMode() == ClassBuilderMode.FULL) {
generatePropertyMetadataArrayFieldIfNeeded(packagePartType);
}
}
@Override
protected void generateKotlinAnnotation() {
writeKotlinSyntheticClassAnnotation(v, KotlinSyntheticClass.Kind.PACKAGE_PART);
}
}
@@ -19,7 +19,6 @@ package org.jetbrains.jet.codegen;
import org.jetbrains.annotations.Nullable;
public interface ParentCodegenAware {
@Nullable
MemberCodegen getParentCodegen();
MemberCodegen<?> getParentCodegen();
}
@@ -22,17 +22,16 @@ import org.jetbrains.jet.codegen.state.GenerationState;
import org.jetbrains.jet.codegen.state.GenerationStateAware;
public class ParentCodegenAwareImpl extends GenerationStateAware implements ParentCodegenAware {
private final MemberCodegen<?> parentCodegen;
@Nullable private final MemberCodegen parentCodegen;
public ParentCodegenAwareImpl(@NotNull GenerationState state, @Nullable MemberCodegen parentCodegen) {
public ParentCodegenAwareImpl(@NotNull GenerationState state, @Nullable MemberCodegen<?> parentCodegen) {
super(state);
this.parentCodegen = parentCodegen;
}
@Nullable
@Override
public MemberCodegen getParentCodegen() {
public MemberCodegen<?> getParentCodegen() {
return parentCodegen;
}
}
@@ -63,7 +63,7 @@ public class PropertyCodegen extends GenerationStateAware {
private final FieldOwnerContext context;
@Nullable
private final MemberCodegen classBodyCodegen;
private final MemberCodegen<?> classBodyCodegen;
@NotNull
private final OwnerKind kind;
@@ -72,7 +72,7 @@ public class PropertyCodegen extends GenerationStateAware {
@NotNull FieldOwnerContext context,
@NotNull ClassBuilder v,
@NotNull FunctionCodegen functionCodegen,
@Nullable MemberCodegen classBodyCodegen
@Nullable MemberCodegen<?> classBodyCodegen
) {
super(functionCodegen.getState());
this.v = v;
@@ -18,9 +18,6 @@ package org.jetbrains.jet.codegen;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.org.objectweb.asm.MethodVisitor;
import org.jetbrains.org.objectweb.asm.Type;
import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter;
import org.jetbrains.jet.codegen.context.CodegenContext;
import org.jetbrains.jet.codegen.state.GenerationState;
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor;
@@ -34,12 +31,15 @@ import org.jetbrains.jet.lang.resolve.java.sam.SingleAbstractMethodUtils;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.types.JetType;
import org.jetbrains.org.objectweb.asm.MethodVisitor;
import org.jetbrains.org.objectweb.asm.Type;
import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter;
import static org.jetbrains.org.objectweb.asm.Opcodes.*;
import static org.jetbrains.jet.codegen.AsmUtil.NO_FLAG_PACKAGE_PRIVATE;
import static org.jetbrains.jet.codegen.AsmUtil.writeKotlinSyntheticClassAnnotation;
import static org.jetbrains.jet.lang.resolve.java.AsmTypeConstants.OBJECT_TYPE;
import static org.jetbrains.jet.lang.resolve.java.JvmAnnotationNames.KotlinSyntheticClass;
import static org.jetbrains.org.objectweb.asm.Opcodes.*;
public class SamWrapperCodegen extends ParentCodegenAwareImpl {
private static final String FUNCTION_FIELD_NAME = "function";
@@ -49,7 +49,7 @@ public class SamWrapperCodegen extends ParentCodegenAwareImpl {
public SamWrapperCodegen(
@NotNull GenerationState state,
@NotNull JavaClassDescriptor samInterface,
@Nullable MemberCodegen parentCodegen
@Nullable MemberCodegen<?> parentCodegen
) {
super(state, parentCodegen);
this.samInterface = samInterface;
@@ -44,7 +44,7 @@ import static org.jetbrains.jet.lang.resolve.java.AsmTypeConstants.OBJECT_TYPE;
import static org.jetbrains.org.objectweb.asm.Opcodes.*;
// SCRIPT: script code generator
public class ScriptCodegen extends MemberCodegen {
public class ScriptCodegen extends MemberCodegen<JetScript> {
public static ScriptCodegen createScriptCodegen(
@NotNull JetScript declaration,
@@ -65,14 +65,10 @@ public class ScriptCodegen extends MemberCodegen {
return new ScriptCodegen(declaration, state, scriptContext, state.getEarlierScriptsForReplInterpreter(), builder);
}
@NotNull
private final JetScript scriptDeclaration;
@NotNull
private final ScriptContext context;
@NotNull
private final List<ScriptDescriptor> earlierScripts;
private final ScriptDescriptor scriptDescriptor;
private ScriptCodegen(
@NotNull JetScript scriptDeclaration,
@@ -81,33 +77,38 @@ public class ScriptCodegen extends MemberCodegen {
@Nullable List<ScriptDescriptor> earlierScripts,
@NotNull ClassBuilder builder
) {
super(state, null, context, builder);
super(state, null, context, scriptDeclaration, builder);
this.scriptDeclaration = scriptDeclaration;
this.context = context;
this.earlierScripts = earlierScripts == null ? Collections.<ScriptDescriptor>emptyList() : earlierScripts;
this.scriptDescriptor = context.getScriptDescriptor();
}
public void generate() {
ScriptDescriptor scriptDescriptor = context.getScriptDescriptor();
ClassDescriptor classDescriptorForScript = context.getContextDescriptor();
Type classType = bindingContext.get(ASM_TYPE, classDescriptorForScript);
@Override
protected void generateDeclaration() {
Type classType = bindingContext.get(ASM_TYPE, context.getContextDescriptor());
assert classType != null;
ClassBuilder classBuilder = getBuilder();
classBuilder.defineClass(scriptDeclaration,
V1_6,
ACC_PUBLIC,
classType.getInternalName(),
null,
"java/lang/Object",
new String[0]);
v.defineClass(scriptDeclaration,
V1_6,
ACC_PUBLIC,
classType.getInternalName(),
null,
"java/lang/Object",
new String[0]);
}
genMembers(context, classBuilder);
genFieldsForParameters(scriptDescriptor, classBuilder);
genConstructor(scriptDescriptor, classDescriptorForScript, classBuilder,
@Override
protected void generateBody() {
genMembers(context, v);
genFieldsForParameters(scriptDescriptor, v);
genConstructor(scriptDescriptor, context.getContextDescriptor(), v,
context.intoFunction(scriptDescriptor.getScriptCodeDescriptor()));
}
classBuilder.done();
@Override
protected void generateKotlinAnnotation() {
// TODO
}
private void genConstructor(
@@ -154,7 +155,7 @@ public class ScriptCodegen extends MemberCodegen {
frameMap.enter(parameter, argTypes[i + add]);
}
generateInitializers(scriptDeclaration.getDeclarations(), new Function0<ExpressionCodegen>() {
generateInitializers(new Function0<ExpressionCodegen>() {
@Override
public ExpressionCodegen invoke() {
return new ExpressionCodegen(instructionAdapter, frameMap, Type.VOID_TYPE, context, state, ScriptCodegen.this);
@@ -23,9 +23,9 @@ import org.jetbrains.jet.codegen.state.GenerationState;
import org.jetbrains.jet.lang.psi.JetClassOrObject;
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
import static org.jetbrains.org.objectweb.asm.Opcodes.*;
import static org.jetbrains.jet.codegen.AsmUtil.writeKotlinSyntheticClassAnnotation;
import static org.jetbrains.jet.lang.resolve.java.JvmAnnotationNames.KotlinSyntheticClass;
import static org.jetbrains.org.objectweb.asm.Opcodes.*;
public class TraitImplBodyCodegen extends ClassBodyCodegen {
@@ -34,7 +34,7 @@ public class TraitImplBodyCodegen extends ClassBodyCodegen {
@NotNull ClassContext context,
@NotNull ClassBuilder v,
@NotNull GenerationState state,
@Nullable MemberCodegen parentCodegen
@Nullable MemberCodegen<?> parentCodegen
) {
super(aClass, context, v, state, parentCodegen);
}
@@ -410,7 +410,7 @@ public class InlineCodegen implements ParentCodegenAware, CallGenerator {
@Nullable
@Override
public MemberCodegen getParentCodegen() {
public MemberCodegen<?> getParentCodegen() {
return codegen.getParentCodegen();
}
@@ -23,7 +23,7 @@ import org.jetbrains.annotations.NotNull;
import java.util.List;
// SCRIPT: Script declaration
public class JetScript extends JetDeclarationImpl {
public class JetScript extends JetDeclarationImpl implements JetDeclarationContainer {
public JetScript(@NotNull ASTNode node) {
super(node);
@@ -34,6 +34,7 @@ public class JetScript extends JetDeclarationImpl {
return findNotNullChildByClass(JetBlockExpression.class);
}
@Override
@NotNull
public List<JetDeclaration> getDeclarations() {
return PsiTreeUtil.getChildrenOfTypeAsList(getBlockExpression(), JetDeclaration.class);