[FIR] Check context receivers in FirStandardOverrideChecker
#KT-61145 Fixed
This commit is contained in:
committed by
Space Team
parent
4dc0d68288
commit
86ef313233
+6
@@ -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 {
|
||||
|
||||
+6
@@ -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 {
|
||||
|
||||
+6
@@ -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 {
|
||||
|
||||
+6
@@ -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 {
|
||||
|
||||
+20
-13
@@ -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() {}
|
||||
}
|
||||
Generated
+6
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user