Index: compiler/java/com/google/dart/compiler/parser/DartParser.java |
diff --git a/compiler/java/com/google/dart/compiler/parser/DartParser.java b/compiler/java/com/google/dart/compiler/parser/DartParser.java |
index 2cf601c0cf9abf477c1e7cd3a07ee393803a6993..b0ac402d460b47c864791e7bacad5745ce9c5ca6 100644 |
--- a/compiler/java/com/google/dart/compiler/parser/DartParser.java |
+++ b/compiler/java/com/google/dart/compiler/parser/DartParser.java |
@@ -1827,10 +1827,18 @@ public class DartParser extends CompletionHooksParserBase { |
private DartExpression parseBinaryExpression(int precedence) { |
assert (precedence >= 4); |
beginBinaryExpression(); |
- DartExpression result = parseUnaryExpression(); |
+ DartExpression lastResult = parseUnaryExpression(); |
+ DartExpression result = lastResult; |
for (int level = peek(0).getPrecedence(); level >= precedence; level--) { |
while (peek(0).getPrecedence() == level) { |
+ Position prevPositionStart = ctx.getTokenLocation().getBegin(); |
+ Position prevPositionEnd = ctx.getTokenLocation().getEnd(); |
Token token = next(); |
+ if (lastResult instanceof DartSuperExpression |
+ && (token == Token.AND || token == Token.OR)) { |
+ reportErrorAtPosition(prevPositionStart, prevPositionEnd, |
+ ParserErrorCode.SUPER_IS_NOT_VALID_AS_A_BOOLEAN_OPERAND); |
+ } |
DartExpression right; |
if (token == Token.IS) { |
beginTypeExpression(); |
@@ -1844,6 +1852,11 @@ public class DartParser extends CompletionHooksParserBase { |
} else { |
right = parseBinaryExpression(level + 1); |
} |
+ if (right instanceof DartSuperExpression) { |
+ reportError(position(), ParserErrorCode.SUPER_CANNOT_BE_USED_AS_THE_SECOND_OPERAND); |
+ } |
+ |
+ lastResult = right; |
result = doneWithoutConsuming(new DartBinaryExpression(token, result, right)); |
if ((token == Token.IS) |
|| token.isRelationalOperator() |
@@ -1934,6 +1947,9 @@ public class DartParser extends CompletionHooksParserBase { |
private DartExpression parseConditionalExpression() { |
beginConditionalExpression(); |
DartExpression result = parseBinaryExpression(4); |
+ if (result instanceof DartSuperExpression) { |
+ reportError(position(), ParserErrorCode.SUPER_IS_NOT_VALID_ALONE_OR_AS_A_BOOLEAN_OPERAND); |
+ } |
if (peek(0) != Token.CONDITIONAL) { |
return done(result); |
} |
@@ -2283,7 +2299,7 @@ public class DartParser extends CompletionHooksParserBase { |
ensureAssignable(result); |
consume(token); |
result = doneWithoutConsuming(new DartUnaryExpression(token, result, false)); |
- } |
+ } |
return done(result); |
} |
@@ -2677,7 +2693,7 @@ public class DartParser extends CompletionHooksParserBase { |
case SUPER: { |
beginSuperExpression(); |
consume(Token.SUPER); |
- return done(parseAssignableSelector(doneWithoutConsuming(DartSuperExpression.get()))); |
+ return done(DartSuperExpression.get()); |
} |
case NEW: { |