From c870eccc4f3d7a7794f9da81292f630a7a0ef5df Mon Sep 17 00:00:00 2001 From: Alex Tkachman Date: Tue, 13 Mar 2012 12:28:35 +0200 Subject: [PATCH] fix for KT-1515 wrong loading of annotations --- .../jet/codegen/AnnotationCodegen.java | 3 +- .../codegen/intrinsics/IntrinsicMethods.java | 9 +++-- .../resolve/java/JavaDescriptorResolver.java | 33 +++++++++++++++---- .../resolve/java/kt/PsiAnnotationUtils.java | 3 ++ .../testData/codegen/regressions/kt1515.kt | 4 +++ .../org/jetbrains/jet/codegen/StdlibTest.java | 4 +++ libraries/testlib/test/JavaClassTest.kt | 4 +-- .../testlib/test/language/JavaClassTest.kt | 2 +- 8 files changed, 49 insertions(+), 13 deletions(-) create mode 100644 compiler/testData/codegen/regressions/kt1515.kt diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/AnnotationCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/AnnotationCodegen.java index f87dd5495a5..f50be76ec8f 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/AnnotationCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/AnnotationCodegen.java @@ -81,7 +81,8 @@ public abstract class AnnotationCodegen { CompileTimeConstant compileTimeConstant = bindingContext.get(BindingContext.COMPILE_TIME_VALUE, valueArguments.get(0)); assert compileTimeConstant != null; - annotationVisitor.visit(entry.getKey().getName(), compileTimeConstant.getValue()); + Object value = compileTimeConstant.getValue(); + annotationVisitor.visit(entry.getKey().getName(), value); } annotationVisitor.visitEnd(); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/IntrinsicMethods.java b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/IntrinsicMethods.java index 0c51f50cb81..afa814791c2 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/IntrinsicMethods.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/IntrinsicMethods.java @@ -72,8 +72,8 @@ public class IntrinsicMethods { myProject = project; myStdLib = stdlib; - namedMethods.put("\"kotlin.javaClass.function\"", new JavaClassFunction()); - namedMethods.put("\"kotlin.javaClass.property\"", new JavaClassProperty()); + namedMethods.put("kotlin.javaClass.function", new JavaClassFunction()); + namedMethods.put("kotlin.javaClass.property", new JavaClassProperty()); List primitiveCastMethods = OperatorConventions.NUMBER_CONVERSIONS.asList(); for (String method : primitiveCastMethods) { @@ -246,7 +246,10 @@ public class IntrinsicMethods { if (annotations != null) { for (AnnotationDescriptor annotation : annotations) { if("Intrinsic".equals(annotation.getType().getConstructor().getDeclarationDescriptor().getName())) { - intrinsicMethod = namedMethods.get(annotation.getValueArguments().get(0).getValue()); + Object value = annotation.getValueArguments().get(0).getValue(); + intrinsicMethod = namedMethods.get(value); + if(intrinsicMethod != null) + break; } } } 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 ddb16117d67..f7ac9cc53c5 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 @@ -1522,13 +1522,34 @@ public class JavaDescriptorResolver { } annotation.setAnnotationType(clazz.getDefaultType()); ArrayList> valueArguments = new ArrayList>(); - if("jet.runtime.Intrinsic".equals(psiAnnotation.getQualifiedName())) { - // temporary hack - valueArguments.add(new StringValue(psiAnnotation.findAttributeValue("value").getText())); - annotation.setValueArguments(valueArguments); // TODO + + PsiAnnotationParameterList parameterList = psiAnnotation.getParameterList(); + for (PsiNameValuePair psiNameValuePair : parameterList.getAttributes()) { + PsiAnnotationMemberValue value = psiNameValuePair.getValue(); + // todo + assert value instanceof PsiLiteralExpression; + Object literalValue = ((PsiLiteralExpression) value).getValue(); + if(literalValue instanceof String) + valueArguments.add(new StringValue((String) literalValue)); + else if(literalValue instanceof Byte) + valueArguments.add(new ByteValue((Byte) literalValue)); + else if(literalValue instanceof Short) + valueArguments.add(new ShortValue((Short) literalValue)); + else if(literalValue instanceof Character) + valueArguments.add(new CharValue((Character) literalValue)); + else if(literalValue instanceof Integer) + valueArguments.add(new IntValue((Integer) literalValue)); + else if(literalValue instanceof Long) + valueArguments.add(new LongValue((Long) literalValue)); + else if(literalValue instanceof Float) + valueArguments.add(new FloatValue((Float) literalValue)); + else if(literalValue instanceof Double) + valueArguments.add(new DoubleValue((Double) literalValue)); + else if(literalValue == null) + valueArguments.add(NullValue.NULL); } - else - annotation.setValueArguments(valueArguments); // TODO + + annotation.setValueArguments(valueArguments); // TODO return annotation; } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/kt/PsiAnnotationUtils.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/kt/PsiAnnotationUtils.java index 389c470394f..163bbfee95f 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/kt/PsiAnnotationUtils.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/kt/PsiAnnotationUtils.java @@ -27,6 +27,9 @@ import org.jetbrains.annotations.Nullable; */ public class PsiAnnotationUtils { + private PsiAnnotationUtils() { + } + @NotNull public static String getStringAttribute(@Nullable PsiAnnotation annotation, @NotNull String field, @NotNull String defaultValue) { return getAttribute(annotation, field, defaultValue); diff --git a/compiler/testData/codegen/regressions/kt1515.kt b/compiler/testData/codegen/regressions/kt1515.kt new file mode 100644 index 00000000000..cc93cfa3c8d --- /dev/null +++ b/compiler/testData/codegen/regressions/kt1515.kt @@ -0,0 +1,4 @@ +fun box(): String { + val c = javaClass() + return if(c.getName().sure() == "java.lang.Runnable") "OK" else "fail" +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/codegen/StdlibTest.java b/compiler/tests/org/jetbrains/jet/codegen/StdlibTest.java index b27543e36d4..034053d630b 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/StdlibTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/StdlibTest.java @@ -124,4 +124,8 @@ public class StdlibTest extends CodegenTestCase { public void testKt1568() throws Exception { blackBoxFile("regressions/kt1568.kt"); } + + public void testKt1515() throws Exception { + blackBoxFile("regressions/kt1515.kt"); + } } diff --git a/libraries/testlib/test/JavaClassTest.kt b/libraries/testlib/test/JavaClassTest.kt index 845336f73b8..b0b7f5dacc4 100644 --- a/libraries/testlib/test/JavaClassTest.kt +++ b/libraries/testlib/test/JavaClassTest.kt @@ -8,7 +8,7 @@ class C() class JavaClassTest() : TestCase() { fun testMe () { assertEquals("java.util.ArrayList", java.util.ArrayList().javaClass.getName()) -// assertEquals("java.util.ArrayList", javaClass>().getName()) -// assertEquals("testjc.C", javaClass().getName()) + assertEquals("java.util.ArrayList", javaClass>().getName()) + assertEquals("testjc.C", javaClass().getName()) } } \ No newline at end of file diff --git a/libraries/testlib/test/language/JavaClassTest.kt b/libraries/testlib/test/language/JavaClassTest.kt index 84fbccf9aa8..04a8846c244 100644 --- a/libraries/testlib/test/language/JavaClassTest.kt +++ b/libraries/testlib/test/language/JavaClassTest.kt @@ -17,7 +17,7 @@ class JavaClassTest : TestCase() { // TODO this function fails! // see KT-1515 - // loadAsserter() + loadAsserter() } }