[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:
+6
@@ -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 {
|
||||||
|
|||||||
+6
@@ -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 {
|
||||||
|
|||||||
+6
@@ -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 {
|
||||||
|
|||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
Diagnostics from elements:
|
||||||
+3
@@ -0,0 +1,3 @@
|
|||||||
|
fun someFun() {
|
||||||
|
for (i i)
|
||||||
|
}
|
||||||
Vendored
+4
@@ -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)
|
||||||
+4
-4
@@ -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)
|
||||||
|
|||||||
+4
-4
@@ -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
|
||||||
|
|||||||
+4
-4
@@ -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
|
||||||
|
|||||||
+2
-2
@@ -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!>}<!>
|
||||||
|
|||||||
+3
-3
@@ -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!><!>) { }<!>
|
||||||
|
|||||||
Reference in New Issue
Block a user