KT-3182 Prohibit val/var keywords at for-loop counter.

#KT-3182 fixed
This commit is contained in:
Evgeny Gerashchenko
2013-02-12 02:19:20 +04:00
parent 882c2cb28d
commit 808dbd160c
5 changed files with 26 additions and 0 deletions
@@ -473,6 +473,8 @@ public interface Errors {
DiagnosticFactory3<JetExpression, DeclarationDescriptor, Visibility, DeclarationDescriptor> INVISIBLE_SETTER = DiagnosticFactory3.create(ERROR);
DiagnosticFactory1<PsiElement, JetKeywordToken> VAL_OR_VAR_ON_LOOP_PARAMETER = DiagnosticFactory1.create(ERROR);
// Backing fields
SimpleDiagnosticFactory<JetElement> NO_BACKING_FIELD_ABSTRACT_PROPERTY = SimpleDiagnosticFactory.create(ERROR);
@@ -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,
@@ -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) {
@@ -0,0 +1,9 @@
fun f() {
for (<!VAL_OR_VAR_ON_LOOP_PARAMETER!>val<!> i in 1..4) {
}
for (<!VAL_OR_VAR_ON_LOOP_PARAMETER!>var<!> i in 1..4) {
}
}
@@ -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");