From 3a0aac48576d5c479dd85fb7ce29f3c1afb0486f Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Wed, 7 May 2014 14:15:29 +0400 Subject: [PATCH] Simplify type mapping logic in CodegenBinding - inline asmType to calling getAsmType, which does something more - refactor getJvmInternalName to use getAsmType as well - simplify getAsmType and fix a probable bug in mapping singletons nested in enums (which wasn't reproduced, though a test is added) - delete unnnecessary ASM_TYPE recording for enum entries in CodegenAnnotatingVisitor --- .../binding/CodegenAnnotatingVisitor.java | 8 +---- .../jet/codegen/binding/CodegenBinding.java | 36 +++++-------------- .../testData/codegen/box/enum/objectInEnum.kt | 20 +++++++++++ .../BlackBoxCodegenTestGenerated.java | 5 +++ 4 files changed, 35 insertions(+), 34 deletions(-) create mode 100644 compiler/testData/codegen/box/enum/objectInEnum.kt diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/binding/CodegenAnnotatingVisitor.java b/compiler/backend/src/org/jetbrains/jet/codegen/binding/CodegenAnnotatingVisitor.java index 383718adfb9..f376207ce78 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/binding/CodegenAnnotatingVisitor.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/binding/CodegenAnnotatingVisitor.java @@ -165,16 +165,10 @@ class CodegenAnnotatingVisitor extends JetVisitorVoid { assert descriptor != null : String.format("No descriptor for enum entry \n---\n%s\n---\n", JetPsiUtil.getElementTextWithContext(enumEntry)); - boolean trivial = enumEntry.getDeclarations().isEmpty(); - if (!trivial) { + if (!enumEntry.getDeclarations().isEmpty()) { bindingTrace.record(ENUM_ENTRY_CLASS_NEED_SUBCLASS, descriptor); super.visitEnumEntry(enumEntry); } - else { - Type asmType = bindingTrace.get(ASM_TYPE, getOuterClassDescriptor()); - assert PsiCodegenPredictor.checkPredictedNameFromPsi(bindingContext, descriptor, asmType); - bindingTrace.record(ASM_TYPE, descriptor, asmType); - } } @Override diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/binding/CodegenBinding.java b/compiler/backend/src/org/jetbrains/jet/codegen/binding/CodegenBinding.java index 44a965b651b..393d5234b41 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/binding/CodegenBinding.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/binding/CodegenBinding.java @@ -41,7 +41,6 @@ import java.util.*; import static org.jetbrains.jet.codegen.JvmCodegenUtil.isInterface; import static org.jetbrains.jet.lang.resolve.BindingContext.*; -import static org.jetbrains.jet.lang.resolve.DescriptorUtils.isEnumClass; public class CodegenBinding { public static final WritableSlice CLOSURE = Slices.createSimpleSlice(); @@ -85,7 +84,7 @@ public class CodegenBinding { public static Type asmTypeForScriptDescriptor(BindingContext bindingContext, @NotNull ScriptDescriptor scriptDescriptor) { ClassDescriptor classDescriptor = bindingContext.get(CLASS_FOR_SCRIPT, scriptDescriptor); //noinspection ConstantConditions - return asmType(bindingContext, classDescriptor); + return getAsmType(bindingContext, classDescriptor); } // SCRIPT: Generate asmType for script, move to ScriptingUtil @@ -112,12 +111,6 @@ public class CodegenBinding { return bindingContext.get(CLASS_FOR_FUNCTION, descriptor); } - @NotNull - private static Type asmType(@NotNull BindingContext bindingContext, @NotNull ClassDescriptor descriptor) { - //noinspection ConstantConditions - return bindingContext.get(ASM_TYPE, descriptor); - } - @NotNull public static Type asmTypeForAnonymousClass(@NotNull BindingContext bindingContext, @NotNull JetElement expression) { if (expression instanceof JetObjectLiteralExpression) { @@ -132,13 +125,12 @@ public class CodegenBinding { return asmTypeForAnonymousClass(bindingContext, functionDescriptor); } - return asmType(bindingContext, descriptor); + return getAsmType(bindingContext, descriptor); } @NotNull public static Type asmTypeForAnonymousClass(@NotNull BindingContext bindingContext, @NotNull FunctionDescriptor descriptor) { - ClassDescriptor classDescriptor = anonymousClassForFunction(bindingContext, descriptor); - return asmType(bindingContext, classDescriptor); + return getAsmType(bindingContext, anonymousClassForFunction(bindingContext, descriptor)); } // SCRIPT: register asmType for script descriptor, move to ScriptingUtil @@ -309,18 +301,14 @@ public class CodegenBinding { assert container instanceof ClassDescriptor : "Unexpected container: " + container + " for " + klass; String containerInternalName = getAsmType(bindingContext, (ClassDescriptor) container).getInternalName(); - if (klass.getKind() == ClassKind.OBJECT || klass.getKind() == ClassKind.CLASS_OBJECT) { - if (isEnumClass(container)) { + switch (klass.getKind()) { + case ENUM_ENTRY: return containerInternalName; - } - else if (klass.getKind() == ClassKind.OBJECT) { - return containerInternalName + "$" + klass.getName(); - } - else { + case CLASS_OBJECT: return containerInternalName + JvmAbi.CLASS_OBJECT_SUFFIX; - } + default: + return containerInternalName + "$" + klass.getName().getIdentifier(); } - return containerInternalName + "$" + klass.getName().getIdentifier(); } public static boolean hasThis0(BindingContext bindingContext, ClassDescriptor classDescriptor) { @@ -384,12 +372,6 @@ public class CodegenBinding { @NotNull public static String getJvmInternalName(@NotNull BindingContext bindingContext, @NotNull ClassDescriptor classDescriptor) { - Type asmType = bindingContext.get(ASM_TYPE, classDescriptor); - assert asmType != null : "ASM_TYPE not present for " + classDescriptor; - - String jvmInternalName = asmType.getClassName(); - assert jvmInternalName != null : "No internal name for " + asmType + " for class " + classDescriptor; - - return jvmInternalName; + return getAsmType(bindingContext, classDescriptor).getClassName(); } } diff --git a/compiler/testData/codegen/box/enum/objectInEnum.kt b/compiler/testData/codegen/box/enum/objectInEnum.kt new file mode 100644 index 00000000000..798b352261e --- /dev/null +++ b/compiler/testData/codegen/box/enum/objectInEnum.kt @@ -0,0 +1,20 @@ +enum class E { + ENTRY + SUBCLASS { + object O { + fun foo() = 2 + } + override fun bar() = O.foo() + } + + object O { + fun foo() = 1 + } + open fun bar() = O.foo() +} + +fun box(): String { + if (E.ENTRY.bar() != 1) return "Fail 1" + if (E.SUBCLASS.bar() != 2) return "Fail 2" + return "OK" +} diff --git a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java index 633f5e0bbcf..c7e2d7b5816 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java @@ -2445,6 +2445,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { doTest("compiler/testData/codegen/box/enum/name.kt"); } + @TestMetadata("objectInEnum.kt") + public void testObjectInEnum() throws Exception { + doTest("compiler/testData/codegen/box/enum/objectInEnum.kt"); + } + @TestMetadata("ordinal.kt") public void testOrdinal() throws Exception { doTest("compiler/testData/codegen/box/enum/ordinal.kt");