Allow type parameters right after fun, val, var

This commit is contained in:
Andrey Breslav
2011-01-14 21:33:23 +03:00
parent 55ca4e8a5a
commit 7879bec299
@@ -43,15 +43,15 @@ public class JetExpressionParsing extends AbstractJetParsing {
PREFIX(MINUS, PLUS, MINUSMINUS, PLUSPLUS, EXCL) { // attributes PREFIX(MINUS, PLUS, MINUSMINUS, PLUSPLUS, EXCL) { // attributes
@Override @Override
public void parseHigherPrecedence(JetExpressionParsing parsing) { public void parseHigherPrecedence(JetExpressionParsing parser) {
throw new IllegalStateException("Don't call this method"); throw new IllegalStateException("Don't call this method");
} }
}, },
MULTIPLICATIVE(MUL, DIV, PERC) { MULTIPLICATIVE(MUL, DIV, PERC) {
@Override @Override
public void parseHigherPrecedence(JetExpressionParsing parsing) { public void parseHigherPrecedence(JetExpressionParsing parser) {
parsing.parsePrefixExpression(); parser.parsePrefixExpression();
} }
}, },
@@ -60,29 +60,22 @@ public class JetExpressionParsing extends AbstractJetParsing {
SIMPLE_NAME(IDENTIFIER), SIMPLE_NAME(IDENTIFIER),
ELVIS(JetTokens.ELVIS), ELVIS(JetTokens.ELVIS),
// TODO : make same priority // TODO : make same priority
WITH_TYPE_RHS(AS_KEYWORD, COLON) { WITH_TYPE_RHS(IN_KEYWORD, NOT_IN, AS_KEYWORD, COLON, IS_KEYWORD, NOT_IS) {
@Override @Override
public void parseRightHandSide(JetExpressionParsing parsing) { public JetNodeType parseRightHandSide(IElementType operation, JetExpressionParsing parser) {
parsing.myJetParsing.parseTypeRef(); if (operation == AS_KEYWORD || operation == COLON) {
} parser.myJetParsing.parseTypeRef();
return BINARY_WITH_TYPE;
}
if (operation == IS_KEYWORD || operation == NOT_IS) {
parser.parsePattern();
@Override return BINARY_WITH_PATTERN;
public JetNodeType getProductType() { }
return BINARY_WITH_TYPE;
return super.parseRightHandSide(operation, parser);
} }
}, },
IS(IS_KEYWORD, NOT_IS) {
@Override
public void parseRightHandSide(JetExpressionParsing parsing) {
parsing.parsePattern();
}
@Override
public JetNodeType getProductType() {
return BINARY_WITH_PATTERN;
}
},
NAMED_INFIX(IN_KEYWORD, NOT_IN),
COMPARISON(LT, GT, LTEQ, GTEQ), COMPARISON(LT, GT, LTEQ, GTEQ),
EQUALITY(EQEQ, EXCLEQ, EQEQEQ, EXCLEQEQEQ), EQUALITY(EQEQ, EXCLEQ, EQEQEQ, EXCLEQEQEQ),
CONJUNCTION(ANDAND), CONJUNCTION(ANDAND),
@@ -106,16 +99,19 @@ public class JetExpressionParsing extends AbstractJetParsing {
this.operations = TokenSet.create(operations); this.operations = TokenSet.create(operations);
} }
public void parseHigherPrecedence(JetExpressionParsing parsing) { public void parseHigherPrecedence(JetExpressionParsing parser) {
assert higher != null; assert higher != null;
parsing.parseBinaryExpression(higher); parser.parseBinaryExpression(higher);
} }
public void parseRightHandSide(JetExpressionParsing parsing) { /**
parseHigherPrecedence(parsing); *
} * @param operation the operation sign (e.g. PLUS or IS
* @param parser the parser object
public JetNodeType getProductType() { * @return node type of the result
*/
public JetNodeType parseRightHandSide(IElementType operation, JetExpressionParsing parser) {
parseHigherPrecedence(parser);
return BINARY_EXPRESSION; return BINARY_EXPRESSION;
} }
@@ -162,9 +158,10 @@ public class JetExpressionParsing extends AbstractJetParsing {
precedence.parseHigherPrecedence(this); precedence.parseHigherPrecedence(this);
while (!myBuilder.newlineBeforeCurrentToken() && atSet(precedence.getOperations())) { while (!myBuilder.newlineBeforeCurrentToken() && atSet(precedence.getOperations())) {
advance(); // operation IElementType operation = tt();
precedence.parseRightHandSide(this); advance(); // operation
expression.done(precedence.getProductType()); JetNodeType resultType = precedence.parseRightHandSide(operation, this);
expression.done(resultType);
expression = expression.precede(); expression = expression.precede();
} }