From 1affb05b7be4c5665eed2359cb69f66cac47805b Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Tue, 1 Mar 2016 20:03:35 +0300 Subject: [PATCH] Fix typechecker in case of "for ((a, b) in) { }" Fixes NDFDE --- .../expressions/ControlStructureTypingVisitor.java | 4 ++-- .../ForLoopMissingLoopParameter.kt | 14 ++++++++++++++ .../ForLoopMissingLoopParameter.txt | 11 +++++++++++ .../kotlin/checkers/DiagnosticsTestGenerated.java | 6 ++++++ .../DescructuringDeclarationInForLoop.kt | 3 +++ .../kotlin/checkers/PsiCheckerTestGenerated.java | 6 ++++++ 6 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/declarationChecks/multiDeclarations/ForLoopMissingLoopParameter.kt create mode 100644 compiler/testData/diagnostics/tests/declarationChecks/multiDeclarations/ForLoopMissingLoopParameter.txt create mode 100644 idea/testData/checker/regression/DescructuringDeclarationInForLoop.kt diff --git a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ControlStructureTypingVisitor.java b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ControlStructureTypingVisitor.java index 457913937d3..0b340ba6e4e 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ControlStructureTypingVisitor.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ControlStructureTypingVisitor.java @@ -1,5 +1,5 @@ /* - * Copyright 2010-2015 JetBrains s.r.o. + * Copyright 2010-2016 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -414,7 +414,7 @@ public class ControlStructureTypingVisitor extends ExpressionTypingVisitor { } else { KtDestructuringDeclaration multiParameter = expression.getDestructuringParameter(); - if (multiParameter != null && loopRange != null) { + if (multiParameter != null) { KotlinType elementType = expectedParameterType == null ? ErrorUtils.createErrorType("Loop range has no type") : expectedParameterType; TransientReceiver iteratorNextAsReceiver = new TransientReceiver(elementType); components.annotationResolver.resolveAnnotationsWithArguments(loopScope, multiParameter.getModifierList(), context.trace); diff --git a/compiler/testData/diagnostics/tests/declarationChecks/multiDeclarations/ForLoopMissingLoopParameter.kt b/compiler/testData/diagnostics/tests/declarationChecks/multiDeclarations/ForLoopMissingLoopParameter.kt new file mode 100644 index 00000000000..5246cb5cccb --- /dev/null +++ b/compiler/testData/diagnostics/tests/declarationChecks/multiDeclarations/ForLoopMissingLoopParameter.kt @@ -0,0 +1,14 @@ +fun useDeclaredVariables() { + for ((a, b)) { + a + b + } +} + +fun checkersShouldRun() { + for ((@A a, _)) { + + } +} + +annotation class A \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/declarationChecks/multiDeclarations/ForLoopMissingLoopParameter.txt b/compiler/testData/diagnostics/tests/declarationChecks/multiDeclarations/ForLoopMissingLoopParameter.txt new file mode 100644 index 00000000000..761c8c75dce --- /dev/null +++ b/compiler/testData/diagnostics/tests/declarationChecks/multiDeclarations/ForLoopMissingLoopParameter.txt @@ -0,0 +1,11 @@ +package + +public fun checkersShouldRun(): kotlin.Unit +public fun useDeclaredVariables(): kotlin.Unit + +public final annotation class A : kotlin.Annotation { + public constructor A() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index 25946ef8018..fd7bd417954 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -4493,6 +4493,12 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest { doTest(fileName); } + @TestMetadata("ForLoopMissingLoopParameter.kt") + public void testForLoopMissingLoopParameter() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/declarationChecks/multiDeclarations/ForLoopMissingLoopParameter.kt"); + doTest(fileName); + } + @TestMetadata("ForLoopWithExtensions.kt") public void testForLoopWithExtensions() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/declarationChecks/multiDeclarations/ForLoopWithExtensions.kt"); diff --git a/idea/testData/checker/regression/DescructuringDeclarationInForLoop.kt b/idea/testData/checker/regression/DescructuringDeclarationInForLoop.kt new file mode 100644 index 00000000000..f54ff5e2887 --- /dev/null +++ b/idea/testData/checker/regression/DescructuringDeclarationInForLoop.kt @@ -0,0 +1,3 @@ +fun main() { + for ((i, j)) {} +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/checkers/PsiCheckerTestGenerated.java b/idea/tests/org/jetbrains/kotlin/checkers/PsiCheckerTestGenerated.java index e884a7fee9b..188079ef034 100644 --- a/idea/tests/org/jetbrains/kotlin/checkers/PsiCheckerTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/checkers/PsiCheckerTestGenerated.java @@ -472,6 +472,12 @@ public class PsiCheckerTestGenerated extends AbstractPsiCheckerTest { doTest(fileName); } + @TestMetadata("DescructuringDeclarationInForLoop.kt") + public void testDescructuringDeclarationInForLoop() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/checker/regression/DescructuringDeclarationInForLoop.kt"); + doTest(fileName); + } + @TestMetadata("DoubleDefine.kt") public void testDoubleDefine() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/checker/regression/DoubleDefine.kt");