Allow annotation constructor calls
in default parameter value expressions of anonymous classes (if it is not a compile-time constant, it will be reported separately). #KT-10136 Fixed
This commit is contained in:
+17
-6
@@ -284,14 +284,25 @@ public class CallExpressionResolver {
|
|||||||
//noinspection unchecked
|
//noinspection unchecked
|
||||||
PsiElement parent = PsiTreeUtil.getParentOfType(expression, KtValueArgument.class, KtParameter.class);
|
PsiElement parent = PsiTreeUtil.getParentOfType(expression, KtValueArgument.class, KtParameter.class);
|
||||||
if (parent instanceof KtValueArgument) {
|
if (parent instanceof KtValueArgument) {
|
||||||
return PsiTreeUtil.getParentOfType(parent, KtAnnotationEntry.class) != null;
|
if (PsiTreeUtil.getParentOfType(parent, KtAnnotationEntry.class) != null) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
parent = PsiTreeUtil.getParentOfType(parent, KtParameter.class);
|
||||||
|
if (parent != null) {
|
||||||
|
return isUnderAnnotationClassDeclaration(trace, parent);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (parent instanceof KtParameter) {
|
else if (parent instanceof KtParameter) {
|
||||||
KtClass ktClass = PsiTreeUtil.getParentOfType(parent, KtClass.class);
|
return isUnderAnnotationClassDeclaration(trace, parent);
|
||||||
if (ktClass != null) {
|
}
|
||||||
DeclarationDescriptor descriptor = trace.get(BindingContext.DECLARATION_TO_DESCRIPTOR, ktClass);
|
return false;
|
||||||
return DescriptorUtils.isAnnotationClass(descriptor);
|
}
|
||||||
}
|
|
||||||
|
private static boolean isUnderAnnotationClassDeclaration(@NotNull BindingTrace trace, PsiElement parent) {
|
||||||
|
KtClass ktClass = PsiTreeUtil.getParentOfType(parent, KtClass.class);
|
||||||
|
if (ktClass != null) {
|
||||||
|
DeclarationDescriptor descriptor = trace.get(BindingContext.DECLARATION_TO_DESCRIPTOR, ktClass);
|
||||||
|
return DescriptorUtils.isAnnotationClass(descriptor);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,19 @@
|
|||||||
|
annotation class A
|
||||||
|
|
||||||
|
@Target(AnnotationTarget.CLASS)
|
||||||
|
@Retention(AnnotationRetention.RUNTIME)
|
||||||
|
annotation class B(val items: Array<A> = arrayOf(A()))
|
||||||
|
|
||||||
|
@B
|
||||||
|
class C
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
val bClass = B::class.java
|
||||||
|
val cClass = C::class.java
|
||||||
|
|
||||||
|
val items = cClass.getAnnotation(bClass).items
|
||||||
|
assert(items.size == 1) { "Expected: [A()], got ${items.asList()}" }
|
||||||
|
assert(items[0] is A) { "Expected: [A()], got ${items.asList()}" }
|
||||||
|
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
annotation class A
|
||||||
|
annotation class A1(val x: Int)
|
||||||
|
|
||||||
|
annotation class B(
|
||||||
|
val a: A = A(),
|
||||||
|
val x: Int = <!ANNOTATION_PARAMETER_DEFAULT_VALUE_MUST_BE_CONSTANT!>A1(42).x<!>,
|
||||||
|
val aa: Array<A> = arrayOf(A())
|
||||||
|
)
|
||||||
+26
@@ -0,0 +1,26 @@
|
|||||||
|
package
|
||||||
|
|
||||||
|
public final annotation class A : kotlin.Annotation {
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
||||||
|
public final annotation class A1 : kotlin.Annotation {
|
||||||
|
public constructor A1(/*0*/ x: kotlin.Int)
|
||||||
|
public final val x: kotlin.Int
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
||||||
|
public final annotation class B : kotlin.Annotation {
|
||||||
|
public constructor B(/*0*/ a: A = ..., /*1*/ x: kotlin.Int = ..., /*2*/ aa: kotlin.Array<A> = ...)
|
||||||
|
public final val a: A
|
||||||
|
public final val aa: kotlin.Array<A>
|
||||||
|
public final val x: kotlin.Int
|
||||||
|
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
|
||||||
|
}
|
||||||
@@ -207,6 +207,12 @@ public class DiagnosticsTestWithStdLibGenerated extends AbstractDiagnosticsTestW
|
|||||||
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/diagnostics/testsWithStdLib/annotations/annotationParameters"), Pattern.compile("^(.+)\\.kt$"), true);
|
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/diagnostics/testsWithStdLib/annotations/annotationParameters"), Pattern.compile("^(.+)\\.kt$"), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt10136.kt")
|
||||||
|
public void testKt10136() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/testsWithStdLib/annotations/annotationParameters/kt10136.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("orderWithValue.kt")
|
@TestMetadata("orderWithValue.kt")
|
||||||
public void testOrderWithValue() throws Exception {
|
public void testOrderWithValue() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/testsWithStdLib/annotations/annotationParameters/orderWithValue.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/testsWithStdLib/annotations/annotationParameters/orderWithValue.kt");
|
||||||
|
|||||||
+6
@@ -100,6 +100,12 @@ public class BlackBoxWithStdlibCodegenTestGenerated extends AbstractBlackBoxCode
|
|||||||
doTestWithStdlib(fileName);
|
doTestWithStdlib(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt10136.kt")
|
||||||
|
public void testKt10136() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/annotations/kt10136.kt");
|
||||||
|
doTestWithStdlib(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("nestedClassPropertyAsParameter.kt")
|
@TestMetadata("nestedClassPropertyAsParameter.kt")
|
||||||
public void testNestedClassPropertyAsParameter() throws Exception {
|
public void testNestedClassPropertyAsParameter() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/annotations/nestedClassPropertyAsParameter.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/annotations/nestedClassPropertyAsParameter.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user