[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