From 0c5b70052367d36d4ff5270a76fdb679359917c5 Mon Sep 17 00:00:00 2001 From: Ilya Chernikov Date: Mon, 19 Feb 2024 09:38:57 +0100 Subject: [PATCH] K2: fix annotation search on supertypes in assignment plugin Current implementation checks only immediate supertype, while in case of gradle build scripts DSL, the annotated superclass is located deeper in the hierarchy. The fix implements a recursive supertype check. #KT-65983 fixed --- .../k2/FirAssignAnnotationMatchingService.kt | 2 +- .../testData/codegen/annotation.kt | 22 +++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/plugins/assign-plugin/assign-plugin.k2/src/org/jetbrains/kotlin/assignment/plugin/k2/FirAssignAnnotationMatchingService.kt b/plugins/assign-plugin/assign-plugin.k2/src/org/jetbrains/kotlin/assignment/plugin/k2/FirAssignAnnotationMatchingService.kt index 03f0b232566..67f8ea4ac8a 100644 --- a/plugins/assign-plugin/assign-plugin.k2/src/org/jetbrains/kotlin/assignment/plugin/k2/FirAssignAnnotationMatchingService.kt +++ b/plugins/assign-plugin/assign-plugin.k2/src/org/jetbrains/kotlin/assignment/plugin/k2/FirAssignAnnotationMatchingService.kt @@ -43,7 +43,7 @@ internal class FirAssignAnnotationMatchingService( if (this.annotations.any { it.toAnnotationClassId(session)?.asSingleFqName() in annotationClassIds }) return true return resolvedSuperTypeRefs.any { superTypeRef -> val symbol = superTypeRef.type.fullyExpandedType(session).toRegularClassSymbol(session) ?: return@any false - symbol.annotations.any { it.toAnnotationClassId(session)?.asSingleFqName() in annotationClassIds } + symbol.annotated() } } } diff --git a/plugins/assign-plugin/testData/codegen/annotation.kt b/plugins/assign-plugin/testData/codegen/annotation.kt index b6021c2a71f..923a3fe0f34 100644 --- a/plugins/assign-plugin/testData/codegen/annotation.kt +++ b/plugins/assign-plugin/testData/codegen/annotation.kt @@ -45,6 +45,16 @@ data class KotlinStringProperty(private var v: String): KotlinProperty { override fun get() = this.v } +abstract class KotlinAbstractStringProperty: KotlinProperty + +data class KotlinStringProperty2(private var v: String): KotlinAbstractStringProperty() { + override fun assign(v: String) { + this.v = v + } + override fun get() = this.v +} + + @ValueContainer data class KotlinClassStringProperty(private var v: String) { fun assign(v: String) { @@ -91,6 +101,18 @@ fun `should work with annotation on Kotlin interface`(): String { } } +fun `should work with annotation on Kotlin interface via intermediate supertype`(): String { + data class Task(val input: KotlinStringProperty2) + val task = Task(KotlinStringProperty2("Fail")) + task.input = "OK" + + return if (task.input.get() != "OK") { + "Fail: ${task.input.get()}" + } else { + "OK" + } +} + fun `should work with annotation on Kotlin class`(): String { data class Task(val input: KotlinClassStringProperty) val task = Task(KotlinClassStringProperty("Fail"))