[FIR] Source for implicit iterator calls in for should not be null

^KT-62111 fixed


Merge-request: KT-MR-13029
Merged-by: Egor Kulikov <Egor.Kulikov@jetbrains.com>
This commit is contained in:
Egor Kulikov
2023-11-22 17:15:24 +00:00
committed by Space Team
parent 6a90926e2e
commit 43fc4ccf40
11 changed files with 43 additions and 17 deletions
@@ -52,6 +52,12 @@ public class Fe10IdeNormalAnalysisSourceModuleCollectDiagnosticsTestGenerated ex
runTest("analysis/analysis-api/testData/components/diagnosticsProvider/diagnostics/declarationErrors.kt"); runTest("analysis/analysis-api/testData/components/diagnosticsProvider/diagnostics/declarationErrors.kt");
} }
@Test
@TestMetadata("incompleteFor.kt")
public void testIncompleteFor() throws Exception {
runTest("analysis/analysis-api/testData/components/diagnosticsProvider/diagnostics/incompleteFor.kt");
}
@Test @Test
@TestMetadata("resolutionErrors.kt") @TestMetadata("resolutionErrors.kt")
public void testResolutionErrors() throws Exception { public void testResolutionErrors() throws Exception {
@@ -52,6 +52,12 @@ public class FirIdeNormalAnalysisSourceModuleCollectDiagnosticsTestGenerated ext
runTest("analysis/analysis-api/testData/components/diagnosticsProvider/diagnostics/declarationErrors.kt"); runTest("analysis/analysis-api/testData/components/diagnosticsProvider/diagnostics/declarationErrors.kt");
} }
@Test
@TestMetadata("incompleteFor.kt")
public void testIncompleteFor() throws Exception {
runTest("analysis/analysis-api/testData/components/diagnosticsProvider/diagnostics/incompleteFor.kt");
}
@Test @Test
@TestMetadata("resolutionErrors.kt") @TestMetadata("resolutionErrors.kt")
public void testResolutionErrors() throws Exception { public void testResolutionErrors() throws Exception {
@@ -52,6 +52,12 @@ public class FirStandaloneNormalAnalysisSourceModuleCollectDiagnosticsTestGenera
runTest("analysis/analysis-api/testData/components/diagnosticsProvider/diagnostics/declarationErrors.kt"); runTest("analysis/analysis-api/testData/components/diagnosticsProvider/diagnostics/declarationErrors.kt");
} }
@Test
@TestMetadata("incompleteFor.kt")
public void testIncompleteFor() throws Exception {
runTest("analysis/analysis-api/testData/components/diagnosticsProvider/diagnostics/incompleteFor.kt");
}
@Test @Test
@TestMetadata("resolutionErrors.kt") @TestMetadata("resolutionErrors.kt")
public void testResolutionErrors() throws Exception { public void testResolutionErrors() throws Exception {
@@ -0,0 +1 @@
Diagnostics from elements:
@@ -0,0 +1,3 @@
fun someFun() {
for (i i)
}
@@ -0,0 +1,4 @@
Diagnostics from elements:
for PSI element of type KtForExpression at (2,5) - (3,1)
ITERATOR_MISSING text ranges: [(20,30)]
PSI: KtForExpression at (2,5) - (3,1)
@@ -1156,7 +1156,7 @@ class LightTreeRawFirExpressionBuilder(
val calculatedRangeExpression = val calculatedRangeExpression =
rangeExpression ?: buildErrorExpression(null, ConeSyntaxDiagnostic("No range in for loop")) rangeExpression ?: buildErrorExpression(null, ConeSyntaxDiagnostic("No range in for loop"))
val fakeSource = forLoop.toFirSourceElement(KtFakeSourceElementKind.DesugaredForLoop) val fakeSource = forLoop.toFirSourceElement(KtFakeSourceElementKind.DesugaredForLoop)
val rangeSource = calculatedRangeExpression.source?.fakeElement(KtFakeSourceElementKind.DesugaredForLoop) val rangeSource = calculatedRangeExpression.source?.fakeElement(KtFakeSourceElementKind.DesugaredForLoop) ?: fakeSource
val target: FirLoopTarget val target: FirLoopTarget
// NB: FirForLoopChecker relies on this block existence and structure // NB: FirForLoopChecker relies on this block existence and structure
return buildBlock { return buildBlock {
@@ -1168,7 +1168,7 @@ class LightTreeRawFirExpressionBuilder(
buildFunctionCall { buildFunctionCall {
source = rangeSource source = rangeSource
calleeReference = buildSimpleNamedReference { calleeReference = buildSimpleNamedReference {
source = rangeSource ?: fakeSource source = rangeSource
name = OperatorNameConventions.ITERATOR name = OperatorNameConventions.ITERATOR
} }
explicitReceiver = calculatedRangeExpression explicitReceiver = calculatedRangeExpression
@@ -1180,7 +1180,7 @@ class LightTreeRawFirExpressionBuilder(
condition = buildFunctionCall { condition = buildFunctionCall {
source = rangeSource source = rangeSource
calleeReference = buildSimpleNamedReference { calleeReference = buildSimpleNamedReference {
source = rangeSource ?: fakeSource source = rangeSource
name = OperatorNameConventions.HAS_NEXT name = OperatorNameConventions.HAS_NEXT
} }
explicitReceiver = generateResolvedAccessExpression(rangeSource, iteratorVal) explicitReceiver = generateResolvedAccessExpression(rangeSource, iteratorVal)
@@ -1200,7 +1200,7 @@ class LightTreeRawFirExpressionBuilder(
buildFunctionCall { buildFunctionCall {
source = rangeSource source = rangeSource
calleeReference = buildSimpleNamedReference { calleeReference = buildSimpleNamedReference {
source = rangeSource ?: fakeSource source = rangeSource
name = OperatorNameConventions.NEXT name = OperatorNameConventions.NEXT
} }
explicitReceiver = generateResolvedAccessExpression(rangeSource, iteratorVal) explicitReceiver = generateResolvedAccessExpression(rangeSource, iteratorVal)
@@ -2606,7 +2606,7 @@ open class PsiRawFirBuilder(
val rangeExpression = expression.loopRange.toFirExpression("No range in for loop") val rangeExpression = expression.loopRange.toFirExpression("No range in for loop")
val ktParameter = expression.loopParameter val ktParameter = expression.loopParameter
val fakeSource = expression.toKtPsiSourceElement(KtFakeSourceElementKind.DesugaredForLoop) val fakeSource = expression.toKtPsiSourceElement(KtFakeSourceElementKind.DesugaredForLoop)
val rangeSource = expression.loopRange?.toFirSourceElement(KtFakeSourceElementKind.DesugaredForLoop) val rangeSource = expression.loopRange?.toFirSourceElement(KtFakeSourceElementKind.DesugaredForLoop) ?: fakeSource
val target: FirLoopTarget val target: FirLoopTarget
// NB: FirForLoopChecker relies on this block existence and structure // NB: FirForLoopChecker relies on this block existence and structure
@@ -2617,7 +2617,7 @@ open class PsiRawFirBuilder(
buildFunctionCall { buildFunctionCall {
source = rangeSource source = rangeSource
calleeReference = buildSimpleNamedReference { calleeReference = buildSimpleNamedReference {
source = rangeSource ?: fakeSource source = rangeSource
name = OperatorNameConventions.ITERATOR name = OperatorNameConventions.ITERATOR
} }
explicitReceiver = rangeExpression explicitReceiver = rangeExpression
@@ -2629,7 +2629,7 @@ open class PsiRawFirBuilder(
condition = buildFunctionCall { condition = buildFunctionCall {
source = rangeSource source = rangeSource
calleeReference = buildSimpleNamedReference { calleeReference = buildSimpleNamedReference {
source = rangeSource ?: fakeSource source = rangeSource
name = OperatorNameConventions.HAS_NEXT name = OperatorNameConventions.HAS_NEXT
} }
explicitReceiver = generateResolvedAccessExpression(rangeSource, iteratorVal) explicitReceiver = generateResolvedAccessExpression(rangeSource, iteratorVal)
@@ -2648,7 +2648,7 @@ open class PsiRawFirBuilder(
source = expression.loopParameter?.toFirSourceElement(), source = expression.loopParameter?.toFirSourceElement(),
name = if (multiDeclaration != null) SpecialNames.DESTRUCT else ktParameter.nameAsSafeName, name = if (multiDeclaration != null) SpecialNames.DESTRUCT else ktParameter.nameAsSafeName,
initializer = buildFunctionCall { initializer = buildFunctionCall {
source = rangeSource ?: fakeSource source = rangeSource
calleeReference = buildSimpleNamedReference { calleeReference = buildSimpleNamedReference {
source = rangeSource source = rangeSource
name = OperatorNameConventions.NEXT name = OperatorNameConventions.NEXT
@@ -1,14 +1,14 @@
fun useDeclaredVariables() { fun useDeclaredVariables() {
for ((a, b)<!SYNTAX!><!>) { <!ITERATOR_MISSING!>for ((a, b)<!SYNTAX!><!>) {
a a
b b
} }<!>
} }
fun checkersShouldRun() { fun checkersShouldRun() {
for ((@A a, _)<!SYNTAX!><!>) { <!ITERATOR_MISSING!>for ((@A a, _)<!SYNTAX!><!>) {
} }<!>
} }
annotation class A annotation class A
@@ -10,6 +10,6 @@ fun test(nothing: Nothing?) {
} }
fun sum(a : IntArray) : Int { fun sum(a : IntArray) : Int {
for (n <!ITERATOR_MISSING!>for (n
<!SYNTAX!>return<!><!SYNTAX!><!> "?" <!SYNTAX!>return<!><!SYNTAX!><!> "?"<!>
<!NO_RETURN_IN_FUNCTION_WITH_BLOCK_BODY!>}<!> <!NO_RETURN_IN_FUNCTION_WITH_BLOCK_BODY!>}<!>
@@ -16,7 +16,7 @@
* NOTE: right-hand side of an assignment must be expression * NOTE: right-hand side of an assignment must be expression
*/ */
fun case1() { fun case1() {
val x = for (<!SYNTAX!><!>) { } val x = <!ITERATOR_AMBIGUITY!>for (<!SYNTAX!><!>) { }<!>
val y = for (x in 1..2) { } val y = for (x in 1..2) { }
val a = <!EXPRESSION_EXPECTED!>while (<!SYNTAX!><!>) { }<!> val a = <!EXPRESSION_EXPECTED!>while (<!SYNTAX!><!>) { }<!>
@@ -29,7 +29,7 @@ fun case1() {
* NOTE: right-hand side of an assignment must be expression * NOTE: right-hand side of an assignment must be expression
*/ */
fun case2() { fun case2() {
var x = for (<!SYNTAX!><!>) { } var x = <!ITERATOR_AMBIGUITY!>for (<!SYNTAX!><!>) { }<!>
var y = for (x in 1..2) { } var y = for (x in 1..2) { }
var a = <!EXPRESSION_EXPECTED!>while (<!SYNTAX!><!>) { }<!> var a = <!EXPRESSION_EXPECTED!>while (<!SYNTAX!><!>) { }<!>
@@ -49,7 +49,7 @@ fun case3() {
var b :Any? var b :Any?
var c :Any? var c :Any?
x = for (<!SYNTAX!><!>) { } x = <!ITERATOR_AMBIGUITY!>for (<!SYNTAX!><!>) { }<!>
y = for (x in 1..2) { } y = for (x in 1..2) { }
a = <!EXPRESSION_EXPECTED!>while (<!SYNTAX!><!>) { }<!> a = <!EXPRESSION_EXPECTED!>while (<!SYNTAX!><!>) { }<!>