fix for KT-1515 wrong loading of annotations

This commit is contained in:
Alex Tkachman
2012-03-13 12:28:35 +02:00
parent 6b26d1ca31
commit c870eccc4f
8 changed files with 49 additions and 13 deletions
@@ -81,7 +81,8 @@ public abstract class AnnotationCodegen {
CompileTimeConstant<?> compileTimeConstant = bindingContext.get(BindingContext.COMPILE_TIME_VALUE, valueArguments.get(0)); CompileTimeConstant<?> compileTimeConstant = bindingContext.get(BindingContext.COMPILE_TIME_VALUE, valueArguments.get(0));
assert compileTimeConstant != null; assert compileTimeConstant != null;
annotationVisitor.visit(entry.getKey().getName(), compileTimeConstant.getValue()); Object value = compileTimeConstant.getValue();
annotationVisitor.visit(entry.getKey().getName(), value);
} }
annotationVisitor.visitEnd(); annotationVisitor.visitEnd();
@@ -72,8 +72,8 @@ public class IntrinsicMethods {
myProject = project; myProject = project;
myStdLib = stdlib; myStdLib = stdlib;
namedMethods.put("\"kotlin.javaClass.function\"", new JavaClassFunction()); namedMethods.put("kotlin.javaClass.function", new JavaClassFunction());
namedMethods.put("\"kotlin.javaClass.property\"", new JavaClassProperty()); namedMethods.put("kotlin.javaClass.property", new JavaClassProperty());
List<String> primitiveCastMethods = OperatorConventions.NUMBER_CONVERSIONS.asList(); List<String> primitiveCastMethods = OperatorConventions.NUMBER_CONVERSIONS.asList();
for (String method : primitiveCastMethods) { for (String method : primitiveCastMethods) {
@@ -246,7 +246,10 @@ public class IntrinsicMethods {
if (annotations != null) { if (annotations != null) {
for (AnnotationDescriptor annotation : annotations) { for (AnnotationDescriptor annotation : annotations) {
if("Intrinsic".equals(annotation.getType().getConstructor().getDeclarationDescriptor().getName())) { 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;
} }
} }
} }
@@ -1522,13 +1522,34 @@ public class JavaDescriptorResolver {
} }
annotation.setAnnotationType(clazz.getDefaultType()); annotation.setAnnotationType(clazz.getDefaultType());
ArrayList<CompileTimeConstant<?>> valueArguments = new ArrayList<CompileTimeConstant<?>>(); ArrayList<CompileTimeConstant<?>> valueArguments = new ArrayList<CompileTimeConstant<?>>();
if("jet.runtime.Intrinsic".equals(psiAnnotation.getQualifiedName())) {
// temporary hack PsiAnnotationParameterList parameterList = psiAnnotation.getParameterList();
valueArguments.add(new StringValue(psiAnnotation.findAttributeValue("value").getText())); for (PsiNameValuePair psiNameValuePair : parameterList.getAttributes()) {
annotation.setValueArguments(valueArguments); // TODO 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; return annotation;
} }
@@ -27,6 +27,9 @@ import org.jetbrains.annotations.Nullable;
*/ */
public class PsiAnnotationUtils { public class PsiAnnotationUtils {
private PsiAnnotationUtils() {
}
@NotNull @NotNull
public static String getStringAttribute(@Nullable PsiAnnotation annotation, @NotNull String field, @NotNull String defaultValue) { public static String getStringAttribute(@Nullable PsiAnnotation annotation, @NotNull String field, @NotNull String defaultValue) {
return getAttribute(annotation, field, defaultValue); return getAttribute(annotation, field, defaultValue);
@@ -0,0 +1,4 @@
fun box(): String {
val c = javaClass<Runnable>()
return if(c.getName().sure() == "java.lang.Runnable") "OK" else "fail"
}
@@ -124,4 +124,8 @@ public class StdlibTest extends CodegenTestCase {
public void testKt1568() throws Exception { public void testKt1568() throws Exception {
blackBoxFile("regressions/kt1568.kt"); blackBoxFile("regressions/kt1568.kt");
} }
public void testKt1515() throws Exception {
blackBoxFile("regressions/kt1515.kt");
}
} }
+2 -2
View File
@@ -8,7 +8,7 @@ class C()
class JavaClassTest() : TestCase() { class JavaClassTest() : TestCase() {
fun testMe () { fun testMe () {
assertEquals("java.util.ArrayList", java.util.ArrayList<Any>().javaClass.getName()) assertEquals("java.util.ArrayList", java.util.ArrayList<Any>().javaClass.getName())
// assertEquals("java.util.ArrayList", javaClass<java.util.ArrayList<Any>>().getName()) assertEquals("java.util.ArrayList", javaClass<java.util.ArrayList<Any>>().getName())
// assertEquals("testjc.C", javaClass<C>().getName()) assertEquals("testjc.C", javaClass<C>().getName())
} }
} }
@@ -17,7 +17,7 @@ class JavaClassTest : TestCase() {
// TODO this function fails! // TODO this function fails!
// see KT-1515 // see KT-1515
// loadAsserter() loadAsserter()
} }
} }