From 3d9ad3f6cb81dbbf3b7870e525fde788f8dbb7b5 Mon Sep 17 00:00:00 2001 From: "Natalia.Ukhorskaya" Date: Wed, 22 Aug 2012 14:29:38 +0400 Subject: [PATCH] ExpressionCodegen: take EnumEntry type from containingDeclarationDescriptor JavaDescriptorResolver: pass to propertyDescriptor correct value of isObject parameter --- .../jet/codegen/ExpressionCodegen.java | 15 +++++++-------- .../resolve/java/JavaDescriptorResolver.java | 2 +- .../testData/codegen/enum/simpleJavaEnum.java | 5 +++++ .../testData/codegen/enum/simpleJavaEnum.kt | 5 +++++ .../enum/simpleJavaEnumWithFunction.java | 18 ++++++++++++++++++ .../codegen/enum/simpleJavaEnumWithFunction.kt | 5 +++++ .../enum/simpleJavaEnumWithStaticImport.java | 5 +++++ .../enum/simpleJavaEnumWithStaticImport.kt | 5 +++++ .../org/jetbrains/jet/codegen/EnumGenTest.java | 12 ++++++++++++ 9 files changed, 63 insertions(+), 9 deletions(-) create mode 100644 compiler/testData/codegen/enum/simpleJavaEnum.java create mode 100644 compiler/testData/codegen/enum/simpleJavaEnum.kt create mode 100644 compiler/testData/codegen/enum/simpleJavaEnumWithFunction.java create mode 100644 compiler/testData/codegen/enum/simpleJavaEnumWithFunction.kt create mode 100644 compiler/testData/codegen/enum/simpleJavaEnumWithStaticImport.java create mode 100644 compiler/testData/codegen/enum/simpleJavaEnumWithStaticImport.kt diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index feb20ad615b..3da93665e29 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -1105,18 +1105,17 @@ public class ExpressionCodegen extends JetVisitor { PropertyDescriptor propertyDescriptor = (PropertyDescriptor) descriptor; if (propertyDescriptor.isObjectDeclaration()) { - ClassDescriptor classDescriptor = - (ClassDescriptor) propertyDescriptor.getReturnType().getConstructor().getDeclarationDescriptor(); - assert classDescriptor != null; - if (classDescriptor.getKind() == ClassKind.ENUM_ENTRY) { - ClassDescriptor containing = (ClassDescriptor) classDescriptor.getContainingDeclaration().getContainingDeclaration(); + boolean isEnumEntry = DescriptorUtils.isEnumClassObject(propertyDescriptor.getContainingDeclaration()); + if (isEnumEntry) { + ClassDescriptor containing = (ClassDescriptor) propertyDescriptor.getContainingDeclaration().getContainingDeclaration(); assert containing != null; Type type = typeMapper.mapType(containing.getDefaultType(), MapTypeMode.VALUE); - Type entryType = typeMapper.mapType(classDescriptor.getDefaultType(), MapTypeMode.VALUE); - StackValue.field(type, JvmClassName.byType(type), classDescriptor.getName().getName(), true).put(entryType, v); - return StackValue.onStack(entryType); + StackValue.field(type, JvmClassName.byType(type), propertyDescriptor.getName().getName(), true).put(type, v); + return StackValue.onStack(type); } else { + ClassifierDescriptor classDescriptor = propertyDescriptor.getReturnType().getConstructor().getDeclarationDescriptor(); + assert classDescriptor != null; Type type = typeMapper.mapType(classDescriptor.getDefaultType(), MapTypeMode.VALUE); return StackValue.field(type, JvmClassName.byType(type), "$instance", true); } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java index 18eef0db322..3dbfbbd1c58 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java @@ -1185,7 +1185,7 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes resolveModality(anyMember.getMember(), isFinal), visibility, isVar, - false, + DescriptorUtils.isEnumClassObject(realOwner), propertyName, CallableMemberDescriptor.Kind.DECLARATION); diff --git a/compiler/testData/codegen/enum/simpleJavaEnum.java b/compiler/testData/codegen/enum/simpleJavaEnum.java new file mode 100644 index 00000000000..e557ba4f84d --- /dev/null +++ b/compiler/testData/codegen/enum/simpleJavaEnum.java @@ -0,0 +1,5 @@ +package test; + +public enum simpleJavaEnum { + A; +} diff --git a/compiler/testData/codegen/enum/simpleJavaEnum.kt b/compiler/testData/codegen/enum/simpleJavaEnum.kt new file mode 100644 index 00000000000..eabb6fa33db --- /dev/null +++ b/compiler/testData/codegen/enum/simpleJavaEnum.kt @@ -0,0 +1,5 @@ +import test.* + +fun box() = + if (simpleJavaEnum.A.toString() == "A") "OK" + else "fail" diff --git a/compiler/testData/codegen/enum/simpleJavaEnumWithFunction.java b/compiler/testData/codegen/enum/simpleJavaEnumWithFunction.java new file mode 100644 index 00000000000..66ca4abe83b --- /dev/null +++ b/compiler/testData/codegen/enum/simpleJavaEnumWithFunction.java @@ -0,0 +1,18 @@ +package test; + +import java.lang.Override; +import java.lang.String; + +public enum simpleJavaEnumWithFunction { + A { + @Override + public String repr() { + return "A"; + } + }, + B; + + public String repr() { + return "ololol" + toString(); + } +} diff --git a/compiler/testData/codegen/enum/simpleJavaEnumWithFunction.kt b/compiler/testData/codegen/enum/simpleJavaEnumWithFunction.kt new file mode 100644 index 00000000000..b74dd20419f --- /dev/null +++ b/compiler/testData/codegen/enum/simpleJavaEnumWithFunction.kt @@ -0,0 +1,5 @@ +import test.simpleJavaEnumWithFunction.* + +fun box() = + if (A.repr() == "A" && B.repr() == "olololB") "OK" + else "fail" diff --git a/compiler/testData/codegen/enum/simpleJavaEnumWithStaticImport.java b/compiler/testData/codegen/enum/simpleJavaEnumWithStaticImport.java new file mode 100644 index 00000000000..47c5ac43a7d --- /dev/null +++ b/compiler/testData/codegen/enum/simpleJavaEnumWithStaticImport.java @@ -0,0 +1,5 @@ +package test; + +public enum simpleJavaEnumWithStaticImport { + A; +} diff --git a/compiler/testData/codegen/enum/simpleJavaEnumWithStaticImport.kt b/compiler/testData/codegen/enum/simpleJavaEnumWithStaticImport.kt new file mode 100644 index 00000000000..265d10f9263 --- /dev/null +++ b/compiler/testData/codegen/enum/simpleJavaEnumWithStaticImport.kt @@ -0,0 +1,5 @@ +import test.simpleJavaEnumWithStaticImport.A + +fun box() = + if (A.toString() == "A") "OK" + else "fail" diff --git a/compiler/tests/org/jetbrains/jet/codegen/EnumGenTest.java b/compiler/tests/org/jetbrains/jet/codegen/EnumGenTest.java index 1aa3990052c..2aa96c14f67 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/EnumGenTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/EnumGenTest.java @@ -105,6 +105,18 @@ public class EnumGenTest extends CodegenTestCase { throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException { blackBoxFile("enum/abstractmethod.kt"); } + + public void testSimpleJavaEnum() throws Exception { + blackBoxFileWithJava("enum/simpleJavaEnum.kt"); + } + + public void testSimpleJavaEnumWithStaticImport() throws Exception { + blackBoxFileWithJava("enum/simpleJavaEnumWithStaticImport.kt"); + } + + public void testSimpleJavaEnumWithFunction() throws Exception { + blackBoxFileWithJava("enum/simpleJavaEnumWithFunction.kt"); + } public void testNoClassForSimpleEnum() throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException, NoSuchFieldException {