JS: fix parsing of wrong delete operation in js function.

See KT-15294
This commit is contained in:
Alexey Andreev
2017-09-26 19:26:16 +03:00
parent bad50c03a7
commit 0269c3309a
6 changed files with 33 additions and 5 deletions
@@ -392,9 +392,7 @@ public class JsAstMapper {
JsUnaryOperator.DELETE, to);
}
else {
throw createParserException(
"'delete' can only operate on property names and array elements",
from);
return new JsNullLiteral();
}
}
@@ -81,5 +81,7 @@ public class MessagesBundle extends ListResourceBundle {
{"msg.catch.unreachable", "any catch clauses following an unqualified catch are unreachable"},
{"msg.no.name.after.dot", "missing name after . operator"},
{"msg.jsni.expected.identifier", "Expected an identifier in JSNI reference"},
{"msg.wrong.delete argument", "Wrong argument for ''delete'' operation. " +
"Must be either property reference or array subscript expression."},
};
}
@@ -37,6 +37,8 @@
package com.google.gwt.dev.js.rhino;
import org.jetbrains.annotations.NotNull;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@@ -890,8 +892,13 @@ public class Parser {
case TokenStream.DEC:
return nf.createUnary(tt, TokenStream.PRE, memberExpr(ts, true), position);
case TokenStream.DELPROP:
return nf.createUnary(TokenStream.DELPROP, unaryExpr(ts), position);
case TokenStream.DELPROP: {
Node argument = unaryExpr(ts);
if (!isValidDeleteArgument(argument)) {
Context.reportError("msg.wrong.delete argument", argument.getPosition(), ts.lastPosition);
}
return nf.createUnary(TokenStream.DELPROP, argument, position);
}
case TokenStream.ERROR:
break;
@@ -922,6 +929,10 @@ public class Parser {
return nf.createName("err", position); // Only reached on error. Try to continue.
}
private static boolean isValidDeleteArgument(@NotNull Node node) {
return node.type == TokenStream.GETPROP || node.type == TokenStream.GETELEM;
}
private Node argumentList(TokenStream ts, Node listNode) throws IOException, JavaScriptException {
boolean matched;
ts.flags |= TokenStream.TSF_REGEXP;