From dd614569c0c9d73f3cf9eae895c4e31b565494aa Mon Sep 17 00:00:00 2001 From: Maxim Shafirov Date: Wed, 21 Dec 2011 09:01:23 +0300 Subject: [PATCH] Class objects are statics. I guess top level classes shall be static as well --- .../codegen/ImplementationBodyCodegen.java | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java index 4121669fc55..5451473b4d2 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java @@ -8,6 +8,7 @@ import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.OverridingUtil; import org.jetbrains.jet.lang.resolve.java.JvmStdlibNames; import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant; +import org.jetbrains.jet.lang.resolve.java.StdlibNames; import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lang.types.TypeProjection; import org.jetbrains.jet.lexer.JetTokens; @@ -48,6 +49,8 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { boolean isAbstract = false; boolean isInterface = false; boolean isFinal = false; + boolean isStatic = false; + if(myClass instanceof JetClass) { JetClass jetClass = (JetClass) myClass; if (jetClass.hasModifier(JetTokens.ABSTRACT_KEYWORD)) @@ -60,6 +63,9 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { isFinal = true; } } + else if (myClass.getParent() instanceof JetClassObject) { + isStatic = true; + } int access = 0; access |= Opcodes.ACC_PUBLIC; @@ -72,6 +78,9 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { if (isFinal) { access |= Opcodes.ACC_FINAL; } + if (isStatic) { + access |= Opcodes.ACC_STATIC; + } v.defineClass(myClass, Opcodes.V1_6, access, signature.getName(), @@ -81,8 +90,9 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { ); v.visitSource(myClass.getContainingFile().getName(), null); - if(descriptor.getContainingDeclaration() instanceof ClassDescriptor) { - v.visitOuterClass(typeMapper.mapType(((ClassDescriptor) descriptor.getContainingDeclaration()).getDefaultType(), OwnerKind.IMPLEMENTATION).getInternalName(), null, null); + ClassDescriptor container = getContainingClassDescriptor(descriptor); + if(container != null) { + v.visitOuterClass(typeMapper.mapType(container.getDefaultType(), OwnerKind.IMPLEMENTATION).getInternalName(), null, null); } if(myClass instanceof JetClass && signature.getKotlinGenericSignature() != null) { @@ -92,6 +102,15 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { } } + private static ClassDescriptor getContainingClassDescriptor(ClassDescriptor decl) { + DeclarationDescriptor container = decl.getContainingDeclaration(); + while (container != null && !(container instanceof NamespaceDescriptor)) { + if (container instanceof ClassDescriptor) return (ClassDescriptor) container; + container = container.getContainingDeclaration(); + } + return null; + } + private JvmClassSignature signature() { List superInterfaces;