From f2f979134d77b6b7633fe4d750ca2264fa885ebc Mon Sep 17 00:00:00 2001 From: Egor Kulikov Date: Thu, 8 Jun 2023 09:40:09 +0000 Subject: [PATCH] [FIR] Change diagnostic INITIALIZER_TYPE_MISMATCH to work with for loop ^KTIJ-25251 fixed Merge-request: KT-MR-10507 Merged-by: Egor Kulikov --- .../analysis/api/fir/diagnostics/KtFirDiagnostics.kt | 2 +- .../api/fir/diagnostics/KtFirDiagnosticsImpl.kt | 2 +- ...iagnosticCompilerTestFE10TestdataTestGenerated.java | 6 ++++++ ...sedDiagnosticCompilerFE10TestDataTestGenerated.java | 6 ++++++ ...irLightTreeOldFrontendDiagnosticsTestGenerated.java | 6 ++++++ .../FirPsiOldFrontendDiagnosticsTestGenerated.java | 6 ++++++ .../generator/diagnostics/FirDiagnosticsList.kt | 3 ++- .../kotlin/fir/analysis/diagnostics/FirErrors.kt | 2 +- .../kotlin/diagnostics/PositioningStrategies.kt | 10 +++++++--- .../forWithIncorrectTypeSpecializer.fir.kt | 9 +++++++++ .../forWithIncorrectTypeSpecializer.kt | 9 +++++++++ .../kotlin/test/runners/DiagnosticTestGenerated.java | 6 ++++++ 12 files changed, 60 insertions(+), 7 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/controlStructures/forWithIncorrectTypeSpecializer.fir.kt create mode 100644 compiler/testData/diagnostics/tests/controlStructures/forWithIncorrectTypeSpecializer.kt diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt index 98d616d2b25..65ee64df13f 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt @@ -2142,7 +2142,7 @@ sealed interface KtFirDiagnostic : KtDiagnosticWithPsi { val usedTypeParameter: KtTypeParameterSymbol } - interface InitializerTypeMismatch : KtFirDiagnostic { + interface InitializerTypeMismatch : KtFirDiagnostic { override val diagnosticClass get() = InitializerTypeMismatch::class val expectedType: KtType val actualType: KtType diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt index 6b564e05888..75325a11278 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt @@ -2583,7 +2583,7 @@ internal class InitializerTypeMismatchImpl( override val isMismatchDueToNullability: Boolean, firDiagnostic: KtPsiDiagnostic, token: KtLifetimeToken, -) : KtAbstractFirDiagnostic(firDiagnostic, token), KtFirDiagnostic.InitializerTypeMismatch +) : KtAbstractFirDiagnostic(firDiagnostic, token), KtFirDiagnostic.InitializerTypeMismatch internal class GetterVisibilityDiffersFromPropertyVisibilityImpl( firDiagnostic: KtPsiDiagnostic, 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 c05f6854f66..61d90b6c51e 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 @@ -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 { 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 797acff9179..5ad74aa1254 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 @@ -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 { 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 13bcf922bfe..33cb040ae8f 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 @@ -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 { 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 6d700b0bc12..01dab92b495 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 @@ -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 { diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt index 02181c02777..7afe3d1c41c 100644 --- a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt @@ -1055,7 +1055,8 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") { ) { parameter("usedTypeParameter") } - val INITIALIZER_TYPE_MISMATCH by error(PositioningStrategy.PROPERTY_INITIALIZER) { + // Type parameter is KtNamedDeclaration because PSI of FirProperty can be KtParameter in for loop + val INITIALIZER_TYPE_MISMATCH by error(PositioningStrategy.PROPERTY_INITIALIZER) { parameter("expectedType") parameter("actualType") parameter("isMismatchDueToNullability") diff --git a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt index ee2dab46694..6b244eefef4 100644 --- a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt +++ b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt @@ -561,7 +561,7 @@ object FirErrors { val CONST_VAL_WITH_NON_CONST_INITIALIZER by error0() val WRONG_SETTER_PARAMETER_TYPE by error2() val DELEGATE_USES_EXTENSION_PROPERTY_TYPE_PARAMETER by deprecationError1(ForbidUsingExtensionPropertyTypeParameterInDelegate, SourceElementPositioningStrategies.PROPERTY_DELEGATE) - val INITIALIZER_TYPE_MISMATCH by error3(SourceElementPositioningStrategies.PROPERTY_INITIALIZER) + val INITIALIZER_TYPE_MISMATCH by error3(SourceElementPositioningStrategies.PROPERTY_INITIALIZER) val GETTER_VISIBILITY_DIFFERS_FROM_PROPERTY_VISIBILITY by error0(SourceElementPositioningStrategies.VISIBILITY_MODIFIER) val SETTER_VISIBILITY_INCONSISTENT_WITH_PROPERTY_VISIBILITY by error0(SourceElementPositioningStrategies.VISIBILITY_MODIFIER) val WRONG_SETTER_RETURN_TYPE by error0() diff --git a/compiler/frontend.common-psi/src/org/jetbrains/kotlin/diagnostics/PositioningStrategies.kt b/compiler/frontend.common-psi/src/org/jetbrains/kotlin/diagnostics/PositioningStrategies.kt index 23a6c556e25..ac130951134 100644 --- a/compiler/frontend.common-psi/src/org/jetbrains/kotlin/diagnostics/PositioningStrategies.kt +++ b/compiler/frontend.common-psi/src/org/jetbrains/kotlin/diagnostics/PositioningStrategies.kt @@ -929,9 +929,13 @@ object PositioningStrategies { val REIFIED_MODIFIER: PositioningStrategy = ModifierSetBasedPositioningStrategy(KtTokens.REIFIED_KEYWORD) - val PROPERTY_INITIALIZER: PositioningStrategy = object : PositioningStrategy() { - override fun mark(element: KtProperty): List { - return markElement(element.initializer ?: element) + val PROPERTY_INITIALIZER: PositioningStrategy = object : PositioningStrategy() { + override fun mark(element: KtNamedDeclaration): List { + return markElement(when (element) { + is KtProperty -> element.initializer ?: element + is KtParameter -> element.typeReference ?: element + else -> element + }) } } diff --git a/compiler/testData/diagnostics/tests/controlStructures/forWithIncorrectTypeSpecializer.fir.kt b/compiler/testData/diagnostics/tests/controlStructures/forWithIncorrectTypeSpecializer.fir.kt new file mode 100644 index 00000000000..4adf37af9fc --- /dev/null +++ b/compiler/testData/diagnostics/tests/controlStructures/forWithIncorrectTypeSpecializer.fir.kt @@ -0,0 +1,9 @@ +open class Base +class Derived : Base() + +fun main() { + val derivedList: List = listOf(Derived(), Derived(), Derived()) + + for (derived: Derived in derivedList) { + } +} diff --git a/compiler/testData/diagnostics/tests/controlStructures/forWithIncorrectTypeSpecializer.kt b/compiler/testData/diagnostics/tests/controlStructures/forWithIncorrectTypeSpecializer.kt new file mode 100644 index 00000000000..dc57bea79b3 --- /dev/null +++ b/compiler/testData/diagnostics/tests/controlStructures/forWithIncorrectTypeSpecializer.kt @@ -0,0 +1,9 @@ +open class Base +class Derived : Base() + +fun main() { + val derivedList: List = listOf(Derived(), Derived(), Derived()) + + for (derived: Derived in derivedList) { + } +} 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 4b894b653d5..dd1702b5ff0 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 @@ -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 {