From 6ff783e79b5a86a3f435b007fe8664e9197ab80c Mon Sep 17 00:00:00 2001 From: Alex Tkachman Date: Fri, 16 Mar 2012 15:36:41 +0200 Subject: [PATCH] KT-1592 don't write default values for annotations --- .../jet/codegen/AnnotationCodegen.java | 16 +++++---- .../testData/codegen/regressions/kt1592.kt | 3 ++ .../org/jetbrains/jet/codegen/StdlibTest.java | 36 +++++++++++++++++++ 3 files changed, 49 insertions(+), 6 deletions(-) create mode 100644 compiler/testData/codegen/regressions/kt1592.kt diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/AnnotationCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/AnnotationCodegen.java index f50be76ec8f..94bb32dd414 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/AnnotationCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/AnnotationCodegen.java @@ -22,6 +22,7 @@ import org.jetbrains.jet.lang.descriptors.annotations.Annotated; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.BindingContext; +import org.jetbrains.jet.lang.resolve.calls.DefaultValueArgument; import org.jetbrains.jet.lang.resolve.calls.ResolvedCall; import org.jetbrains.jet.lang.resolve.calls.ResolvedValueArgument; import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant; @@ -76,13 +77,16 @@ public abstract class AnnotationCodegen { AnnotationVisitor annotationVisitor = visitAnnotation(internalName, rp == RetentionPolicy.RUNTIME); for (Map.Entry entry : resolvedCall.getValueArguments().entrySet()) { - List valueArguments = entry.getValue().getArgumentExpressions(); - assert valueArguments.size() == 1 : "Number of assertions on " + resolvedCall.getResultingDescriptor() + " = " + valueArguments.size(); // todo - CompileTimeConstant compileTimeConstant = bindingContext.get(BindingContext.COMPILE_TIME_VALUE, valueArguments.get(0)); - assert compileTimeConstant != null; + ResolvedValueArgument valueArgument = entry.getValue(); + if (!(valueArgument instanceof DefaultValueArgument)) { + List valueArguments = valueArgument.getArgumentExpressions(); + assert valueArguments.size() == 1 : "Number of assertions on " + resolvedCall.getResultingDescriptor() + " = " + valueArguments.size(); // todo + CompileTimeConstant compileTimeConstant = bindingContext.get(BindingContext.COMPILE_TIME_VALUE, valueArguments.get(0)); + assert compileTimeConstant != null; - Object value = compileTimeConstant.getValue(); - annotationVisitor.visit(entry.getKey().getName(), value); + Object value = compileTimeConstant.getValue(); + annotationVisitor.visit(entry.getKey().getName(), value); + } } annotationVisitor.visitEnd(); diff --git a/compiler/testData/codegen/regressions/kt1592.kt b/compiler/testData/codegen/regressions/kt1592.kt new file mode 100644 index 00000000000..b5b588e1e10 --- /dev/null +++ b/compiler/testData/codegen/regressions/kt1592.kt @@ -0,0 +1,3 @@ +import org.junit.Test + +Test fun box(m : java.lang.reflect.Method) = "OK" \ 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 034053d630b..752e15fc022 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/StdlibTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/StdlibTest.java @@ -17,12 +17,18 @@ package org.jetbrains.jet.codegen; import org.jetbrains.jet.compiler.CompileEnvironment; +import org.jetbrains.jet.lang.psi.JetPsiUtil; +import java.io.File; +import java.lang.annotation.Annotation; +import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; +import org.junit.Test; + /** * @author alex.tkachman */ @@ -32,6 +38,13 @@ public class StdlibTest extends CodegenTestCase { super.setUp(); createEnvironmentWithFullJdk(); myEnvironment.addToClasspath(ForTestCompileStdlib.stdlibJarForTests()); + File junitJar = new File("libraries/testlib/lib/junit-4.9.jar"); + + if (!junitJar.exists()) { + throw new AssertionError(); + } + + myEnvironment.addToClasspath(junitJar); CompileEnvironment.ensureRuntime(myEnvironment); } @@ -128,4 +141,27 @@ public class StdlibTest extends CodegenTestCase { public void testKt1515() throws Exception { blackBoxFile("regressions/kt1515.kt"); } + + public void testKt1592 () throws MalformedURLException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException { + loadFile("regressions/kt1592.kt"); + ClassFileFactory codegens = generateClassesInFile(); + GeneratedClassLoader loader = createClassLoader(codegens); + + try { + String fqName = NamespaceCodegen.getJVMClassName(JetPsiUtil.getFQName(myFile), true).replace("/", "."); + Class namespaceClass = loader.loadClass(fqName); + Method method = namespaceClass.getMethod("box", Method.class); + method.setAccessible(true); + Test annotation = method.getAnnotation(Test.class); + assertEquals(annotation.timeout(), 0l); + assertEquals(annotation.expected(), Test.None.class); + } + catch (Throwable t) { + System.out.println(generateToText()); + throw new RuntimeException(t); + } + finally { + loader.dispose(); + } + } }