var AST_This = DEFNODE("This", null, {
$documentation: "The `this` symbol",
_validate: function() {
- if (this.name !== "this") throw new Error('name must be "this"');
+ if (this.TYPE == "This" && this.name !== "this") throw new Error('name must be "this"');
},
}, AST_ObjectIdentity);
+var AST_NewTarget = DEFNODE("NewTarget", null, {
+ $documentation: "The `new.target` symbol",
+ _validate: function() {
+ if (this.name !== "new.target") throw new Error('name must be "new.target": ' + this.name);
+ },
+}, AST_This);
+
var AST_Template = DEFNODE("Template", "expressions strings tag", {
$documentation: "A template literal, i.e. tag`str1${expr1}...strN${exprN}strN+1`",
$propdoc: {
var new_ = function(allow_calls) {
var start = S.token;
expect_token("operator", "new");
+ if (is("punc", ".") && is_token(peek(), "name", "target")) {
+ next();
+ next();
+ return new AST_NewTarget({
+ name: "new.target",
+ start: start,
+ end: prev(),
+ })
+ }
var newexp = expr_atom(false), args;
if (is("punc", "(")) {
next();
expect_stdout: "PASS"
node_version: ">=4"
}
+
+new_target: {
+ input: {
+ console.log(typeof new class {
+ constructor() {
+ this.f = () => new.target;
+ }
+ }().f());
+ }
+ expect: {
+ console.log(typeof new class {
+ constructor() {
+ this.f = () => new.target;
+ }
+ }().f());
+ }
+ expect_stdout: "function"
+ node_version: ">=6"
+}
expect_stdout: "PASS"
node_version: ">=4"
}
+
+new_target: {
+ input: {
+ console.log(typeof new function() {
+ return new.target;
+ }, function() {
+ return new.target;
+ }());
+ }
+ expect: {
+ console.log(typeof new function() {
+ return new.target;
+ }(), function() {
+ return new.target;
+ }());
+ }
+ expect_stdout: "function undefined"
+ node_version: ">=6"
+}