diff --git a/inject-kotlin/src/main/kotlin/io/micronaut/kotlin/processing/visitor/AbstractKotlinMethodElement.kt b/inject-kotlin/src/main/kotlin/io/micronaut/kotlin/processing/visitor/AbstractKotlinMethodElement.kt index 98da325637e..bad5dfeaac7 100644 --- a/inject-kotlin/src/main/kotlin/io/micronaut/kotlin/processing/visitor/AbstractKotlinMethodElement.kt +++ b/inject-kotlin/src/main/kotlin/io/micronaut/kotlin/processing/visitor/AbstractKotlinMethodElement.kt @@ -15,9 +15,8 @@ */ package io.micronaut.kotlin.processing.visitor -import com.google.devtools.ksp.symbol.KSFunctionDeclaration +import com.google.devtools.ksp.symbol.KSDeclaration import com.google.devtools.ksp.symbol.KSModifierListOwner -import com.google.devtools.ksp.symbol.KSPropertySetter import com.google.devtools.ksp.symbol.Modifier import io.micronaut.core.annotation.AnnotationMetadata import io.micronaut.core.util.ArrayUtils @@ -39,6 +38,8 @@ internal abstract class AbstractKotlinMethodElement( visitorContext: KotlinVisitorContext ) : AbstractKotlinElement(nativeType, annotationMetadataFactory, visitorContext), MethodElement { + abstract val declaration: KSDeclaration? + abstract val overridee: KSDeclaration? abstract val internalDeclaringType: ClassElement abstract val internalDeclaredTypeArguments: Map abstract val internalReturnType: ClassElement @@ -104,19 +105,16 @@ internal abstract class AbstractKotlinMethodElement( } override fun overrides(overridden: MethodElement): Boolean { - if (overridden !is AbstractKotlinElement<*>) { + if (this == overridden || overridden !is AbstractKotlinMethodElement<*>) { return false } - val nativeType = getNativeType().element - val overriddenNativeType = (overridden as AbstractKotlinElement<*>).nativeType.element - if (nativeType == overriddenNativeType) { - return false - } else if (nativeType is KSFunctionDeclaration) { - return overriddenNativeType == nativeType.findOverridee() - } else if (nativeType is KSPropertySetter && overriddenNativeType is KSPropertySetter) { - return overriddenNativeType.receiver == nativeType.receiver.findOverridee() + if (name != overridden.getName() || parameters.size != overridden.parameters.size) { + return false // Fast escape + } + if (nativeType == overridden.nativeType) { + return false // The same method } - return false + return overridee == overridden.declaration } override fun hides(memberElement: MemberElement?) = diff --git a/inject-kotlin/src/main/kotlin/io/micronaut/kotlin/processing/visitor/AbstractKotlinPropertyAccessorMethodElement.kt b/inject-kotlin/src/main/kotlin/io/micronaut/kotlin/processing/visitor/AbstractKotlinPropertyAccessorMethodElement.kt index 23f155c69b6..4e45773fe51 100644 --- a/inject-kotlin/src/main/kotlin/io/micronaut/kotlin/processing/visitor/AbstractKotlinPropertyAccessorMethodElement.kt +++ b/inject-kotlin/src/main/kotlin/io/micronaut/kotlin/processing/visitor/AbstractKotlinPropertyAccessorMethodElement.kt @@ -19,7 +19,6 @@ import com.google.devtools.ksp.* import com.google.devtools.ksp.symbol.* import io.micronaut.inject.ast.* import io.micronaut.inject.ast.annotation.ElementAnnotationMetadataFactory -import java.util.* @OptIn(KspExperimental::class) internal abstract class AbstractKotlinPropertyAccessorMethodElement( @@ -37,6 +36,14 @@ internal abstract class AbstractKotlinPropertyAccessorMethodElement?, elementAnnotationMetadataFactory: ElementAnnotationMetadataFactory, visitorContext: KotlinVisitorContext @@ -48,6 +48,10 @@ internal open class KotlinMethodElement( visitorContext ) + override val overridee: KSDeclaration? by lazy { + declaration.findOverridee() + } + override val internalDeclaringType: ClassElement by lazy { resolveDeclaringType(declaration, owningType) }