diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java index 16b0b55f461..a1364cf7d3f 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java @@ -18374,6 +18374,12 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag runTest("compiler/testData/diagnostics/tests/j+k/OverrideVararg.kt"); } + @Test + @TestMetadata("overrideWithErasure.kt") + public void testOverrideWithErasure() throws Exception { + runTest("compiler/testData/diagnostics/tests/j+k/overrideWithErasure.kt"); + } + @Test @TestMetadata("overrideWithSamAndTypeParameter.kt") public void testOverrideWithSamAndTypeParameter() throws Exception { diff --git a/compiler/fir/analysis-tests/testData/resolve/scopes/specialFunctionInJava_2.overrides.txt b/compiler/fir/analysis-tests/testData/resolve/scopes/specialFunctionInJava_2.overrides.txt index d6fe7a7a09c..df658331453 100644 --- a/compiler/fir/analysis-tests/testData/resolve/scopes/specialFunctionInJava_2.overrides.txt +++ b/compiler/fir/analysis-tests/testData/resolve/scopes/specialFunctionInJava_2.overrides.txt @@ -4,10 +4,19 @@ SomeMap: [SubstitutionOverride]: public abstract fun containsKey(key: R|K|): R|kotlin/Boolean| from Use site scope of kotlin/collections/MutableMap [id: 2] [Library]: public abstract fun containsKey(key: R|K|): R|kotlin/Boolean| from Use site scope of kotlin/collections/Map [id: 3] [Library]: public abstract fun containsKey(key: R|K|): R|kotlin/Boolean| from Use site scope of kotlin/collections/Map [id: 3] - [SubstitutionOverride]: public abstract fun containsValue(value: R|ft|): R|kotlin/Boolean| from Java enhancement scope for /SomeMap [id: 0] - [SubstitutionOverride]: public abstract fun containsValue(value: R|V|): R|kotlin/Boolean| from Use site scope of kotlin/collections/MutableMap [id: 1] - [Library]: public abstract fun containsValue(value: R|V|): R|kotlin/Boolean| from Use site scope of kotlin/collections/Map [id: 2] - [Library]: public abstract fun containsValue(value: R|V|): R|kotlin/Boolean| from Use site scope of kotlin/collections/Map [id: 2] + [SubstitutionOverride]: public abstract fun containsKey(key: R|ft|): R|kotlin/Boolean| from Substitution scope for [Java enhancement scope for /MyMap] for type SomeMap [id: 4] + [Enhancement]: public abstract fun containsKey(key: R|ft|): R|kotlin/Boolean| from Java enhancement scope for /MyMap [id: 5] + [SubstitutionOverride]: public abstract fun containsKey(key: R|ft|): R|kotlin/Boolean| from Substitution scope for [Java enhancement scope for /MyBaseMap] for type MyMap [id: 6] + [Enhancement]: public abstract fun containsKey(key: R|ft|): R|kotlin/Boolean| from Java enhancement scope for /MyBaseMap [id: 7] + [SubstitutionOverride]: public abstract fun containsKey(key: R|ft|): R|kotlin/Boolean| from Substitution scope for [Java enhancement scope for /MyBaseMap] for type MyMap [id: 6] + [Enhancement]: public abstract fun containsKey(key: R|ft|): R|kotlin/Boolean| from Java enhancement scope for /MyBaseMap [id: 7] + [IntersectionOverride]: public abstract fun containsValue(value: R|ft|): R|kotlin/Boolean| from Java enhancement scope for /SomeMap [id: 0] + [SubstitutionOverride]: public abstract fun containsValue(value: R|ft|): R|kotlin/Boolean| from Substitution scope for [Use site scope of kotlin/collections/MutableMap] for type SomeMap [id: 1] + [SubstitutionOverride]: public abstract fun containsValue(value: R|V|): R|kotlin/Boolean| from Use site scope of kotlin/collections/MutableMap [id: 2] + [Library]: public abstract fun containsValue(value: R|V|): R|kotlin/Boolean| from Use site scope of kotlin/collections/Map [id: 3] + [Library]: public abstract fun containsValue(value: R|V|): R|kotlin/Boolean| from Use site scope of kotlin/collections/Map [id: 3] + [SubstitutionOverride]: public abstract fun containsValue(key: R|ft|): R|kotlin/Boolean| from Substitution scope for [Java enhancement scope for /MyMap] for type SomeMap [id: 4] + [Enhancement]: public abstract fun containsValue(key: R|ft|): R|kotlin/Boolean| from Java enhancement scope for /MyMap [id: 5] [IntersectionOverride]: public abstract operator fun get(key: R|ft|): R|V3?| from Java enhancement scope for /SomeMap [id: 0] [SubstitutionOverride]: public abstract operator fun get(key: R|ft|): R|V3?| from Substitution scope for [Use site scope of kotlin/collections/MutableMap] for type SomeMap [id: 1] [SubstitutionOverride]: public abstract operator fun get(key: R|K|): R|V?| from Use site scope of kotlin/collections/MutableMap [id: 2] diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java index 9ea853848d0..ee3877ebbcc 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java @@ -18374,6 +18374,12 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti runTest("compiler/testData/diagnostics/tests/j+k/OverrideVararg.kt"); } + @Test + @TestMetadata("overrideWithErasure.kt") + public void testOverrideWithErasure() throws Exception { + runTest("compiler/testData/diagnostics/tests/j+k/overrideWithErasure.kt"); + } + @Test @TestMetadata("overrideWithSamAndTypeParameter.kt") public void testOverrideWithSamAndTypeParameter() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java index d6f4af93ff7..4ce5d8f34ed 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java @@ -18374,6 +18374,12 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac runTest("compiler/testData/diagnostics/tests/j+k/OverrideVararg.kt"); } + @Test + @TestMetadata("overrideWithErasure.kt") + public void testOverrideWithErasure() throws Exception { + runTest("compiler/testData/diagnostics/tests/j+k/overrideWithErasure.kt"); + } + @Test @TestMetadata("overrideWithSamAndTypeParameter.kt") public void testOverrideWithSamAndTypeParameter() throws Exception { diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaOverrideChecker.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaOverrideChecker.kt index 44ab3a88eb3..10482a09207 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaOverrideChecker.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaOverrideChecker.kt @@ -153,12 +153,16 @@ class JavaOverrideChecker internal constructor( } private fun FirTypeRef?.isTypeParameterDependent(): Boolean = - this is FirResolvedTypeRef && type.lowerBoundIfFlexible().isTypeParameterDependent() + this is FirResolvedTypeRef && type.isTypeParameterDependent() - private fun ConeKotlinType.isTypeParameterDependent(): Boolean = - this is ConeTypeParameterType || this is ConeClassLikeType && typeArguments.any { argument -> + private fun ConeKotlinType.isTypeParameterDependent(): Boolean { + if (this is ConeFlexibleType) return lowerBound.isTypeParameterDependent() + if (this is ConeDefinitelyNotNullType) return original.isTypeParameterDependent() + + return this is ConeTypeParameterType || this is ConeClassLikeType && typeArguments.any { argument -> argument is ConeKotlinTypeProjection && argument.type.isTypeParameterDependent() } + } private fun FirCallableDeclaration.isTypeParameterDependent(): Boolean = typeParameters.isNotEmpty() || returnTypeRef.isTypeParameterDependent() || @@ -167,12 +171,14 @@ class JavaOverrideChecker internal constructor( private fun FirTypeRef.extractTypeParametersTo(result: MutableCollection) { if (this is FirResolvedTypeRef) { - type.lowerBoundIfFlexible().extractTypeParametersTo(result) + type.extractTypeParametersTo(result) } } private fun ConeKotlinType.extractTypeParametersTo(result: MutableCollection) { when (this) { + is ConeFlexibleType -> lowerBound.extractTypeParametersTo(result) + is ConeDefinitelyNotNullType -> original.extractTypeParametersTo(result) is ConeTypeParameterType -> { result += lookupTag.typeParameterSymbol.fir } diff --git a/compiler/testData/diagnostics/tests/j+k/overrideWithErasure.kt b/compiler/testData/diagnostics/tests/j+k/overrideWithErasure.kt new file mode 100644 index 00000000000..4580cf665b8 --- /dev/null +++ b/compiler/testData/diagnostics/tests/j+k/overrideWithErasure.kt @@ -0,0 +1,20 @@ +// FIR_IDENTICAL +// SKIP_TXT +// FILE: Base.java +public class Base { + public T foo(T t) { return t; } +} + +// FILE: Derived.java +public class Derived extends Base { + @Override + public E foo(CharSequence e) { + return (E) ""; + } +} + +// FILE: main.kt + +fun main(d: Derived) { + d.foo("") +} diff --git a/compiler/testData/loadJava/compiledJava/kotlinSignature/propagation/parameter/OverrideWithErasedParameter.fir.txt b/compiler/testData/loadJava/compiledJava/kotlinSignature/propagation/parameter/OverrideWithErasedParameter.fir.txt index 03dbef969c4..36f310ec555 100644 --- a/compiler/testData/loadJava/compiledJava/kotlinSignature/propagation/parameter/OverrideWithErasedParameter.fir.txt +++ b/compiler/testData/loadJava/compiledJava/kotlinSignature/propagation/parameter/OverrideWithErasedParameter.fir.txt @@ -2,8 +2,6 @@ public abstract interface OverrideWithErasedParameter : R|kotlin/Any| { public abstract interface Sub|> : R|test/OverrideWithErasedParameter.Super>| { public abstract fun foo(o: R|ft|): R|kotlin/Unit| - public abstract fun foo(t: R|ft|): R|kotlin/Unit| - } public abstract interface Super|> : R|kotlin/Any| { public abstract fun foo(t: R|ft|): R|kotlin/Unit| diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java index 3c4aae973f0..70f85297a6b 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java @@ -18380,6 +18380,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/j+k/OverrideVararg.kt"); } + @Test + @TestMetadata("overrideWithErasure.kt") + public void testOverrideWithErasure() throws Exception { + runTest("compiler/testData/diagnostics/tests/j+k/overrideWithErasure.kt"); + } + @Test @TestMetadata("overrideWithSamAndTypeParameter.kt") public void testOverrideWithSamAndTypeParameter() throws Exception {