From a7531926a4f372b225f4075277390992e2ce89c8 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Fri, 18 Jan 2013 14:28:00 -0800 Subject: [PATCH] Properly compute STATIC for light classes --- .../src/org/jetbrains/jet/codegen/ClassBuilder.java | 2 +- .../jet/codegen/ImplementationBodyCodegen.java | 13 ++++++------- .../KotlinLightClassForExplicitDeclaration.java | 7 +++---- compiler/testData/asJava/lightClasses/Declared.kt | 2 ++ .../jet/asJava/KotlinLightClassCoherenceTest.java | 12 ++++++++---- .../jetbrains/jet/asJava/KotlinLightClassTest.java | 12 +++++++----- 6 files changed, 27 insertions(+), 21 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ClassBuilder.java b/compiler/backend/src/org/jetbrains/jet/codegen/ClassBuilder.java index ec5ca101a09..6717506c89b 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ClassBuilder.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ClassBuilder.java @@ -78,7 +78,7 @@ public abstract class ClassBuilder { String superName, String[] interfaces ) { - getVisitor().visit(version, access & ~Opcodes.ACC_STATIC, name, signature, superName, interfaces); + getVisitor().visit(version, access, name, signature, superName, interfaces); } public void visitSource(String name, @Nullable String debug) { diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java index 311d458bec0..5ae6a136f46 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java @@ -21,10 +21,7 @@ import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.openapi.util.Pair; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.asm4.AnnotationVisitor; -import org.jetbrains.asm4.Label; -import org.jetbrains.asm4.MethodVisitor; -import org.jetbrains.asm4.Type; +import org.jetbrains.asm4.*; import org.jetbrains.asm4.commons.InstructionAdapter; import org.jetbrains.asm4.commons.Method; import org.jetbrains.jet.codegen.binding.CalculatedClosure; @@ -119,6 +116,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { if (!jetClass.hasModifier(JetTokens.OPEN_KEYWORD) && !isAbstract) { isFinal = true; } + isStatic = !jetClass.isInner(); } else { isStatic = myClass.getParent() instanceof JetClassObject; @@ -133,6 +131,10 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { // without knowing whether these classes are inner or not (see ClassStubBuilder.EMPTY_STRATEGY) // Thus we must write full accessibility flags on inner classes in this mode access |= getVisibilityAccessFlag(descriptor); + // Same for STATIC + if (isStatic) { + access |= ACC_STATIC; + } } else { access |= getVisibilityAccessFlagForClass(descriptor); @@ -149,9 +151,6 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { if (isFinal) { access |= ACC_FINAL; } - if (isStatic) { - access |= ACC_STATIC; - } if (isAnnotation) { access |= ACC_ANNOTATION; } diff --git a/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/KotlinLightClassForExplicitDeclaration.java b/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/KotlinLightClassForExplicitDeclaration.java index 6810851a5ed..e4377bb59cf 100644 --- a/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/KotlinLightClassForExplicitDeclaration.java +++ b/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/KotlinLightClassForExplicitDeclaration.java @@ -313,10 +313,9 @@ public class KotlinLightClassForExplicitDeclaration extends AbstractLightClass i psiModifiers.add(PsiModifier.FINAL); } - // TODO: STATIC - //if (nestedClass && jetModifierList.hasModifier(INNER_KEYWORD)) { - // psiModifiers.add(PsiModifier.STATIC); - //} + if (nestedClass && !classOrObject.hasModifier(INNER_KEYWORD)) { + psiModifiers.add(PsiModifier.STATIC); + } return psiModifiers.toArray(new String[psiModifiers.size()]); } diff --git a/compiler/testData/asJava/lightClasses/Declared.kt b/compiler/testData/asJava/lightClasses/Declared.kt index ecc0c15c979..d7466bd7477 100644 --- a/compiler/testData/asJava/lightClasses/Declared.kt +++ b/compiler/testData/asJava/lightClasses/Declared.kt @@ -11,6 +11,8 @@ class Outer { protected class Protected private class Private internal class Internal + + inner class Inner } // Modality diff --git a/compiler/tests/org/jetbrains/jet/asJava/KotlinLightClassCoherenceTest.java b/compiler/tests/org/jetbrains/jet/asJava/KotlinLightClassCoherenceTest.java index 6b7af920fbf..6ecad1f476c 100644 --- a/compiler/tests/org/jetbrains/jet/asJava/KotlinLightClassCoherenceTest.java +++ b/compiler/tests/org/jetbrains/jet/asJava/KotlinLightClassCoherenceTest.java @@ -136,22 +136,26 @@ public class KotlinLightClassCoherenceTest extends KotlinAsJavaTestBase { doTest(); } - public void testInnerPublic() throws Exception { + public void testNestedPublic() throws Exception { doTest("test.Outer.Public"); } - public void testInnerProtected() throws Exception { + public void testNestedProtected() throws Exception { doTest("test.Outer.Protected"); } - public void testInnerInternal() throws Exception { + public void testNestedInternal() throws Exception { doTest("test.Outer.Internal"); } - public void testInnerPrivate() throws Exception { + public void testNestedPrivate() throws Exception { doTest("test.Outer.Private"); } + public void testInner() throws Exception { + doTest("test.Outer.Inner"); + } + public void testAbstract() throws Exception { doTest(); } diff --git a/compiler/tests/org/jetbrains/jet/asJava/KotlinLightClassTest.java b/compiler/tests/org/jetbrains/jet/asJava/KotlinLightClassTest.java index c4fb608a2c2..cf87fc02005 100644 --- a/compiler/tests/org/jetbrains/jet/asJava/KotlinLightClassTest.java +++ b/compiler/tests/org/jetbrains/jet/asJava/KotlinLightClassTest.java @@ -60,10 +60,12 @@ public abstract class KotlinLightClassTest extends KotlinAsJavaTestBase { } public void testNestedVisibilities() { - checkModifiers("test.Outer.Public", PUBLIC, FINAL, INNER); - checkModifiers("test.Outer.Protected", PROTECTED, FINAL, INNER); - checkModifiers("test.Outer.Internal", PUBLIC, FINAL, INNER); - checkModifiers("test.Outer.Private", PRIVATE, FINAL, INNER); + checkModifiers("test.Outer.Public", PUBLIC, STATIC, FINAL, NESTED); + checkModifiers("test.Outer.Protected", PROTECTED, STATIC, FINAL, NESTED); + checkModifiers("test.Outer.Internal", PUBLIC, STATIC, FINAL, NESTED); + checkModifiers("test.Outer.Private", PRIVATE, STATIC, FINAL, NESTED); + + checkModifiers("test.Outer.Inner", PUBLIC, FINAL, NESTED); } public void testModalities() { checkModifiers("test.Abstract", PUBLIC, ABSTRACT); @@ -224,7 +226,7 @@ public abstract class KotlinLightClassTest extends KotlinAsJavaTestBase { return psiClass.isDeprecated(); } }, - INNER { + NESTED { @Override public boolean present(@NotNull PsiClass psiClass) { return psiClass.getContainingClass() != null;