diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java index 2fe3171dddf..c6b502721e2 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java @@ -473,6 +473,8 @@ public interface Errors { DiagnosticFactory3 INVISIBLE_SETTER = DiagnosticFactory3.create(ERROR); + DiagnosticFactory1 VAL_OR_VAR_ON_LOOP_PARAMETER = DiagnosticFactory1.create(ERROR); + // Backing fields SimpleDiagnosticFactory NO_BACKING_FIELD_ABSTRACT_PROPERTY = SimpleDiagnosticFactory.create(ERROR); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java index 106752b477b..5b3739e57d3 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java @@ -179,6 +179,8 @@ public class DefaultErrorMessages { MAP.put(INITIALIZATION_BEFORE_DECLARATION, "Variable cannot be initialized before declaration", NAME); MAP.put(VARIABLE_EXPECTED, "Variable expected"); + MAP.put(VAL_OR_VAR_ON_LOOP_PARAMETER, "''{0}'' on loop parameter is not allowed", TO_STRING); + MAP.put(INITIALIZATION_USING_BACKING_FIELD_CUSTOM_SETTER, "This property has a custom setter, so initialization using backing field required", NAME); MAP.put(INITIALIZATION_USING_BACKING_FIELD_OPEN_SETTER, diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ControlStructureTypingVisitor.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ControlStructureTypingVisitor.java index 17c60013ba7..116cb688243 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ControlStructureTypingVisitor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ControlStructureTypingVisitor.java @@ -17,6 +17,7 @@ package org.jetbrains.jet.lang.types.expressions; import com.google.common.collect.Lists; +import com.intellij.lang.ASTNode; import com.intellij.openapi.util.Pair; import com.intellij.psi.PsiElement; import com.intellij.psi.util.PsiTreeUtil; @@ -44,6 +45,8 @@ import org.jetbrains.jet.lang.resolve.scopes.receivers.TransientReceiver; import org.jetbrains.jet.lang.types.*; import org.jetbrains.jet.lang.types.checker.JetTypeChecker; import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; +import org.jetbrains.jet.lexer.JetKeywordToken; +import org.jetbrains.jet.lexer.JetTokens; import org.jetbrains.jet.util.slicedmap.WritableSlice; import java.util.ArrayList; @@ -311,6 +314,11 @@ public class ControlStructureTypingVisitor extends ExpressionTypingVisitor { JetType expectedParameterType, ExpressionTypingContext context ) { + ASTNode valOrVarNode = loopParameter.getValOrVarNode(); + if (valOrVarNode != null) { + context.trace.report(VAL_OR_VAR_ON_LOOP_PARAMETER.on(valOrVarNode.getPsi(), ((JetKeywordToken) valOrVarNode.getElementType()))); + } + JetTypeReference typeReference = loopParameter.getTypeReference(); VariableDescriptor variableDescriptor; if (typeReference != null) { diff --git a/compiler/testData/diagnostics/tests/controlStructures/valVarLoopParameter.kt b/compiler/testData/diagnostics/tests/controlStructures/valVarLoopParameter.kt new file mode 100644 index 00000000000..c2cae7a215f --- /dev/null +++ b/compiler/testData/diagnostics/tests/controlStructures/valVarLoopParameter.kt @@ -0,0 +1,9 @@ +fun f() { + for (val i in 1..4) { + + } + + for (var i in 1..4) { + + } +} diff --git a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java index 73d44ddbdba..2265f6d39c0 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java @@ -1045,6 +1045,11 @@ public class JetDiagnosticsTestGenerated extends AbstractDiagnosticsTestWithEage doTest("compiler/testData/diagnostics/tests/controlStructures/tryReturnType.kt"); } + @TestMetadata("valVarLoopParameter.kt") + public void testValVarLoopParameter() throws Exception { + doTest("compiler/testData/diagnostics/tests/controlStructures/valVarLoopParameter.kt"); + } + @TestMetadata("when.kt234.kt973.kt") public void testWhen_kt234_kt973() throws Exception { doTest("compiler/testData/diagnostics/tests/controlStructures/when.kt234.kt973.kt");