import org.jetbrains.plugins.groovy.lang.psi.api.statements.branch.GrContinueStatement;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.branch.GrFlowInterruptingStatement;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.branch.GrReturnStatement;
+import org.jetbrains.plugins.groovy.lang.psi.api.statements.clauses.GrForInClause;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.*;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.literals.GrLiteral;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.path.GrMethodCallExpression;
else if (element instanceof GrLiteral) {
checkLiteral(((GrLiteral)element), holder);
}
+ else if (element instanceof GrForInClause) {
+ checkForInClause(((GrForInClause)element), holder);
+ }
else if (element instanceof GroovyFile) {
final GroovyFile file = (GroovyFile)element;
if (file.isScript()) {
}
}
+ private static void checkForInClause(GrForInClause forInClause, AnnotationHolder holder) {
+ final GrVariable[] declaredVariables = forInClause.getDeclaredVariables();
+ if (declaredVariables.length < 1) return;
+ final GrVariable variable = declaredVariables[0];
+ final GrModifierList modifierList = ((GrModifierList)variable.getModifierList());
+ if (modifierList == null) return;
+ final PsiElement[] modifiers = modifierList.getModifiers();
+ for (PsiElement modifier : modifiers) {
+ if (modifier instanceof PsiAnnotation) continue;
+ final String modifierText = modifier.getText();
+ if (PsiModifier.FINAL.equals(modifierText)) continue;
+ if ("def".equals(modifierText)) continue;
+ holder.createErrorAnnotation(modifier, GroovyBundle.message("not.allowed.modifier.in.forin", modifierText));
+ }
+ }
+
private static void checkLiteral(GrLiteral literal, AnnotationHolder holder) {
String text = literal.getText();
if (text.startsWith("'''")) {
import org.jetbrains.plugins.groovy.lang.parser.GroovyParser;
import org.jetbrains.plugins.groovy.lang.parser.parsing.auxiliary.modifiers.Modifiers;
import org.jetbrains.plugins.groovy.lang.parser.parsing.statements.declaration.Declaration;
-import org.jetbrains.plugins.groovy.lang.parser.parsing.statements.declaration.DeclarationStart;
import org.jetbrains.plugins.groovy.lang.parser.parsing.statements.expressions.StrictContextExpression;
import org.jetbrains.plugins.groovy.lang.parser.parsing.statements.expressions.arithmetic.ShiftExpression;
import org.jetbrains.plugins.groovy.lang.parser.parsing.types.TypeSpec;
PsiBuilder.Marker marker = builder.mark();
- if (ParserUtils.getToken(builder, mSEMI) ||
- (Declaration.parse(builder, false, parser) &&
- ParserUtils.getToken(builder, mSEMI))) {
+ if (ParserUtils.getToken(builder, mSEMI) || (Declaration.parse(builder, false, parser) && ParserUtils.getToken(builder, mSEMI))) {
StrictContextExpression.parse(builder, parser);
ParserUtils.getToken(builder, mSEMI, GroovyBundle.message("semi.expected"));
ParserUtils.getToken(builder, mNLS);
if (!mRPAREN.equals(builder.getTokenType())) {
controlExpressionListParse(builder, parser);
}
- } else {
+ }
+ else {
marker.rollbackTo();
marker = builder.mark();
controlExpressionListParse(builder, parser);
while (mCOMMA.equals(builder.getTokenType())) {
- if (ParserUtils.lookAhead(builder, mCOMMA, mNLS, mRPAREN) ||
- ParserUtils.lookAhead(builder, mCOMMA, mRPAREN)) {
+ if (ParserUtils.lookAhead(builder, mCOMMA, mNLS, mRPAREN) || ParserUtils.lookAhead(builder, mCOMMA, mRPAREN)) {
ParserUtils.getToken(builder, mCOMMA);
builder.error(GroovyBundle.message("expression.expected"));
- } else {
+ }
+ else {
ParserUtils.getToken(builder, mCOMMA);
}
ParserUtils.getToken(builder, mNLS);
if (!StrictContextExpression.parse(builder, parser)) {
ParserUtils.getToken(builder, mNLS);
- if (!mRPAREN.equals(builder.getTokenType()) &&
- !mSEMI.equals(builder.getTokenType())) {
+ if (!mRPAREN.equals(builder.getTokenType()) && !mSEMI.equals(builder.getTokenType())) {
builder.error(GroovyBundle.message("expression.expected"));
}
if (!mRPAREN.equals(builder.getTokenType()) &&
- !mSEMI.equals(builder.getTokenType()) &&
- !mCOMMA.equals(builder.getTokenType()) &&
- !mNLS.equals(builder.getTokenType())) {
+ !mSEMI.equals(builder.getTokenType()) &&
+ !mCOMMA.equals(builder.getTokenType()) &&
+ !mNLS.equals(builder.getTokenType())) {
builder.advanceLexer();
}
}
PsiBuilder.Marker marker = builder.mark();
- PsiBuilder.Marker declMarker = builder.mark();
-
- if (ParserUtils.lookAhead(builder, mIDENT, kIN)) {
- ParserUtils.eatElement(builder, PARAMETER);
- declMarker.drop();
- ParserUtils.getToken(builder, kIN);
- if (!ShiftExpression.parse(builder, parser)) {
- builder.error(GroovyBundle.message("expression.expected"));
- }
- marker.done(FOR_IN_CLAUSE);
- return true;
+ PsiBuilder.Marker parameterMarker = builder.mark();
+ Modifiers.parse(builder, parser);
+ if (ParserUtils.lookAhead(builder, mIDENT, kIN) || ParserUtils.lookAhead(builder, mIDENT, mCOLON)) {
+ ParserUtils.getToken(builder, mIDENT);
}
-
- if (DeclarationStart.parse(builder, parser)) {
- if (Modifiers.parse(builder, parser)) {
- TypeSpec.parse(builder);
- return singleDeclNoInitParse(builder, marker, declMarker, parser);
- }
+ else {
+ TypeSpec.parseStrict(builder);
+ ParserUtils.getToken(builder, mIDENT, GroovyBundle.message("identifier.expected"));
}
+ parameterMarker.done(PARAMETER);
- if (TypeSpec.parse(builder)) {
- return singleDeclNoInitParse(builder, marker, declMarker, parser);
+ if (!ParserUtils.getToken(builder, kIN) && !ParserUtils.getToken(builder, mCOLON)) {
+ builder.error(GroovyBundle.message("in.expected"));
+ marker.drop();
+ return false;
}
- declMarker.drop();
- marker.drop();
- return false;
- }
-
- private static boolean singleDeclNoInitParse(PsiBuilder builder,
- PsiBuilder.Marker marker,
- PsiBuilder.Marker declMarker, GroovyParser parser) {
- if (ParserUtils.getToken(builder, mIDENT)) {
- if (kIN.equals(builder.getTokenType()) || mCOLON.equals(builder.getTokenType())) {
- declMarker.done(PARAMETER);
- builder.advanceLexer();
- if (!ShiftExpression.parse(builder, parser)) {
- builder.error(GroovyBundle.message("expression.expected"));
- }
- marker.done(FOR_IN_CLAUSE);
- return true;
- } else {
- marker.rollbackTo();
- return false;
- }
- } else {
- declMarker.drop();
- marker.rollbackTo();
- return false;
+ if (!ShiftExpression.parse(builder, parser)) {
+ builder.error(GroovyBundle.message("expression.expected"));
}
+ marker.done(FOR_IN_CLAUSE);
+ return true;
}
-
}