[FIR] When enhancing a fake override, do not use dispatch qualifiers When a fake override is created in a class with a JSpecify qualifier - NullMarked or NullUnmarked - these annotations should not impact the enhanced types of this override. ^KT-65719 Fixed
diff --git a/compiler/fir/fir-jvm/src/org/jetbrains/kotlin/fir/java/enhancement/SignatureEnhancement.kt b/compiler/fir/fir-jvm/src/org/jetbrains/kotlin/fir/java/enhancement/SignatureEnhancement.kt index 815e34d..d6170b9 100644 --- a/compiler/fir/fir-jvm/src/org/jetbrains/kotlin/fir/java/enhancement/SignatureEnhancement.kt +++ b/compiler/fir/fir-jvm/src/org/jetbrains/kotlin/fir/java/enhancement/SignatureEnhancement.kt
@@ -137,8 +137,10 @@ return enhancementsCache.enhancedVariables.getValue(property, this to name) } - private fun FirDeclaration.computeDefaultQualifiers() = - typeQualifierResolver.extractAndMergeDefaultQualifiers(contextQualifiers, annotations) + private fun FirCallableDeclaration.computeDefaultQualifiers(): JavaTypeQualifiersByElementType? { + if (isSubstitutionOrIntersectionOverride) return null // Enhancement of fake overrides should not use dispatcher's qualifiers. + return typeQualifierResolver.extractAndMergeDefaultQualifiers(contextQualifiers, annotations) + } @PrivateForInline internal fun enhance(
diff --git a/compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/FakeOverride.fir.kt b/compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/FakeOverride.fir.kt new file mode 100644 index 0000000..683146a --- /dev/null +++ b/compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/FakeOverride.fir.kt
@@ -0,0 +1,29 @@ +// JSPECIFY_STATE: strict +// ISSUE: KT-65719 + +// FILE: MessageOrBuilder.java +public interface MessageOrBuilder { + Object o(); +} + +// FILE: GeneratedMessage.java +public class GeneratedMessage implements MessageOrBuilder { + @Override + public Object o() { + return null; + } +} + +// FILE: FooOrBuilder.java +public interface FooOrBuilder extends MessageOrBuilder {} + +// FILE: Foo.java +import org.jspecify.annotations.NullMarked; + +@NullMarked +public class Foo extends GeneratedMessage implements FooOrBuilder {} + +// FILE: main.kt +fun main() { + <!DEBUG_INFO_EXPRESSION_TYPE("(kotlin.Any..kotlin.Any?)")!>Foo().o()<!> +}
diff --git a/compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/FakeOverride.kt b/compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/FakeOverride.kt index e0b6c41..155b67b 100644 --- a/compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/FakeOverride.kt +++ b/compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/FakeOverride.kt
@@ -1,4 +1,3 @@ -// FIR_IDENTICAL // JSPECIFY_STATE: strict // ISSUE: KT-65719