[FIR] Check context receivers in FirStandardOverrideChecker

#KT-61145 Fixed
This commit is contained in:
Kirill Rakhman
2023-08-10 12:45:28 +02:00
committed by Space Team
parent 4dc0d68288
commit 86ef313233
8 changed files with 92 additions and 13 deletions
@@ -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 {
@@ -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 {
@@ -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 {
@@ -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 {
@@ -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)
}
}
}
@@ -0,0 +1,21 @@
// LANGUAGE: +ContextReceivers
interface I {
context(String, Int) fun foo()
}
class C1 : I {
context(String, Int) override fun foo() {}
}
<!ABSTRACT_MEMBER_NOT_IMPLEMENTED!>class C2<!> : I {
context(String) <!NOTHING_TO_OVERRIDE!>override<!> fun foo() {}
}
<!ABSTRACT_MEMBER_NOT_IMPLEMENTED!>class C3<!> : I {
context(Int, String) <!NOTHING_TO_OVERRIDE!>override<!> fun foo() {}
}
<!ABSTRACT_MEMBER_NOT_IMPLEMENTED!>class C4<!> : I {
context(String, Float) <!NOTHING_TO_OVERRIDE!>override<!> fun foo() {}
}
@@ -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() {}
}
@@ -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 {