From 60902439a0792d81c6887a230e2c506bd7ce9fbe Mon Sep 17 00:00:00 2001 From: Maxim Medvedev Date: Thu, 14 Apr 2011 11:39:58 +0400 Subject: [PATCH] separate element types for left and right shifts --- .../plugins/groovy/lang/lexer/TokenSets.java | 49 +++++++++++++++++-- .../lang/parser/GroovyElementTypes.java | 5 +- .../groovy/lang/parser/GroovyPsiCreator.java | 3 +- .../expressions/AssignmentExpression.java | 20 +------- .../arithmetic/ShiftExpression.java | 20 ++++++-- .../relational/RelationalExpression.java | 2 +- .../groovy/lang/psi/impl/PsiImplUtil.java | 7 ++- 7 files changed, 71 insertions(+), 35 deletions(-) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/lexer/TokenSets.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/lexer/TokenSets.java index 3ef85844537b..b69e99d0bf0b 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/lexer/TokenSets.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/lexer/TokenSets.java @@ -17,15 +17,20 @@ package org.jetbrains.plugins.groovy.lang.lexer; import com.intellij.psi.TokenType; +import com.intellij.psi.tree.IElementType; import com.intellij.psi.tree.TokenSet; -import org.jetbrains.plugins.groovy.lang.parser.GroovyElementTypes; +import com.intellij.util.containers.hash.HashMap; + +import static org.jetbrains.plugins.groovy.lang.parser.GroovyElementTypes.*; + +import java.util.Map; /** * Utility classdef, tha contains various useful TokenSets * * @author ilyas */ -public abstract class TokenSets implements GroovyTokenTypes, GroovyElementTypes { +public abstract class TokenSets { public static TokenSet COMMENTS_TOKEN_SET = TokenSet.create( mSL_COMMENT, @@ -150,11 +155,45 @@ public abstract class TokenSets implements GroovyTokenTypes, GroovyElementTypes public static final TokenSet POSTFIX_UNARY_OP_SET = TokenSet.create(mDEC, mINC); - public static final TokenSet BINARY_OP_SET = TokenSet.create(mBAND, mBOR, mBXOR, mDIV, mEQUAL, mGE, mGT, mLAND, mLOR, mLT, mLE, mMINUS, - mMOD, mPLUS, mSTAR, mSTAR_STAR, mNOT_EQUAL, mCOMPARE_TO, - COMPOSITE_SHIFT_SIGN, kIN, kINSTANCEOF, kAS); + public static final TokenSet BINARY_OP_SET = TokenSet.create(mBAND, mBOR, mBXOR, mDIV, mEQUAL, mGE, mGT, mLOR, mLT, mLE, mMINUS, kAS, kIN, + mMOD, mPLUS, mSTAR, mSTAR_STAR, mNOT_EQUAL, mCOMPARE_TO, mLAND, kINSTANCEOF, + COMPOSITE_LSHIFT_SIGN, COMPOSITE_RSHIFT_SIGN, COMPOSITE_TRIPLE_SHIFT_SIGN); public static final TokenSet DOTS = TokenSet.create(mSPREAD_DOT, mOPTIONAL_DOT, mMEMBER_POINTER, mDOT); public static final TokenSet WHITE_SPACES_OR_COMMENTS = TokenSet.orSet(WHITE_SPACES_SET, COMMENT_SET); + + public static final Map ASSIGNMENTS_TO_OPERATORS = new HashMap(); + static { + ASSIGNMENTS_TO_OPERATORS.put(mMINUS_ASSIGN, mMINUS); + ASSIGNMENTS_TO_OPERATORS.put(mPLUS_ASSIGN, mPLUS); + ASSIGNMENTS_TO_OPERATORS.put(mDIV_ASSIGN, mDIV); + ASSIGNMENTS_TO_OPERATORS.put(mSTAR_ASSIGN, mSTAR); + ASSIGNMENTS_TO_OPERATORS.put(mMOD_ASSIGN, mMOD); + ASSIGNMENTS_TO_OPERATORS.put(mSL_ASSIGN, COMPOSITE_LSHIFT_SIGN); + ASSIGNMENTS_TO_OPERATORS.put(mSR_ASSIGN, COMPOSITE_RSHIFT_SIGN); + ASSIGNMENTS_TO_OPERATORS.put(mBSR_ASSIGN, COMPOSITE_TRIPLE_SHIFT_SIGN); + ASSIGNMENTS_TO_OPERATORS.put(mBAND_ASSIGN, mBAND); + ASSIGNMENTS_TO_OPERATORS.put(mBOR_ASSIGN, mBOR); + ASSIGNMENTS_TO_OPERATORS.put(mBXOR_ASSIGN, mBXOR); + ASSIGNMENTS_TO_OPERATORS.put(mSTAR_STAR_ASSIGN, mSTAR_STAR); + } + + public static final TokenSet ASSIGNMENTS = TokenSet.create( + mASSIGN, + mPLUS_ASSIGN, + mMINUS_ASSIGN, + mSTAR_ASSIGN, + mDIV_ASSIGN, + mMOD_ASSIGN, + mSL_ASSIGN, + mSR_ASSIGN, + mBSR_ASSIGN, + mBAND_ASSIGN, + mBOR_ASSIGN, + mBXOR_ASSIGN, + mSTAR_STAR_ASSIGN + ); + + public static final TokenSet SHIFT_SIGNS = TokenSet.create(COMPOSITE_LSHIFT_SIGN, COMPOSITE_RSHIFT_SIGN, COMPOSITE_TRIPLE_SHIFT_SIGN); } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parser/GroovyElementTypes.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parser/GroovyElementTypes.java index 4e9463950056..01a5c6797389 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parser/GroovyElementTypes.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parser/GroovyElementTypes.java @@ -196,7 +196,10 @@ public interface GroovyElementTypes extends GroovyTokenTypes, GroovyDocElementTy GroovyElementType RELATIONAL_EXPRESSION = new GroovyElementType("Relational expression"); GroovyElementType SHIFT_EXPRESSION = new GroovyElementType("Shift expression"); GroovyElementType RANGE_EXPRESSION = new GroovyElementType("Range expression"); - GroovyElementType COMPOSITE_SHIFT_SIGN = new GroovyElementType("Composite shift sign"); + GroovyElementType COMPOSITE_LSHIFT_SIGN = new GroovyElementType("Composite shift sign <<"); + GroovyElementType COMPOSITE_RSHIFT_SIGN = new GroovyElementType("Composite shift sign >>"); + GroovyElementType COMPOSITE_TRIPLE_SHIFT_SIGN = new GroovyElementType("Composite shift sign >>>"); + GroovyElementType MORE_OR_EQUALS_SIGN = new GroovyElementType(">="); GroovyElementType ADDITIVE_EXPRESSION = new GroovyElementType("Additive expression"); GroovyElementType MULTIPLICATIVE_EXPRESSION = new GroovyElementType("Multiplicative expression"); GroovyElementType POWER_EXPRESSION = new GroovyElementType("Power expression"); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parser/GroovyPsiCreator.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parser/GroovyPsiCreator.java index 919782117ea8..6e487818ca46 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parser/GroovyPsiCreator.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parser/GroovyPsiCreator.java @@ -23,6 +23,7 @@ import com.intellij.psi.tree.IElementType; import org.jetbrains.plugins.groovy.lang.groovydoc.lexer.IGroovyDocElementType; import org.jetbrains.plugins.groovy.lang.groovydoc.psi.GroovyDocPsiCreator; import org.jetbrains.plugins.groovy.lang.lexer.GroovyElementType; +import org.jetbrains.plugins.groovy.lang.lexer.TokenSets; import org.jetbrains.plugins.groovy.lang.psi.impl.GroovyPsiElementImpl; import org.jetbrains.plugins.groovy.lang.psi.impl.auxiliary.GrLabelImpl; import org.jetbrains.plugins.groovy.lang.psi.impl.auxiliary.GrListOrMapImpl; @@ -212,7 +213,7 @@ public class GroovyPsiCreator implements GroovyElementTypes { if (elem.equals(RELATIONAL_EXPRESSION)) return new GrRelationalExpressionImpl(node); if (elem.equals(SHIFT_EXPRESSION)) return new GrShiftExpressionImpl(node); if (elem.equals(RANGE_EXPRESSION)) return new GrRangeExpressionImpl(node); - if (elem.equals(COMPOSITE_SHIFT_SIGN)) return new GrOperationSignImpl(node); + if (TokenSets.SHIFT_SIGNS.contains(elem)) return new GrOperationSignImpl(node); if (elem.equals(ADDITIVE_EXPRESSION)) return new GrAdditiveExpressionImpl(node); if (elem.equals(MULTIPLICATIVE_EXPRESSION)) return new GrMultiplicativeExpressionImpl(node); if (elem.equals(POWER_EXPRESSION)) return new GrPowerExpressionImpl(node); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parser/parsing/statements/expressions/AssignmentExpression.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parser/parsing/statements/expressions/AssignmentExpression.java index ee983d7bcba7..479ad8ba3b28 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parser/parsing/statements/expressions/AssignmentExpression.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parser/parsing/statements/expressions/AssignmentExpression.java @@ -18,8 +18,8 @@ package org.jetbrains.plugins.groovy.lang.parser.parsing.statements.expressions; import com.intellij.lang.PsiBuilder; import com.intellij.lang.PsiBuilder.Marker; -import com.intellij.psi.tree.TokenSet; import org.jetbrains.plugins.groovy.GroovyBundle; +import org.jetbrains.plugins.groovy.lang.lexer.TokenSets; import org.jetbrains.plugins.groovy.lang.parser.GroovyElementTypes; import org.jetbrains.plugins.groovy.lang.parser.GroovyParser; import org.jetbrains.plugins.groovy.lang.parser.parsing.statements.TupleParse; @@ -31,22 +31,6 @@ import org.jetbrains.plugins.groovy.lang.parser.parsing.util.ParserUtils; */ public class AssignmentExpression implements GroovyElementTypes { - private static final TokenSet ASSIGNMENTS = TokenSet.create( - mASSIGN, - mPLUS_ASSIGN, - mMINUS_ASSIGN, - mSTAR_ASSIGN, - mDIV_ASSIGN, - mMOD_ASSIGN, - mSL_ASSIGN, - mBAND_ASSIGN, - mBOR_ASSIGN, - mBXOR_ASSIGN, - mSTAR_STAR_ASSIGN, - mSR_ASSIGN, - mBSR_ASSIGN - ); - public static boolean parse(PsiBuilder builder, GroovyParser parser) { return parse(builder, parser, false); } @@ -55,7 +39,7 @@ public class AssignmentExpression implements GroovyElementTypes { Marker marker = builder.mark(); final boolean isTuple = ParserUtils.lookAhead(builder, mLPAREN, mIDENT, mCOMMA); if (parseSide(builder, parser, isTuple,comExprAllowed)) { - if (ParserUtils.getToken(builder, ASSIGNMENTS)) { + if (ParserUtils.getToken(builder, TokenSets.ASSIGNMENTS)) { ParserUtils.getToken(builder, mNLS); if (!parse(builder, parser, comExprAllowed)) { builder.error(GroovyBundle.message("expression.expected")); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parser/parsing/statements/expressions/arithmetic/ShiftExpression.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parser/parsing/statements/expressions/arithmetic/ShiftExpression.java index 5085aef545d9..a924467343e9 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parser/parsing/statements/expressions/arithmetic/ShiftExpression.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parser/parsing/statements/expressions/arithmetic/ShiftExpression.java @@ -80,18 +80,28 @@ public class ShiftExpression implements GroovyElementTypes { builder.getTokenText(); //todo[peter] remove look-ahead assertion builder.advanceLexer(); } - marker.done(COMPOSITE_SHIFT_SIGN); + marker.done(COMPOSITE_TRIPLE_SHIFT_SIGN); return true; - } else if (ParserUtils.lookAhead(builder, mLT, mLT) || - ParserUtils.lookAhead(builder, mGT, mGT)) { + } + else if (ParserUtils.lookAhead(builder, mLT, mLT)) { PsiBuilder.Marker marker = builder.mark(); for (int i = 0; i < 2; i++) { builder.getTokenText(); //todo[peter] remove look-ahead assertion builder.advanceLexer(); } - marker.done(COMPOSITE_SHIFT_SIGN); + marker.done(COMPOSITE_LSHIFT_SIGN); return true; - } else { + } + else if (ParserUtils.lookAhead(builder, mGT, mGT)) { + PsiBuilder.Marker marker = builder.mark(); + for (int i = 0; i < 2; i++) { + builder.getTokenText(); //todo[peter] remove look-ahead assertion + builder.advanceLexer(); + } + marker.done(COMPOSITE_RSHIFT_SIGN); + return true; + } + else { return false; } } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parser/parsing/statements/expressions/relational/RelationalExpression.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parser/parsing/statements/expressions/relational/RelationalExpression.java index e00b0bfd7895..3b349a84a28f 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parser/parsing/statements/expressions/relational/RelationalExpression.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parser/parsing/statements/expressions/relational/RelationalExpression.java @@ -82,7 +82,7 @@ public class RelationalExpression implements GroovyElementTypes { for (int i = 0; i < 2; i++) { builder.advanceLexer(); } - marker.done(COMPOSITE_SHIFT_SIGN); + marker.done(MORE_OR_EQUALS_SIGN); return true; } else { return false; diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/PsiImplUtil.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/PsiImplUtil.java index 01aba2e4633c..7cc62356f405 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/PsiImplUtil.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/PsiImplUtil.java @@ -62,8 +62,7 @@ import java.util.List; import static com.intellij.psi.impl.source.tree.Factory.createSingleLeafElement; import static org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes.*; -import static org.jetbrains.plugins.groovy.lang.lexer.TokenSets.RELATIONS; -import static org.jetbrains.plugins.groovy.lang.parser.GroovyElementTypes.COMPOSITE_SHIFT_SIGN; +import static org.jetbrains.plugins.groovy.lang.lexer.TokenSets.*; /** * @@ -176,7 +175,7 @@ public class PsiImplUtil { } return RELATIONS.contains(opToken) || opToken == mCOMPARE_TO || opToken == mREGEX_FIND || opToken == mREGEX_MATCH - || opToken == COMPOSITE_SHIFT_SIGN + || SHIFT_SIGNS.contains(opToken) || opToken==mSTAR; } @@ -263,7 +262,7 @@ public class PsiImplUtil { if (opToken == mSTAR_STAR) priority = 7; else if (opToken == mSTAR || opToken == mDIV) priority = 8; else if (opToken == mPLUS || opToken == mMINUS) priority = 9; - else if (opToken == COMPOSITE_SHIFT_SIGN) priority = 10; + else if (SHIFT_SIGNS.contains(opToken)) priority = 10; else if (RELATIONS.contains(opToken)) priority = 12; else if (opToken == mEQUAL || opToken == mNOT_EQUAL || opToken == mCOMPARE_TO) priority = 13; else if (opToken == mREGEX_FIND || opToken == mREGEX_MATCH) priority = 14;