Can't use a qualified name of an annotation class in an annotation parameter

#KT-6151 Fixed
This commit is contained in:
Natalia Ukhorskaya
2014-10-29 11:30:24 +03:00
parent 8e93719e9d
commit c4ba32a8cc
5 changed files with 109 additions and 1 deletions
@@ -334,6 +334,11 @@ public class ConstantExpressionEvaluator private (val trace: BindingTrace) : Jet
val selectorExpression = expression.getSelectorExpression()
// 1.toInt(); 1.plus(1);
if (selectorExpression is JetCallExpression) {
val qualifiedCallValue = evaluate(selectorExpression, expectedType)
if (qualifiedCallValue != null) {
return qualifiedCallValue
}
val calleeExpression = selectorExpression.getCalleeExpression()
if (calleeExpression !is JetSimpleNameExpression) {
return null
@@ -225,7 +225,8 @@ public class CallExpressionResolver {
}
private static boolean canInstantiateAnnotationClass(@NotNull JetCallExpression expression) {
PsiElement parent = expression.getParent();
//noinspection unchecked
PsiElement parent = PsiTreeUtil.getParentOfType(expression, JetValueArgument.class, JetParameter.class);
if (parent instanceof JetValueArgument) {
return PsiTreeUtil.getParentOfType(parent, JetAnnotationEntry.class) != null;
}
@@ -0,0 +1,30 @@
package a.b.c
kotlin.deprecated("aaa")
ann1(kotlin.deprecated("aaa"))
a.b.c.ann1()
ann2(a.b.c.ann1())
A.IAnn()
ann3(A.IAnn())
a.b.c.A.IAnn()
ann3(a.b.c.A.IAnn())
annJavaClass(kotlin.javaClass<A>())
annArray(kotlin.array("a"))
fun test() = 1
annotation class ann1(val p: deprecated = kotlin.deprecated("aaa"))
annotation class ann2(val p: ann1 = a.b.c.ann1())
annotation class ann3(val p: A.IAnn = A.IAnn(), val p2: A.IAnn = a.b.c.A.IAnn())
annotation class annJavaClass(val p: Class<*> = kotlin.javaClass<A>())
annotation class annArray(val p: Array<String> = kotlin.array("a"))
class A {
annotation class IAnn
}
@@ -0,0 +1,66 @@
package
package a {
package a.b {
package a.b.c {
kotlin.deprecated(value = "aaa": kotlin.String) a.b.c.ann1(p = kotlin.deprecated(value = "aaa": kotlin.String): kotlin.deprecated) a.b.c.ann1() a.b.c.ann2(p = a.b.c.ann1(): a.b.c.ann1) a.b.c.A.IAnn() a.b.c.ann3(p = a.b.c.A.IAnn(): a.b.c.A.IAnn) a.b.c.A.IAnn() a.b.c.ann3(p = a.b.c.A.IAnn(): a.b.c.A.IAnn) a.b.c.annJavaClass(p = a.b.c.A.class: java.lang.Class<a.b.c.A>) a.b.c.annArray(p = {"a"}: kotlin.Array<kotlin.String>) internal fun test(): kotlin.Int
internal final class A {
public constructor A()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
internal final annotation class IAnn : kotlin.Annotation {
public constructor IAnn()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
}
internal final annotation class ann1 : kotlin.Annotation {
public constructor ann1(/*0*/ p: kotlin.deprecated = ...)
internal final val p: kotlin.deprecated
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
internal final annotation class ann2 : kotlin.Annotation {
public constructor ann2(/*0*/ p: a.b.c.ann1 = ...)
internal final val p: a.b.c.ann1
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
internal final annotation class ann3 : kotlin.Annotation {
public constructor ann3(/*0*/ p: a.b.c.A.IAnn = ..., /*1*/ p2: a.b.c.A.IAnn = ...)
internal final val p: a.b.c.A.IAnn
internal final val p2: a.b.c.A.IAnn
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
internal final annotation class annArray : kotlin.Annotation {
public constructor annArray(/*0*/ p: kotlin.Array<kotlin.String> = ...)
internal final val p: kotlin.Array<kotlin.String>
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
internal final annotation class annJavaClass : kotlin.Annotation {
public constructor annJavaClass(/*0*/ p: java.lang.Class<out kotlin.Any?> = ...)
internal final val p: java.lang.Class<out kotlin.Any?>
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
}
}
}
@@ -52,6 +52,12 @@ public class JetDiagnosticsTestWithStdLibGenerated extends AbstractJetDiagnostic
doTest(fileName);
}
@TestMetadata("qualifiedCallValue.kt")
public void testQualifiedCallValue() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/testsWithStdLib/annotations/qualifiedCallValue.kt");
doTest(fileName);
}
@TestMetadata("compiler/testData/diagnostics/testsWithStdLib/annotations/annotationApplicability")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)