[FIR] Change diagnostic INITIALIZER_TYPE_MISMATCH to work with for loop

^KTIJ-25251 fixed


Merge-request: KT-MR-10507
Merged-by: Egor Kulikov <Egor.Kulikov@jetbrains.com>
This commit is contained in:
Egor Kulikov
2023-06-08 09:40:09 +00:00
committed by Space Team
parent 7087ba3ca9
commit f2f979134d
12 changed files with 60 additions and 7 deletions
@@ -2142,7 +2142,7 @@ sealed interface KtFirDiagnostic<PSI : PsiElement> : KtDiagnosticWithPsi<PSI> {
val usedTypeParameter: KtTypeParameterSymbol
}
interface InitializerTypeMismatch : KtFirDiagnostic<KtProperty> {
interface InitializerTypeMismatch : KtFirDiagnostic<KtNamedDeclaration> {
override val diagnosticClass get() = InitializerTypeMismatch::class
val expectedType: KtType
val actualType: KtType
@@ -2583,7 +2583,7 @@ internal class InitializerTypeMismatchImpl(
override val isMismatchDueToNullability: Boolean,
firDiagnostic: KtPsiDiagnostic,
token: KtLifetimeToken,
) : KtAbstractFirDiagnostic<KtProperty>(firDiagnostic, token), KtFirDiagnostic.InitializerTypeMismatch
) : KtAbstractFirDiagnostic<KtNamedDeclaration>(firDiagnostic, token), KtFirDiagnostic.InitializerTypeMismatch
internal class GetterVisibilityDiffersFromPropertyVisibilityImpl(
firDiagnostic: KtPsiDiagnostic,
@@ -7072,6 +7072,12 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia
runTest("compiler/testData/diagnostics/tests/controlStructures/forLoopWithNullableRange.kt");
}
@Test
@TestMetadata("forWithIncorrectTypeSpecializer.kt")
public void testForWithIncorrectTypeSpecializer() throws Exception {
runTest("compiler/testData/diagnostics/tests/controlStructures/forWithIncorrectTypeSpecializer.kt");
}
@Test
@TestMetadata("forWithNullableIterator.kt")
public void testForWithNullableIterator() throws Exception {
@@ -7072,6 +7072,12 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated
runTest("compiler/testData/diagnostics/tests/controlStructures/forLoopWithNullableRange.kt");
}
@Test
@TestMetadata("forWithIncorrectTypeSpecializer.kt")
public void testForWithIncorrectTypeSpecializer() throws Exception {
runTest("compiler/testData/diagnostics/tests/controlStructures/forWithIncorrectTypeSpecializer.kt");
}
@Test
@TestMetadata("forWithNullableIterator.kt")
public void testForWithNullableIterator() throws Exception {
@@ -7072,6 +7072,12 @@ public class FirLightTreeOldFrontendDiagnosticsTestGenerated extends AbstractFir
runTest("compiler/testData/diagnostics/tests/controlStructures/forLoopWithNullableRange.kt");
}
@Test
@TestMetadata("forWithIncorrectTypeSpecializer.kt")
public void testForWithIncorrectTypeSpecializer() throws Exception {
runTest("compiler/testData/diagnostics/tests/controlStructures/forWithIncorrectTypeSpecializer.kt");
}
@Test
@TestMetadata("forWithNullableIterator.kt")
public void testForWithNullableIterator() throws Exception {
@@ -7078,6 +7078,12 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia
runTest("compiler/testData/diagnostics/tests/controlStructures/forLoopWithNullableRange.kt");
}
@Test
@TestMetadata("forWithIncorrectTypeSpecializer.kt")
public void testForWithIncorrectTypeSpecializer() throws Exception {
runTest("compiler/testData/diagnostics/tests/controlStructures/forWithIncorrectTypeSpecializer.kt");
}
@Test
@TestMetadata("forWithNullableIterator.kt")
public void testForWithNullableIterator() throws Exception {
@@ -1055,7 +1055,8 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") {
) {
parameter<FirTypeParameterSymbol>("usedTypeParameter")
}
val INITIALIZER_TYPE_MISMATCH by error<KtProperty>(PositioningStrategy.PROPERTY_INITIALIZER) {
// Type parameter is KtNamedDeclaration because PSI of FirProperty can be KtParameter in for loop
val INITIALIZER_TYPE_MISMATCH by error<KtNamedDeclaration>(PositioningStrategy.PROPERTY_INITIALIZER) {
parameter<ConeKotlinType>("expectedType")
parameter<ConeKotlinType>("actualType")
parameter<Boolean>("isMismatchDueToNullability")
@@ -561,7 +561,7 @@ object FirErrors {
val CONST_VAL_WITH_NON_CONST_INITIALIZER by error0<KtExpression>()
val WRONG_SETTER_PARAMETER_TYPE by error2<KtTypeReference, ConeKotlinType, ConeKotlinType>()
val DELEGATE_USES_EXTENSION_PROPERTY_TYPE_PARAMETER by deprecationError1<KtProperty, FirTypeParameterSymbol>(ForbidUsingExtensionPropertyTypeParameterInDelegate, SourceElementPositioningStrategies.PROPERTY_DELEGATE)
val INITIALIZER_TYPE_MISMATCH by error3<KtProperty, ConeKotlinType, ConeKotlinType, Boolean>(SourceElementPositioningStrategies.PROPERTY_INITIALIZER)
val INITIALIZER_TYPE_MISMATCH by error3<KtNamedDeclaration, ConeKotlinType, ConeKotlinType, Boolean>(SourceElementPositioningStrategies.PROPERTY_INITIALIZER)
val GETTER_VISIBILITY_DIFFERS_FROM_PROPERTY_VISIBILITY by error0<KtModifierListOwner>(SourceElementPositioningStrategies.VISIBILITY_MODIFIER)
val SETTER_VISIBILITY_INCONSISTENT_WITH_PROPERTY_VISIBILITY by error0<KtModifierListOwner>(SourceElementPositioningStrategies.VISIBILITY_MODIFIER)
val WRONG_SETTER_RETURN_TYPE by error0<KtTypeReference>()
@@ -929,9 +929,13 @@ object PositioningStrategies {
val REIFIED_MODIFIER: PositioningStrategy<KtModifierListOwner> =
ModifierSetBasedPositioningStrategy(KtTokens.REIFIED_KEYWORD)
val PROPERTY_INITIALIZER: PositioningStrategy<KtProperty> = object : PositioningStrategy<KtProperty>() {
override fun mark(element: KtProperty): List<TextRange> {
return markElement(element.initializer ?: element)
val PROPERTY_INITIALIZER: PositioningStrategy<KtNamedDeclaration> = object : PositioningStrategy<KtNamedDeclaration>() {
override fun mark(element: KtNamedDeclaration): List<TextRange> {
return markElement(when (element) {
is KtProperty -> element.initializer ?: element
is KtParameter -> element.typeReference ?: element
else -> element
})
}
}
@@ -0,0 +1,9 @@
open class Base
class Derived : Base()
fun main() {
val derivedList: List<Base> = <!UNRESOLVED_REFERENCE!>listOf<!>(Derived(), Derived(), Derived())
for (derived: <!INITIALIZER_TYPE_MISMATCH!>Derived<!> in derivedList) {
}
}
@@ -0,0 +1,9 @@
open class Base
class Derived : Base()
fun main() {
val derivedList: List<Base> = <!UNRESOLVED_REFERENCE!>listOf<!>(Derived(), Derived(), Derived())
for (derived: <!TYPE_MISMATCH_IN_FOR_LOOP!>Derived<!> in derivedList) {
}
}
@@ -7078,6 +7078,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest {
runTest("compiler/testData/diagnostics/tests/controlStructures/forLoopWithNullableRange.kt");
}
@Test
@TestMetadata("forWithIncorrectTypeSpecializer.kt")
public void testForWithIncorrectTypeSpecializer() throws Exception {
runTest("compiler/testData/diagnostics/tests/controlStructures/forWithIncorrectTypeSpecializer.kt");
}
@Test
@TestMetadata("forWithNullableIterator.kt")
public void testForWithNullableIterator() throws Exception {