diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java index ea4d6d69ed0..77be3b727a1 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java @@ -24110,6 +24110,12 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia runTest("compiler/testData/diagnostics/tests/override/ConflictingPropertySignatureFromSuperclass.kt"); } + @Test + @TestMetadata("contextReceivers.kt") + public void testContextReceivers() throws Exception { + runTest("compiler/testData/diagnostics/tests/override/contextReceivers.kt"); + } + @Test @TestMetadata("DefaultParameterValueInOverride.kt") public void testDefaultParameterValueInOverride() throws Exception { diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java index 53f24a7b01a..0f3b2917e43 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java @@ -24110,6 +24110,12 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated runTest("compiler/testData/diagnostics/tests/override/ConflictingPropertySignatureFromSuperclass.kt"); } + @Test + @TestMetadata("contextReceivers.kt") + public void testContextReceivers() throws Exception { + runTest("compiler/testData/diagnostics/tests/override/contextReceivers.kt"); + } + @Test @TestMetadata("DefaultParameterValueInOverride.kt") public void testDefaultParameterValueInOverride() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java index 4824447eb0b..e6869544daf 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java @@ -24110,6 +24110,12 @@ public class FirLightTreeOldFrontendDiagnosticsTestGenerated extends AbstractFir runTest("compiler/testData/diagnostics/tests/override/ConflictingPropertySignatureFromSuperclass.kt"); } + @Test + @TestMetadata("contextReceivers.kt") + public void testContextReceivers() throws Exception { + runTest("compiler/testData/diagnostics/tests/override/contextReceivers.kt"); + } + @Test @TestMetadata("DefaultParameterValueInOverride.kt") public void testDefaultParameterValueInOverride() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java index 8a189ebeda4..d4f727966a2 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java @@ -24116,6 +24116,12 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia runTest("compiler/testData/diagnostics/tests/override/ConflictingPropertySignatureFromSuperclass.kt"); } + @Test + @TestMetadata("contextReceivers.kt") + public void testContextReceivers() throws Exception { + runTest("compiler/testData/diagnostics/tests/override/contextReceivers.kt"); + } + @Test @TestMetadata("DefaultParameterValueInOverride.kt") public void testDefaultParameterValueInOverride() throws Exception { diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirStandardOverrideChecker.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirStandardOverrideChecker.kt index 2ae219078cf..3dd5d2c66ec 100644 --- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirStandardOverrideChecker.kt +++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirStandardOverrideChecker.kt @@ -122,20 +122,11 @@ class FirStandardOverrideChecker(private val session: FirSession) : FirAbstractO } override fun isOverriddenFunction(overrideCandidate: FirSimpleFunction, baseDeclaration: FirSimpleFunction): Boolean { - if (Visibilities.isPrivate(baseDeclaration.visibility)) return false - if (overrideCandidate.valueParameters.size != baseDeclaration.valueParameters.size) return false val substitutor = buildTypeParametersSubstitutorIfCompatible(overrideCandidate, baseDeclaration) ?: return false - overrideCandidate.lazyResolveToPhase(FirResolvePhase.TYPES) - baseDeclaration.lazyResolveToPhase(FirResolvePhase.TYPES) - if (!isEqualReceiverTypes( - overrideCandidate.receiverParameter?.typeRef, - baseDeclaration.receiverParameter?.typeRef, - substitutor, - ) - ) return false + if (!commonCallableChecks(overrideCandidate, baseDeclaration, substitutor)) return false return overrideCandidate.valueParameters.zip(baseDeclaration.valueParameters).all { (memberParam, selfParam) -> isEqualTypes(memberParam.returnTypeRef, selfParam.returnTypeRef, substitutor) @@ -146,12 +137,28 @@ class FirStandardOverrideChecker(private val session: FirSession) : FirAbstractO overrideCandidate: FirCallableDeclaration, baseDeclaration: FirProperty ): Boolean { - if (Visibilities.isPrivate(baseDeclaration.visibility)) return false - if (overrideCandidate !is FirProperty) return false val substitutor = buildTypeParametersSubstitutorIfCompatible(overrideCandidate, baseDeclaration) ?: return false + return commonCallableChecks(overrideCandidate, baseDeclaration, substitutor) + } + + private fun FirStandardOverrideChecker.commonCallableChecks( + overrideCandidate: FirCallableDeclaration, + baseDeclaration: FirCallableDeclaration, + substitutor: ConeSubstitutor, + ): Boolean { + if (Visibilities.isPrivate(baseDeclaration.visibility)) return false + if (overrideCandidate.contextReceivers.size != baseDeclaration.contextReceivers.size) return false + overrideCandidate.lazyResolveToPhase(FirResolvePhase.TYPES) baseDeclaration.lazyResolveToPhase(FirResolvePhase.TYPES) - return isEqualReceiverTypes(overrideCandidate.receiverParameter?.typeRef, baseDeclaration.receiverParameter?.typeRef, substitutor) + + return isEqualReceiverTypes( + overrideCandidate.receiverParameter?.typeRef, + baseDeclaration.receiverParameter?.typeRef, + substitutor + ) && overrideCandidate.contextReceivers.zip(baseDeclaration.contextReceivers).all { (memberParam, selfParam) -> + isEqualTypes(memberParam.typeRef, selfParam.typeRef, substitutor) + } } } diff --git a/compiler/testData/diagnostics/tests/override/contextReceivers.fir.kt b/compiler/testData/diagnostics/tests/override/contextReceivers.fir.kt new file mode 100644 index 00000000000..61a98c7d77a --- /dev/null +++ b/compiler/testData/diagnostics/tests/override/contextReceivers.fir.kt @@ -0,0 +1,21 @@ +// LANGUAGE: +ContextReceivers + +interface I { + context(String, Int) fun foo() +} + +class C1 : I { + context(String, Int) override fun foo() {} +} + +class C2 : I { + context(String) override fun foo() {} +} + +class C3 : I { + context(Int, String) override fun foo() {} +} + +class C4 : I { + context(String, Float) override fun foo() {} +} diff --git a/compiler/testData/diagnostics/tests/override/contextReceivers.kt b/compiler/testData/diagnostics/tests/override/contextReceivers.kt new file mode 100644 index 00000000000..76ed2750929 --- /dev/null +++ b/compiler/testData/diagnostics/tests/override/contextReceivers.kt @@ -0,0 +1,21 @@ +// LANGUAGE: +ContextReceivers + +interface I { + context(String, Int) fun foo() +} + +class C1 : I { + context(String, Int) override fun foo() {} +} + +class C2 : I { + context(String) override fun foo() {} +} + +class C3 : I { + context(Int, String) override fun foo() {} +} + +class C4 : I { + context(String, Float) override fun foo() {} +} 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 cd4518a5d60..d64a1095c6b 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 @@ -25272,6 +25272,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/override/ConflictingPropertySignatureFromSuperclass.kt"); } + @Test + @TestMetadata("contextReceivers.kt") + public void testContextReceivers() throws Exception { + runTest("compiler/testData/diagnostics/tests/override/contextReceivers.kt"); + } + @Test @TestMetadata("DefaultParameterValueInOverride.kt") public void testDefaultParameterValueInOverride() throws Exception {