[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");
|
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
|
@Test
|
||||||
@TestMetadata("DefaultParameterValueInOverride.kt")
|
@TestMetadata("DefaultParameterValueInOverride.kt")
|
||||||
public void testDefaultParameterValueInOverride() throws Exception {
|
public void testDefaultParameterValueInOverride() throws Exception {
|
||||||
|
|||||||
+6
@@ -24110,6 +24110,12 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated
|
|||||||
runTest("compiler/testData/diagnostics/tests/override/ConflictingPropertySignatureFromSuperclass.kt");
|
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
|
@Test
|
||||||
@TestMetadata("DefaultParameterValueInOverride.kt")
|
@TestMetadata("DefaultParameterValueInOverride.kt")
|
||||||
public void testDefaultParameterValueInOverride() throws Exception {
|
public void testDefaultParameterValueInOverride() throws Exception {
|
||||||
|
|||||||
+6
@@ -24110,6 +24110,12 @@ public class FirLightTreeOldFrontendDiagnosticsTestGenerated extends AbstractFir
|
|||||||
runTest("compiler/testData/diagnostics/tests/override/ConflictingPropertySignatureFromSuperclass.kt");
|
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
|
@Test
|
||||||
@TestMetadata("DefaultParameterValueInOverride.kt")
|
@TestMetadata("DefaultParameterValueInOverride.kt")
|
||||||
public void testDefaultParameterValueInOverride() throws Exception {
|
public void testDefaultParameterValueInOverride() throws Exception {
|
||||||
|
|||||||
+6
@@ -24116,6 +24116,12 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia
|
|||||||
runTest("compiler/testData/diagnostics/tests/override/ConflictingPropertySignatureFromSuperclass.kt");
|
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
|
@Test
|
||||||
@TestMetadata("DefaultParameterValueInOverride.kt")
|
@TestMetadata("DefaultParameterValueInOverride.kt")
|
||||||
public void testDefaultParameterValueInOverride() throws Exception {
|
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 {
|
override fun isOverriddenFunction(overrideCandidate: FirSimpleFunction, baseDeclaration: FirSimpleFunction): Boolean {
|
||||||
if (Visibilities.isPrivate(baseDeclaration.visibility)) return false
|
|
||||||
|
|
||||||
if (overrideCandidate.valueParameters.size != baseDeclaration.valueParameters.size) return false
|
if (overrideCandidate.valueParameters.size != baseDeclaration.valueParameters.size) return false
|
||||||
|
|
||||||
val substitutor = buildTypeParametersSubstitutorIfCompatible(overrideCandidate, baseDeclaration) ?: return false
|
val substitutor = buildTypeParametersSubstitutorIfCompatible(overrideCandidate, baseDeclaration) ?: return false
|
||||||
|
|
||||||
overrideCandidate.lazyResolveToPhase(FirResolvePhase.TYPES)
|
if (!commonCallableChecks(overrideCandidate, baseDeclaration, substitutor)) return false
|
||||||
baseDeclaration.lazyResolveToPhase(FirResolvePhase.TYPES)
|
|
||||||
if (!isEqualReceiverTypes(
|
|
||||||
overrideCandidate.receiverParameter?.typeRef,
|
|
||||||
baseDeclaration.receiverParameter?.typeRef,
|
|
||||||
substitutor,
|
|
||||||
)
|
|
||||||
) return false
|
|
||||||
|
|
||||||
return overrideCandidate.valueParameters.zip(baseDeclaration.valueParameters).all { (memberParam, selfParam) ->
|
return overrideCandidate.valueParameters.zip(baseDeclaration.valueParameters).all { (memberParam, selfParam) ->
|
||||||
isEqualTypes(memberParam.returnTypeRef, selfParam.returnTypeRef, substitutor)
|
isEqualTypes(memberParam.returnTypeRef, selfParam.returnTypeRef, substitutor)
|
||||||
@@ -146,12 +137,28 @@ class FirStandardOverrideChecker(private val session: FirSession) : FirAbstractO
|
|||||||
overrideCandidate: FirCallableDeclaration,
|
overrideCandidate: FirCallableDeclaration,
|
||||||
baseDeclaration: FirProperty
|
baseDeclaration: FirProperty
|
||||||
): Boolean {
|
): Boolean {
|
||||||
if (Visibilities.isPrivate(baseDeclaration.visibility)) return false
|
|
||||||
|
|
||||||
if (overrideCandidate !is FirProperty) return false
|
if (overrideCandidate !is FirProperty) return false
|
||||||
val substitutor = buildTypeParametersSubstitutorIfCompatible(overrideCandidate, baseDeclaration) ?: 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)
|
overrideCandidate.lazyResolveToPhase(FirResolvePhase.TYPES)
|
||||||
baseDeclaration.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");
|
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
|
@Test
|
||||||
@TestMetadata("DefaultParameterValueInOverride.kt")
|
@TestMetadata("DefaultParameterValueInOverride.kt")
|
||||||
public void testDefaultParameterValueInOverride() throws Exception {
|
public void testDefaultParameterValueInOverride() throws Exception {
|
||||||
|
|||||||
Reference in New Issue
Block a user