Can't use a qualified name of an annotation class in an annotation parameter
#KT-6151 Fixed
This commit is contained in:
@@ -334,6 +334,11 @@ public class ConstantExpressionEvaluator private (val trace: BindingTrace) : Jet
|
|||||||
val selectorExpression = expression.getSelectorExpression()
|
val selectorExpression = expression.getSelectorExpression()
|
||||||
// 1.toInt(); 1.plus(1);
|
// 1.toInt(); 1.plus(1);
|
||||||
if (selectorExpression is JetCallExpression) {
|
if (selectorExpression is JetCallExpression) {
|
||||||
|
val qualifiedCallValue = evaluate(selectorExpression, expectedType)
|
||||||
|
if (qualifiedCallValue != null) {
|
||||||
|
return qualifiedCallValue
|
||||||
|
}
|
||||||
|
|
||||||
val calleeExpression = selectorExpression.getCalleeExpression()
|
val calleeExpression = selectorExpression.getCalleeExpression()
|
||||||
if (calleeExpression !is JetSimpleNameExpression) {
|
if (calleeExpression !is JetSimpleNameExpression) {
|
||||||
return null
|
return null
|
||||||
|
|||||||
+2
-1
@@ -225,7 +225,8 @@ public class CallExpressionResolver {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static boolean canInstantiateAnnotationClass(@NotNull JetCallExpression expression) {
|
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) {
|
if (parent instanceof JetValueArgument) {
|
||||||
return PsiTreeUtil.getParentOfType(parent, JetAnnotationEntry.class) != null;
|
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);
|
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")
|
@TestMetadata("compiler/testData/diagnostics/testsWithStdLib/annotations/annotationApplicability")
|
||||||
@TestDataPath("$PROJECT_ROOT")
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
@RunWith(JUnit3RunnerWithInners.class)
|
@RunWith(JUnit3RunnerWithInners.class)
|
||||||
|
|||||||
Reference in New Issue
Block a user