separate element types for left and right shifts

This commit is contained in:
Maxim Medvedev
2011-04-14 11:39:58 +04:00
parent b7f5f0d87d
commit 60902439a0
7 changed files with 71 additions and 35 deletions
@@ -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<IElementType, IElementType> ASSIGNMENTS_TO_OPERATORS = new HashMap<IElementType, IElementType>();
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);
}
@@ -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");
@@ -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);
@@ -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"));
@@ -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;
}
}
@@ -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;
@@ -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;