From 415acfbd0580c18b445acffb42fb6a9d0d2e5963 Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Thu, 15 Sep 2016 22:24:50 +0300 Subject: [PATCH] Kapt: asMemberOf() should also check the containing type itself, not only its supertypes (KT-13823) (cherry picked from commit 9f9ffdf) --- .../kotlin/annotation/processing/impl/KotlinTypes.kt | 9 +++++++-- .../testData/processors/AsMemberOf.kt | 4 +++- .../processing/test/processor/ProcessorTests.kt | 5 +++++ 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/plugins/annotation-processing/src/org/jetbrains/kotlin/annotation/processing/impl/KotlinTypes.kt b/plugins/annotation-processing/src/org/jetbrains/kotlin/annotation/processing/impl/KotlinTypes.kt index 8ddd7875503..63925d3506c 100644 --- a/plugins/annotation-processing/src/org/jetbrains/kotlin/annotation/processing/impl/KotlinTypes.kt +++ b/plugins/annotation-processing/src/org/jetbrains/kotlin/annotation/processing/impl/KotlinTypes.kt @@ -250,9 +250,14 @@ class KotlinTypes( val containingType = containing.psiType val member = (element as JeElement).psi as? PsiMember ?: return element.asType() - val methodContainingClass = member.containingClass ?: return element.asType() + val memberContainingClass = member.containingClass ?: return element.asType() + + val relevantSuperType = if (memberContainingClass == containingType.resolve()) { + containingType + } else { + containingType.superTypes.findSuperType(memberContainingClass) ?: return element.asType() + } - val relevantSuperType = containingType.superTypes.findSuperType(methodContainingClass) ?: return element.asType() val resolveResult = relevantSuperType.resolveGenerics() if (!resolveResult.isValidResult) return element.asType() val substitutor = resolveResult.substitutor diff --git a/plugins/annotation-processing/testData/processors/AsMemberOf.kt b/plugins/annotation-processing/testData/processors/AsMemberOf.kt index f610faa07d8..616b74c4baa 100644 --- a/plugins/annotation-processing/testData/processors/AsMemberOf.kt +++ b/plugins/annotation-processing/testData/processors/AsMemberOf.kt @@ -5,7 +5,9 @@ open class Base { fun m(t: T): T = null!! } -class Impl : Base() +class Impl : Base() { + fun implM(t: T): T = null!! +} annotation class Anno diff --git a/plugins/plugins-tests/tests/org/jetbrains/kotlin/annotation/processing/test/processor/ProcessorTests.kt b/plugins/plugins-tests/tests/org/jetbrains/kotlin/annotation/processing/test/processor/ProcessorTests.kt index d6edd0b11a9..778c76044c3 100644 --- a/plugins/plugins-tests/tests/org/jetbrains/kotlin/annotation/processing/test/processor/ProcessorTests.kt +++ b/plugins/plugins-tests/tests/org/jetbrains/kotlin/annotation/processing/test/processor/ProcessorTests.kt @@ -263,8 +263,10 @@ class ProcessorTests : AbstractProcessorTest() { val fType = f.asType() as JeDeclaredType val base = env.findClass("Base") + val impl = env.findClass("Impl") val baseF = base.findField("f") val baseM = base.findMethod("m", "T") + val implM = impl.findMethod("implM", "T") fun check(element: Element, expectedTypeSignature: String) { assertEquals(expectedTypeSignature, env.typeUtils.asMemberOf(fType, element).toString()) @@ -275,6 +277,9 @@ class ProcessorTests : AbstractProcessorTest() { assertEquals("T", baseF.asType().toString()) check(baseF, "java.lang.String") + + assertEquals("(T)T", implM.asType().toString()) + check(implM, "(java.lang.String)java.lang.String") } fun testDispose() {