LibJS: Use natural source positions for parser-synthesized identifiers

The Rust parser used to copy several "rule_start"-derived positions
from the C++ implementation: every identifier inside a binding pattern
inherited the pattern's `[`/`{` position, every property identifier
after `.` inherited the period's position, every spread element
inherited the surrounding `[`/`{` position, and identifier-name
property keys inherited the object/class start position. This was
useful while comparing bytecode against the C++ port; with the C++
side gone, those quirks just hide the actual source positions in
source maps and devtools.

Drop the dedicated `binding_pattern_start` parser field and the
`ident_pos_override` parameter on `parse_property_key`, and capture
each identifier's own start position at the consume site.

Add an AST snapshot test that pins the new per-identifier positions
for object, array, nested, and parameter binding patterns.
This commit is contained in:
Andreas Kling 2026-04-26 20:37:30 +02:00 committed by Andreas Kling
parent cec0be6f3d
commit 30394ece8d
43 changed files with 271 additions and 208 deletions

View file

@ -256,11 +256,6 @@ pub struct Parser<'a> {
/// Set during synthesize_binding_pattern to allow MemberExpressions as binding targets.
allow_member_expressions: bool,
/// Position of the opening bracket/brace in binding patterns.
/// Used so all identifiers inside a binding pattern share the pattern's start position,
/// matching C++ parser behavior.
binding_pattern_start: Option<Position>,
/// True while parsing a class body that has an `extends` clause.
pub(crate) class_has_super_class: bool,
/// Depth counter for class bodies — used to reject `#name` outside classes.
@ -333,7 +328,6 @@ impl<'a> Parser<'a> {
last_class_name: Utf16String::default(),
pattern_bound_names: Vec::new(),
allow_member_expressions: false,
binding_pattern_start: None,
class_has_super_class: false,
class_scope_depth: 0,
has_default_export_name: false,

View file

@ -938,17 +938,7 @@ impl Parser<'_> {
is_identifier: false,
}
} else {
// C++ only uses class start position for Identifier and PrivateIdentifier
// tokens (handled directly in the switch). Keywords like `return` go through
// parse_property_key which uses its own position.
let key_override = if self.current_token.token_type == TokenType::Identifier
|| self.current_token.token_type == TokenType::PrivateIdentifier
{
Some(class_start)
} else {
None
};
self.parse_property_key(key_override)
self.parse_property_key()
};
// https://tc39.es/ecma262/#sec-class-definitions-static-semantics-early-errors
@ -1381,12 +1371,6 @@ impl Parser<'_> {
entries: Vec::new(),
};
}
// Save the position before consuming '[' or '{'. C++ uses
// rule_start.position() (from push_start()) for all identifiers inside
// the binding pattern. Each recursive call gets its own push_start(),
// so nested patterns use the inner pattern's start position.
let outer_pattern_start = self.binding_pattern_start;
self.binding_pattern_start = Some(self.position());
self.consume();
let kind = if is_object {
@ -1445,8 +1429,7 @@ impl Parser<'_> {
|| self.match_token(TokenType::NumericLiteral)
|| self.match_token(TokenType::BigIntLiteral)
{
// C++ uses the binding pattern start position for all name identifiers.
let entry_start = self.binding_pattern_start.unwrap_or_else(|| self.position());
let entry_start = self.position();
if self.match_token(TokenType::StringLiteral) || self.match_token(TokenType::NumericLiteral) {
needs_alias = true;
@ -1517,7 +1500,7 @@ impl Parser<'_> {
let nested = self.parse_binding_pattern();
entry_alias = Some(BindingEntryAlias::BindingPattern(Box::new(nested)));
} else if self.match_identifier_name() {
let alias_start = self.binding_pattern_start.unwrap_or_else(|| self.position());
let alias_start = self.position();
let token = self.consume();
let name = self.token_identifier_name(&token);
let id = self.make_identifier(alias_start, name.clone());
@ -1564,7 +1547,7 @@ impl Parser<'_> {
let nested = self.parse_binding_pattern();
entry_alias = Some(BindingEntryAlias::BindingPattern(Box::new(nested)));
} else if self.match_identifier_name() {
let alias_start = self.binding_pattern_start.unwrap_or_else(|| self.position());
let alias_start = self.position();
let token = self.consume();
let name = self.token_identifier_name(&token);
let id = self.make_identifier(alias_start, name.clone());
@ -1615,7 +1598,6 @@ impl Parser<'_> {
}
self.consume_token(closing_token);
self.binding_pattern_start = outer_pattern_start;
BindingPattern { kind, entries }
}

View file

@ -875,9 +875,9 @@ impl Parser<'_> {
if matches!(lhs.inner, ExpressionKind::Super) {
self.syntax_error("Cannot access private field or method via 'super'");
}
// C++ uses rule_start (period position) for property identifiers.
let id = self.parse_private_identifier(start);
let property = self.expression(start, ExpressionKind::PrivateIdentifier(Box::new(id)));
let property_start = self.position();
let id = self.parse_private_identifier(property_start);
let property = self.expression(property_start, ExpressionKind::PrivateIdentifier(Box::new(id)));
(
self.expression(
start,
@ -890,10 +890,10 @@ impl Parser<'_> {
ForbiddenTokens::none(),
)
} else if self.match_identifier_name() {
let property_start = self.position();
let token = self.consume();
// C++ uses rule_start (period position) for property identifiers.
let property_identifier = self.make_identifier(start, self.token_identifier_name(&token));
let property = self.expression(start, ExpressionKind::Identifier(property_identifier));
let property_identifier = self.make_identifier(property_start, self.token_identifier_name(&token));
let property = self.expression(property_start, ExpressionKind::Identifier(property_identifier));
(
self.expression(
start,
@ -1418,11 +1418,11 @@ impl Parser<'_> {
let mut has_proto_setter = false;
while !self.match_token(TokenType::CurlyClose) && !self.done() {
if self.match_token(TokenType::TripleDot) {
let spread_start = self.position();
self.consume();
let expression = self.parse_assignment_expression();
// C++ uses object expression start position for all ObjectProperty nodes.
properties.push(ObjectProperty {
range: self.range_from(start),
range: self.range_from(spread_start),
property_type: ObjectPropertyType::Spread,
key: Box::new(expression),
is_computed: false,
@ -1493,31 +1493,13 @@ impl Parser<'_> {
self.consume();
}
// In C++, identifiers matching match_identifier() are consumed directly in
// parse_object_expression and get the object's rule_start position. This applies
// even after consuming an `async` prefix. Only get/set prefix and generator `*`
// cause the key to go through parse_property_key with its own position.
// NB: C++ match_identifier() returns true for most EscapedKeyword tokens
// (like escaped reserved words "if", "while", etc.), only rejecting
// let/yield/await under specific conditions. Rust's match_identifier()
// is more restrictive, so we add explicit EscapedKeyword handling here.
let is_cpp_identifier = self.match_identifier()
|| (self.current_token.token_type == TokenType::EscapedKeyword && {
let value = self.token_value(&self.current_token);
value != utf16!("let") && value != utf16!("yield") && value != utf16!("await")
});
let ident_override = if !is_getter && !is_setter && !is_generator && is_cpp_identifier {
Some(obj_start)
} else {
None
};
let PropertyKey {
expression: key,
name: key_value,
is_proto,
is_computed,
is_identifier,
} = self.parse_property_key(ident_override);
} = self.parse_property_key();
// https://tc39.es/ecma262/#sec-object-initializer
// Private names are not allowed in object literals, even inside class bodies.
@ -1679,7 +1661,7 @@ impl Parser<'_> {
) || next.token_type.is_identifier_name()
}
pub(crate) fn parse_property_key(&mut self, ident_pos_override: Option<Position>) -> PropertyKey {
pub(crate) fn parse_property_key(&mut self) -> PropertyKey {
let proto_name = utf16!("__proto__");
let start = self.position();
match self.current_token_type() {
@ -1759,12 +1741,10 @@ impl Parser<'_> {
if value == utf16!("#constructor") {
self.syntax_error("Private property with name '#constructor' is not allowed");
}
// C++ uses the class start position for private identifiers in class elements.
let key_start = ident_pos_override.unwrap_or(start);
let expression = self.expression(
key_start,
start,
ExpressionKind::PrivateIdentifier(Box::new(PrivateIdentifier {
range: self.range_from(key_start),
range: self.range_from(start),
name: value.clone(),
})),
);
@ -1785,9 +1765,7 @@ impl Parser<'_> {
let token = self.consume_property_key_token();
let value = Utf16String::from(self.token_value(&token));
let is_proto = value == proto_name;
// C++ uses the object expression start position for identifier-name keys.
let key_start = ident_pos_override.unwrap_or(start);
let expression = self.expression(key_start, ExpressionKind::StringLiteral(Box::new(value.clone())));
let expression = self.expression(start, ExpressionKind::StringLiteral(Box::new(value.clone())));
PropertyKey {
expression,
name: Some(value),
@ -1824,11 +1802,11 @@ impl Parser<'_> {
continue;
}
if self.match_token(TokenType::TripleDot) {
let spread_start = self.position();
self.consume();
let expression = self.parse_assignment_expression();
// C++ uses the array's rule_start ([ position) for SpreadExpression.
elements.push(Some(
self.expression(start, ExpressionKind::Spread(Box::new(expression))),
self.expression(spread_start, ExpressionKind::Spread(Box::new(expression))),
));
} else {
elements.push(Some(self.parse_assignment_expression()));

View file

@ -44,7 +44,7 @@ Program (script) @2:1
│ │ └─ BindingPattern (object)
│ │ └─ entry
│ │ └─ name
│ │ └─ Identifier "x" @23:38
│ │ └─ Identifier "x" @23:40
│ └─ body
│ └─ FunctionBody @24:5
│ └─ ReturnStatement @24:5
@ -60,4 +60,4 @@ Program (script) @2:1
└─ ReturnStatement @29:5
└─ MemberExpression @29:21
├─ Identifier "arguments" [variable:0] @29:12
└─ Identifier "length" @29:21
└─ Identifier "length" @29:22

View file

@ -7,7 +7,7 @@ Program (script) @1:1
│ ├─ BindingPattern (array)
│ │ └─ entry
│ │ └─ alias
│ │ └─ Identifier "a" [variable:0] @1:10
│ │ └─ Identifier "a" [variable:0] @1:11
│ └─ Identifier "b" [argument:1] @1:10
└─ body
└─ FunctionBody @1:9

View file

@ -19,7 +19,7 @@ Program (script) @1:1
│ └─ BlockStatement @7:1
└─ elements
└─ ClassMethod @7:1
├─ StringLiteral "bar" @7:1
├─ StringLiteral "bar" @8:12
└─ FunctionExpression async* "" [strict] @8:5
└─ body
└─ FunctionBody @9:9

View file

@ -0,0 +1,95 @@
Program (script) @6:1
├─ VariableDeclaration (let) @6:1
│ └─ VariableDeclarator @6:1
│ ├─ BindingPattern (object)
│ │ ├─ entry
│ │ │ └─ name
│ │ │ └─ Identifier "foo" [global] @6:7
│ │ └─ entry
│ │ └─ name
│ │ └─ Identifier "bar" [global] @6:12
│ └─ ObjectExpression @6:20
├─ VariableDeclaration (let) @7:1
│ └─ VariableDeclarator @7:1
│ ├─ BindingPattern (object)
│ │ ├─ entry
│ │ │ ├─ name
│ │ │ │ └─ Identifier "x" [global] @7:7
│ │ │ └─ alias
│ │ │ └─ Identifier "aliased" [global] @7:10
│ │ └─ entry
│ │ ├─ name
│ │ │ └─ Identifier "y" [global] @7:19
│ │ └─ alias
│ │ └─ Identifier "also" [global] @7:22
│ └─ ObjectExpression @7:31
├─ VariableDeclaration (let) @8:1
│ └─ VariableDeclarator @8:1
│ ├─ BindingPattern (array)
│ │ ├─ entry
│ │ │ └─ alias
│ │ │ └─ Identifier "first" [global] @8:7
│ │ ├─ Elision
│ │ └─ entry
│ │ └─ alias
│ │ └─ Identifier "third" [global] @8:16
│ └─ ArrayExpression @8:26
├─ VariableDeclaration (let) @9:1
│ └─ VariableDeclarator @9:1
│ ├─ BindingPattern (object)
│ │ ├─ entry
│ │ │ ├─ name
│ │ │ │ └─ Identifier "nested" [global] @9:7
│ │ │ └─ alias
│ │ │ └─ BindingPattern (object)
│ │ │ └─ entry
│ │ │ └─ name
│ │ │ └─ Identifier "inner" [global] @9:17
│ │ └─ entry (rest)
│ │ └─ name
│ │ └─ Identifier "rest" [global] @9:29
│ └─ ObjectExpression @9:38
├─ VariableDeclaration (let) @10:1
│ └─ VariableDeclarator @10:1
│ ├─ BindingPattern (array)
│ │ ├─ entry
│ │ │ └─ alias
│ │ │ └─ Identifier "a" [global] @10:7
│ │ └─ entry
│ │ └─ alias
│ │ └─ BindingPattern (array)
│ │ ├─ entry
│ │ │ └─ alias
│ │ │ └─ Identifier "b" [global] @10:12
│ │ └─ entry
│ │ └─ alias
│ │ └─ Identifier "c" [global] @10:15
│ └─ ArrayExpression @10:23
└─ FunctionDeclaration "destructured" @12:1
├─ parameters
│ ├─ BindingPattern (object)
│ │ ├─ entry
│ │ │ └─ name
│ │ │ └─ Identifier "p" [variable:0] @12:25
│ │ └─ entry
│ │ ├─ name
│ │ │ └─ Identifier "q" [global] @12:28
│ │ └─ alias
│ │ └─ Identifier "r" [variable:1] @12:31
│ └─ BindingPattern (array)
│ ├─ entry
│ │ └─ alias
│ │ └─ Identifier "s" [variable:2] @12:38
│ └─ entry
│ └─ alias
│ └─ Identifier "t" [variable:3] @12:41
└─ body
└─ FunctionBody @13:5
└─ ReturnStatement @13:5
└─ BinaryExpression (+) @13:22
├─ BinaryExpression (+) @13:18
│ ├─ BinaryExpression (+) @13:14
│ │ ├─ Identifier "p" [variable:0] @13:12
│ │ └─ Identifier "r" [variable:1] @13:16
│ └─ Identifier "s" [variable:2] @13:20
└─ Identifier "t" [variable:3] @13:24

View file

@ -4,17 +4,17 @@ Program (script) @1:1
├─ BindingPattern (object)
│ ├─ entry
│ │ ├─ name
│ │ │ └─ Identifier "foo" [global] @1:5
│ │ │ └─ Identifier "foo" [global] @1:7
│ │ └─ alias
│ │ └─ Identifier "a" [global] @1:5
│ │ └─ Identifier "a" [global] @1:12
│ └─ entry
│ ├─ name
│ │ └─ Identifier "1" [global] @1:5
│ │ └─ Identifier "1" [global] @1:15
│ └─ alias
│ └─ Identifier "b" [global] @1:5
│ └─ Identifier "b" [global] @1:18
└─ ObjectExpression @1:24
├─ ObjectProperty @1:24
│ ├─ StringLiteral "foo" @1:24
│ ├─ StringLiteral "foo" @1:26
│ └─ NumericLiteral 1 @1:31
└─ ObjectProperty @1:24
├─ NumericLiteral 1 @1:34

View file

@ -23,10 +23,10 @@ Program (script) @2:1
│ │ └─ ThrowStatement @13:9
│ │ └─ ObjectExpression @13:15
│ │ ├─ ObjectProperty @13:15
│ │ │ ├─ StringLiteral "msg" @13:15
│ │ │ ├─ StringLiteral "msg" @13:17
│ │ │ └─ StringLiteral "oops" @13:28
│ │ └─ ObjectProperty @13:15
│ │ ├─ StringLiteral "code" @13:15
│ │ ├─ StringLiteral "code" @13:30
│ │ └─ NumericLiteral 42 @13:36
│ └─ handler
│ └─ CatchClause @14:7
@ -34,10 +34,10 @@ Program (script) @2:1
│ │ └─ BindingPattern (object)
│ │ ├─ entry
│ │ │ └─ name
│ │ │ └─ Identifier "msg" [variable:1] @14:14
│ │ │ └─ Identifier "msg" [variable:1] @14:16
│ │ └─ entry
│ │ └─ name
│ │ └─ Identifier "code" [variable:0] @14:14
│ │ └─ Identifier "code" [variable:0] @14:21
│ └─ BlockStatement @14:29
│ └─ ReturnStatement @15:9
│ └─ BinaryExpression (+) @15:20
@ -89,7 +89,7 @@ Program (script) @2:1
│ │ │ │ └─ ThrowStatement @44:13
│ │ │ │ └─ ObjectExpression @44:19
│ │ │ │ └─ ObjectProperty @44:19
│ │ │ │ ├─ StringLiteral "a" @44:19
│ │ │ │ ├─ StringLiteral "a" @44:21
│ │ │ │ └─ NumericLiteral 1 @44:24
│ │ │ └─ handler
│ │ │ └─ CatchClause @45:11
@ -97,14 +97,14 @@ Program (script) @2:1
│ │ │ │ └─ BindingPattern (object)
│ │ │ │ └─ entry
│ │ │ │ └─ name
│ │ │ │ └─ Identifier "a" [variable:0] @45:18
│ │ │ │ └─ Identifier "a" [variable:0] @45:20
│ │ │ └─ BlockStatement @45:25
│ │ │ └─ ExpressionStatement @46:13
│ │ │ └─ Identifier "a" [variable:0] @46:13
│ │ └─ ThrowStatement @48:9
│ │ └─ ObjectExpression @48:15
│ │ └─ ObjectProperty @48:15
│ │ ├─ StringLiteral "b" @48:15
│ │ ├─ StringLiteral "b" @48:17
│ │ └─ NumericLiteral 2 @48:20
│ └─ handler
│ └─ CatchClause @49:7
@ -112,7 +112,7 @@ Program (script) @2:1
│ │ └─ BindingPattern (object)
│ │ └─ entry
│ │ └─ name
│ │ └─ Identifier "b" [variable:1] @49:14
│ │ └─ Identifier "b" [variable:1] @49:16
│ └─ BlockStatement @49:21
│ └─ ReturnStatement @50:9
│ └─ Identifier "b" [variable:1] @50:16

View file

@ -16,7 +16,7 @@ Program (script) @1:1
│ │ └─ BlockStatement @5:1
│ └─ elements
│ └─ ClassField static @5:1
│ └─ StringLiteral "a" @5:1
│ └─ StringLiteral "a" @6:12
└─ ClassDeclaration @9:1
└─ ClassExpression "C" @9:1
├─ constructor
@ -25,8 +25,8 @@ Program (script) @1:1
│ └─ BlockStatement @9:1
└─ elements
└─ ClassField @9:1
├─ StringLiteral "super_field" @9:1
├─ StringLiteral "super_field" @10:5
└─ initializer
└─ MemberExpression @10:24
├─ SuperExpression @10:19
└─ Identifier "foo" @10:24
└─ Identifier "foo" @10:25

View file

@ -9,7 +9,7 @@ Program (script) @2:1
│ │ └─ BlockStatement @2:9
│ └─ elements
│ └─ ClassMethod @2:9
│ ├─ StringLiteral "method" @2:9
│ ├─ StringLiteral "method" @3:5
│ └─ FunctionExpression "" [strict] @3:5
│ └─ body
│ └─ FunctionBody @4:9
@ -26,7 +26,7 @@ Program (script) @2:1
│ │ │ └─ BlockStatement @10:5
│ │ └─ elements
│ │ └─ ClassMethod @10:5
│ │ ├─ StringLiteral "method" @10:5
│ │ ├─ StringLiteral "method" @11:9
│ │ └─ FunctionExpression "" [strict] @11:9
│ │ └─ body
│ │ └─ FunctionBody @12:13
@ -71,20 +71,20 @@ Program (script) @2:1
│ │ └─ BlockStatement @31:5
│ └─ elements
│ ├─ ClassField static @31:5
│ │ ├─ StringLiteral "x" @31:5
│ │ ├─ StringLiteral "x" @32:16
│ │ └─ initializer
│ │ └─ NumericLiteral 1 @32:20
│ └─ ClassMethod static @31:5
│ ├─ StringLiteral "method" @31:5
│ ├─ StringLiteral "method" @33:16
│ └─ FunctionExpression "" [strict] @33:16
│ └─ body
│ └─ FunctionBody @34:13
│ └─ ReturnStatement @34:13
│ └─ MemberExpression @34:23
│ ├─ Identifier "Baz" @34:20
│ └─ Identifier "x" @34:23
│ └─ Identifier "x" @34:24
└─ ReturnStatement @37:5
└─ CallExpression @37:22
└─ MemberExpression @37:15
├─ Identifier "Baz" [variable:0] @37:12
└─ Identifier "method" @37:15
└─ Identifier "method" @37:16

View file

@ -7,6 +7,6 @@ Program (script) @1:1
│ └─ BlockStatement @1:1
└─ elements
└─ ClassField static @1:1
├─ StringLiteral "x" @1:1
├─ StringLiteral "x" @2:12
└─ initializer
└─ NumericLiteral 1 @2:16

View file

@ -11,27 +11,27 @@ Program (script) @1:1
│ │ └─ AssignmentExpression (=) @3:19
│ │ ├─ MemberExpression @3:13
│ │ │ ├─ ThisExpression @3:9
│ │ │ └─ Identifier "name" @3:13
│ │ │ └─ Identifier "name" @3:14
│ │ └─ Identifier "name" [argument:0] @3:21
│ └─ elements
│ ├─ ClassMethod @1:1
│ │ ├─ StringLiteral "speak" @1:1
│ │ ├─ StringLiteral "speak" @6:5
│ │ └─ FunctionExpression "" [strict] [uses-this] @6:5
│ │ └─ body
│ │ └─ FunctionBody @7:9
│ │ └─ ReturnStatement @7:9
│ │ └─ MemberExpression @7:20
│ │ ├─ ThisExpression @7:16
│ │ └─ Identifier "name" @7:20
│ │ └─ Identifier "name" @7:21
│ └─ ClassMethod (getter) @1:1
│ ├─ StringLiteral "info" @1:1
│ ├─ StringLiteral "info" @10:9
│ └─ FunctionExpression "" [strict] [uses-this] @10:5
│ └─ body
│ └─ FunctionBody @11:9
│ └─ ReturnStatement @11:9
│ └─ MemberExpression @11:20
│ ├─ ThisExpression @11:16
│ └─ Identifier "name" @11:20
│ └─ Identifier "name" @11:21
└─ ClassDeclaration @15:1
└─ ClassExpression "Dog" @15:1
├─ super class

View file

@ -73,7 +73,7 @@ Program (script) @3:1
│ │ └─ CallExpression @30:17
│ │ ├─ MemberExpression @30:12
│ │ │ ├─ Identifier "fns" [variable:0] (var) @30:9
│ │ │ └─ Identifier "push" @30:12
│ │ │ └─ Identifier "push" @30:13
│ │ └─ FunctionExpression "" @30:18
│ │ └─ body
│ │ └─ FunctionBody @31:13
@ -107,7 +107,7 @@ Program (script) @3:1
│ └─ CallExpression @40:17
│ ├─ MemberExpression @40:12
│ │ ├─ Identifier "fns" [variable:0] (var) @40:9
│ │ └─ Identifier "push" @40:12
│ │ └─ Identifier "push" @40:13
│ └─ FunctionExpression "" @40:18
│ └─ body
│ └─ FunctionBody @41:13

View file

@ -10,7 +10,7 @@ Program (script) @5:1
│ │ └─ BindingPattern (object)
│ │ └─ entry
│ │ ├─ name
│ │ │ └─ Identifier "a" [global] @6:6
│ │ │ └─ Identifier "a" [global] @6:8
│ │ └─ initializer
│ │ └─ NumericLiteral 0 @6:12
│ └─ ArrayExpression @6:19
@ -22,7 +22,7 @@ Program (script) @5:1
│ └─ MemberExpression @7:14
│ ├─ ObjectExpression @7:6
│ │ └─ ObjectProperty @7:6
│ │ ├─ StringLiteral "a" @7:6
│ │ ├─ StringLiteral "a" @7:8
│ │ └─ NumericLiteral 0 @7:11
│ └─ Identifier "x" @7:14
│ └─ Identifier "x" @7:15
└─ ArrayExpression @7:20

View file

@ -58,7 +58,7 @@ Program (script) @3:1
│ └─ BindingPattern (object)
│ └─ entry
│ ├─ name
│ │ └─ Identifier "x" [variable:0] @23:28
│ │ └─ Identifier "x" [variable:0] @23:30
│ └─ initializer
│ └─ NumericLiteral 10 @23:34
│ └─ default

View file

@ -4,10 +4,10 @@ Program (script) @1:1
│ │ └─ BindingPattern (array)
│ │ ├─ entry
│ │ │ └─ alias
│ │ │ └─ Identifier "x" [variable:0] @1:29
│ │ │ └─ Identifier "x" [variable:0] @1:30
│ │ └─ entry
│ │ └─ alias
│ │ └─ Identifier "y" [variable:1] @1:29
│ │ └─ Identifier "y" [variable:1] @1:33
│ └─ body
│ └─ FunctionBody @2:5
│ └─ ReturnStatement @2:5
@ -19,10 +19,10 @@ Program (script) @1:1
│ │ └─ BindingPattern (object)
│ │ ├─ entry
│ │ │ └─ name
│ │ │ └─ Identifier "a" [variable:0] @5:30
│ │ │ └─ Identifier "a" [variable:0] @5:32
│ │ └─ entry
│ │ └─ name
│ │ └─ Identifier "b" [variable:1] @5:30
│ │ └─ Identifier "b" [variable:1] @5:35
│ └─ body
│ └─ FunctionBody @6:5
│ └─ ReturnStatement @6:5
@ -35,7 +35,7 @@ Program (script) @1:1
│ │ ├─ BindingPattern (object)
│ │ │ └─ entry
│ │ │ └─ name
│ │ │ └─ Identifier "x" [variable:0] @9:23
│ │ │ └─ Identifier "x" [variable:0] @9:25
│ │ └─ rest
│ │ └─ Identifier "rest" [argument:2] @9:16
│ └─ body
@ -47,18 +47,18 @@ Program (script) @1:1
│ │ └─ Identifier "x" [variable:0] @10:20
│ └─ MemberExpression @10:28
│ ├─ Identifier "rest" [argument:2] @10:24
│ └─ Identifier "length" @10:28
│ └─ Identifier "length" @10:29
├─ FunctionDeclaration "nested" @13:1
│ ├─ parameters
│ │ └─ BindingPattern (object)
│ │ └─ entry
│ │ ├─ name
│ │ │ └─ Identifier "a" [global] @13:17
│ │ │ └─ Identifier "a" [global] @13:19
│ │ └─ alias
│ │ └─ BindingPattern (object)
│ │ └─ entry
│ │ └─ name
│ │ └─ Identifier "b" [variable:0] @13:22
│ │ └─ Identifier "b" [variable:0] @13:24
│ └─ body
│ └─ FunctionBody @14:5
│ └─ ReturnStatement @14:5
@ -68,7 +68,7 @@ Program (script) @1:1
│ │ └─ BindingPattern (object)
│ │ └─ entry
│ │ ├─ name
│ │ │ └─ Identifier "x" [variable:0] @17:24
│ │ │ └─ Identifier "x" [variable:0] @17:26
│ │ └─ initializer
│ │ └─ NumericLiteral 10 @17:30
│ │ └─ default
@ -82,9 +82,9 @@ Program (script) @1:1
│ └─ BindingPattern (object)
│ └─ entry
│ ├─ name
│ │ └─ Identifier "a" [global] @21:18
│ │ └─ Identifier "a" [global] @21:20
│ └─ alias
│ └─ Identifier "renamed" [variable:0] @21:18
│ └─ Identifier "renamed" [variable:0] @21:23
└─ body
└─ FunctionBody @22:5
└─ ReturnStatement @22:5

View file

@ -4,7 +4,7 @@ Program (script) @2:1
│ │ └─ BindingPattern (object)
│ │ └─ entry
│ │ └─ name
│ │ └─ Identifier "x" @2:30
│ │ └─ Identifier "x" @2:32
│ └─ body
│ └─ FunctionBody @3:5
│ └─ ReturnStatement @3:5
@ -18,10 +18,10 @@ Program (script) @2:1
│ │ └─ BindingPattern (object)
│ │ ├─ entry
│ │ │ └─ name
│ │ │ └─ Identifier "a" @9:23
│ │ │ └─ Identifier "a" @9:25
│ │ └─ entry
│ │ └─ name
│ │ └─ Identifier "b" @9:23
│ │ └─ Identifier "b" @9:28
│ └─ body
│ └─ FunctionBody @10:5
│ ├─ ExpressionStatement @10:5
@ -37,7 +37,7 @@ Program (script) @2:1
│ │ ├─ BindingPattern (object)
│ │ │ └─ entry
│ │ │ └─ name
│ │ │ └─ Identifier "x" @15:23
│ │ │ └─ Identifier "x" @15:25
│ │ └─ Identifier "obj" [argument:1] @15:23
│ └─ body
│ └─ FunctionBody @16:5
@ -53,7 +53,7 @@ Program (script) @2:1
│ │ └─ BindingPattern (object)
│ │ └─ entry
│ │ └─ name
│ │ └─ Identifier "x" @22:27
│ │ └─ Identifier "x" @22:29
│ └─ body
│ └─ FunctionBody @23:5
│ └─ ReturnStatement @23:5
@ -66,10 +66,10 @@ Program (script) @2:1
│ └─ BindingPattern (array)
│ ├─ entry
│ │ └─ alias
│ │ └─ Identifier "a" [variable:0] @28:33
│ │ └─ Identifier "a" [variable:0] @28:34
│ └─ entry
│ └─ alias
│ └─ Identifier "b" [variable:1] @28:33
│ └─ Identifier "b" [variable:1] @28:37
└─ body
└─ FunctionBody @29:5
└─ ReturnStatement @29:5

View file

@ -7,10 +7,10 @@ Program (script) @1:1
│ ├─ BindingPattern (array)
│ │ ├─ entry
│ │ │ └─ alias
│ │ │ └─ Identifier "a" [variable:0] @2:9
│ │ │ └─ Identifier "a" [variable:0] @2:10
│ │ └─ entry
│ │ └─ alias
│ │ └─ Identifier "b" [variable:1] @2:9
│ │ └─ Identifier "b" [variable:1] @2:13
│ └─ ArrayExpression @2:18
│ ├─ NumericLiteral 1 @2:19
│ └─ NumericLiteral 2 @2:22
@ -19,18 +19,18 @@ Program (script) @1:1
│ ├─ BindingPattern (object)
│ │ ├─ entry
│ │ │ └─ name
│ │ │ └─ Identifier "x" [variable:2] @3:9
│ │ │ └─ Identifier "x" [variable:2] @3:11
│ │ └─ entry
│ │ ├─ name
│ │ │ └─ Identifier "y" [global] @3:9
│ │ │ └─ Identifier "y" [global] @3:14
│ │ └─ alias
│ │ └─ Identifier "z" [variable:3] @3:9
│ │ └─ Identifier "z" [variable:3] @3:17
│ └─ ObjectExpression @3:23
│ ├─ ObjectProperty @3:23
│ │ ├─ StringLiteral "x" @3:23
│ │ ├─ StringLiteral "x" @3:25
│ │ └─ NumericLiteral 3 @3:28
│ └─ ObjectProperty @3:23
│ ├─ StringLiteral "y" @3:23
│ ├─ StringLiteral "y" @3:31
│ └─ NumericLiteral 4 @3:34
└─ ReturnStatement @4:5
└─ BinaryExpression (+) @4:22

View file

@ -7,8 +7,8 @@ Program (script) @1:1
├─ BindingPattern (object)
│ └─ entry
│ └─ name
│ └─ Identifier "eval" [global] @2:6
│ └─ Identifier "eval" [global] @2:8
└─ ObjectExpression @2:17
└─ ObjectProperty @2:17
├─ StringLiteral "eval" @2:17
├─ StringLiteral "eval" @2:19
└─ NumericLiteral 1 @2:25

View file

@ -43,13 +43,13 @@ Program (script) @2:1
│ │ ├─ Identifier "obj" [variable:0] (var) @19:9
│ │ └─ ObjectExpression @19:15
│ │ └─ ObjectProperty @19:15
│ │ ├─ StringLiteral "eval" @19:15
│ │ ├─ StringLiteral "eval" @19:17
│ │ └─ Identifier "eval" [global] @19:15
│ ├─ ExpressionStatement @20:5
│ │ └─ CallExpression @20:13
│ │ ├─ MemberExpression @20:8
│ │ │ ├─ Identifier "obj" [variable:0] (var) @20:5
│ │ │ └─ Identifier "eval" @20:8
│ │ │ └─ Identifier "eval" @20:9
│ │ └─ StringLiteral "x" @20:17
│ └─ ReturnStatement @21:5
│ └─ Identifier "x" [variable:1] (let) @21:12

View file

@ -10,7 +10,7 @@ Program (module) [strict] @1:1
│ └─ BlockStatement @1:17
└─ elements
└─ ClassMethod @1:17
├─ StringLiteral "valueOf" @1:17
├─ StringLiteral "valueOf" @1:31
└─ FunctionExpression "" [strict] @1:31
└─ body
└─ FunctionBody @1:43

View file

@ -19,7 +19,7 @@ Program (script) @2:1
│ ├─ rhs
│ │ └─ ObjectExpression @4:20
│ │ └─ ObjectProperty @4:20
│ │ ├─ StringLiteral "xy" @4:20
│ │ ├─ StringLiteral "xy" @4:22
│ │ └─ NumericLiteral 1 @4:26
│ └─ body
│ └─ BlockStatement @4:31
@ -36,14 +36,14 @@ Program (script) @2:1
│ │ └─ BindingPattern (object)
│ │ ├─ entry
│ │ │ └─ name
│ │ │ └─ Identifier "x" [variable:0] (var) @10:10
│ │ │ └─ Identifier "x" [variable:0] (var) @10:12
│ │ └─ entry
│ │ └─ name
│ │ └─ Identifier "y" [variable:1] (var) @10:10
│ │ └─ Identifier "y" [variable:1] (var) @10:15
│ ├─ rhs
│ │ └─ ObjectExpression @10:22
│ │ └─ ObjectProperty @10:22
│ │ ├─ StringLiteral "ab" @10:22
│ │ ├─ StringLiteral "ab" @10:24
│ │ └─ NumericLiteral 1 @10:28
│ └─ body
│ └─ BlockStatement @10:33
@ -84,18 +84,18 @@ Program (script) @2:1
│ │ └─ BindingPattern (object)
│ │ ├─ entry
│ │ │ └─ name
│ │ │ └─ Identifier "x" [variable:0] (var) @22:10
│ │ │ └─ Identifier "x" [variable:0] (var) @22:12
│ │ └─ entry
│ │ └─ name
│ │ └─ Identifier "y" [variable:1] (var) @22:10
│ │ └─ Identifier "y" [variable:1] (var) @22:15
│ ├─ rhs
│ │ └─ ArrayExpression @22:22
│ │ └─ ObjectExpression @22:23
│ │ ├─ ObjectProperty @22:23
│ │ │ ├─ StringLiteral "x" @22:23
│ │ │ ├─ StringLiteral "x" @22:25
│ │ │ └─ NumericLiteral 1 @22:28
│ │ └─ ObjectProperty @22:23
│ │ ├─ StringLiteral "y" @22:23
│ │ ├─ StringLiteral "y" @22:31
│ │ └─ NumericLiteral 2 @22:34
│ └─ body
│ └─ BlockStatement @22:40
@ -110,11 +110,11 @@ Program (script) @2:1
│ ├─ lhs
│ │ └─ MemberExpression @28:13
│ │ ├─ Identifier "obj" [variable:0] (var) @28:10
│ │ └─ Identifier "key" @28:13
│ │ └─ Identifier "key" @28:14
│ ├─ rhs
│ │ └─ ObjectExpression @28:21
│ │ └─ ObjectProperty @28:21
│ │ ├─ StringLiteral "a" @28:21
│ │ ├─ StringLiteral "a" @28:23
│ │ └─ NumericLiteral 1 @28:26
│ └─ body
│ └─ BlockStatement @28:31
@ -129,7 +129,7 @@ Program (script) @2:1
├─ lhs
│ └─ MemberExpression @34:13
│ ├─ Identifier "obj" [variable:0] (var) @34:10
│ └─ Identifier "key" @34:13
│ └─ Identifier "key" @34:14
├─ rhs
│ └─ ArrayExpression @34:21
│ ├─ NumericLiteral 1 @34:22

View file

@ -61,10 +61,10 @@ Program (script) @2:1
│ │ └─ BindingPattern (array)
│ │ ├─ entry
│ │ │ └─ alias
│ │ │ └─ Identifier "a" [variable:0] @25:14
│ │ │ └─ Identifier "a" [variable:0] @25:15
│ │ └─ entry
│ │ └─ alias
│ │ └─ Identifier "b" [variable:1] @25:14
│ │ └─ Identifier "b" [variable:1] @25:18
│ ├─ rhs
│ │ └─ Identifier "pairs" [argument:0] @25:24
│ └─ body

View file

@ -24,5 +24,5 @@ Program (script) @1:1
└─ CallExpression @7:12
├─ MemberExpression @7:8
│ ├─ Identifier "console" [global] @7:1
│ └─ Identifier "log" @7:8
│ └─ Identifier "log" @7:9
└─ Identifier "x" [global] (var) @7:13

View file

@ -87,10 +87,10 @@ Program (script) @4:1
│ │ ├─ BindingPattern (array)
│ │ │ ├─ entry
│ │ │ │ └─ alias
│ │ │ │ └─ Identifier "a" [variable:0] @28:9
│ │ │ │ └─ Identifier "a" [variable:0] @28:10
│ │ │ └─ entry
│ │ │ └─ alias
│ │ │ └─ Identifier "b" [variable:1] @28:9
│ │ │ └─ Identifier "b" [variable:1] @28:13
│ │ └─ ArrayExpression @28:18
│ │ ├─ NumericLiteral 1 @28:19
│ │ └─ NumericLiteral 2 @28:22
@ -99,26 +99,26 @@ Program (script) @4:1
│ │ ├─ BindingPattern (object)
│ │ │ ├─ entry
│ │ │ │ └─ name
│ │ │ │ └─ Identifier "c" [variable:2] @29:11
│ │ │ │ └─ Identifier "c" [variable:2] @29:13
│ │ │ └─ entry
│ │ │ └─ name
│ │ │ └─ Identifier "d" [variable:3] @29:11
│ │ │ └─ Identifier "d" [variable:3] @29:16
│ │ └─ ObjectExpression @29:22
│ │ ├─ ObjectProperty @29:22
│ │ │ ├─ StringLiteral "c" @29:22
│ │ │ ├─ StringLiteral "c" @29:24
│ │ │ └─ NumericLiteral 3 @29:27
│ │ └─ ObjectProperty @29:22
│ │ ├─ StringLiteral "d" @29:22
│ │ ├─ StringLiteral "d" @29:30
│ │ └─ NumericLiteral 4 @29:33
│ ├─ VariableDeclaration (var) @30:5
│ │ └─ VariableDeclarator @30:5
│ │ ├─ BindingPattern (array)
│ │ │ ├─ entry
│ │ │ │ └─ alias
│ │ │ │ └─ Identifier "e" [variable:4] @30:9
│ │ │ │ └─ Identifier "e" [variable:4] @30:10
│ │ │ └─ entry (rest)
│ │ │ └─ alias
│ │ │ └─ Identifier "f" [variable:5] @30:9
│ │ │ └─ Identifier "f" [variable:5] @30:16
│ │ └─ ArrayExpression @30:21
│ │ ├─ NumericLiteral 5 @30:22
│ │ ├─ NumericLiteral 6 @30:25

View file

@ -7,20 +7,20 @@ Program (script) @1:1
│ │ ├─ BindingPattern (object)
│ │ │ └─ entry
│ │ │ ├─ name
│ │ │ │ └─ Identifier "a" [global] @1:10
│ │ │ │ └─ Identifier "a" [global] @1:12
│ │ │ └─ alias
│ │ │ └─ Identifier "b" [variable:0] @1:10
│ │ │ └─ Identifier "b" [variable:0] @1:15
│ │ ├─ BindingPattern (object)
│ │ │ ├─ entry
│ │ │ │ ├─ name
│ │ │ │ │ └─ Identifier "c" [global] @1:20
│ │ │ │ │ └─ Identifier "c" [global] @1:22
│ │ │ │ └─ alias
│ │ │ │ └─ Identifier "d" [variable:1] @1:20
│ │ │ │ └─ Identifier "d" [variable:1] @1:25
│ │ │ └─ entry
│ │ │ ├─ name
│ │ │ │ └─ Identifier "e" [global] @1:20
│ │ │ │ └─ Identifier "e" [global] @1:28
│ │ │ └─ alias
│ │ │ └─ Identifier "g" [variable:2] @1:20
│ │ │ └─ Identifier "g" [variable:2] @1:31
│ │ └─ Identifier "h" [argument:2] @1:10
│ └─ body
│ └─ FunctionBody @1:9

View file

@ -12,7 +12,7 @@ Program (script) @1:1
│ └─ ReturnStatement @4:9
│ └─ ObjectExpression @4:16
│ └─ ObjectProperty @4:16
│ ├─ StringLiteral "x" @4:16
│ ├─ StringLiteral "x" @4:18
│ └─ NumericLiteral 42 @4:21
└─ ReturnStatement @6:5
└─ Identifier "x" [variable:1] (var) @6:12

View file

@ -7,5 +7,5 @@ Program (script) @1:1
└─ ReturnStatement @2:5
└─ ObjectExpression @2:12
└─ ObjectProperty @2:12
├─ StringLiteral "x" @2:12
├─ StringLiteral "x" @2:14
└─ Identifier "x" [argument:0] @2:12

View file

@ -11,7 +11,7 @@ Program (script) @1:1
│ ├─ Identifier "a" [argument:0] @2:12
│ └─ MemberExpression @2:20
│ ├─ Identifier "rest" [argument:1] @2:16
│ └─ Identifier "length" @2:20
│ └─ Identifier "length" @2:21
├─ FunctionDeclaration "default_params" @5:1
│ ├─ parameters
│ │ ├─ Identifier "a" [argument:0] @5:25
@ -29,10 +29,10 @@ Program (script) @1:1
│ │ └─ BindingPattern (array)
│ │ ├─ entry
│ │ │ └─ alias
│ │ │ └─ Identifier "x" [variable:0] @9:29
│ │ │ └─ Identifier "x" [variable:0] @9:30
│ │ └─ entry
│ │ └─ alias
│ │ └─ Identifier "y" [variable:1] @9:29
│ │ └─ Identifier "y" [variable:1] @9:33
│ └─ body
│ └─ FunctionBody @10:5
│ └─ ReturnStatement @10:5
@ -44,10 +44,10 @@ Program (script) @1:1
│ │ └─ BindingPattern (object)
│ │ ├─ entry
│ │ │ └─ name
│ │ │ └─ Identifier "a" [variable:0] @13:30
│ │ │ └─ Identifier "a" [variable:0] @13:32
│ │ └─ entry
│ │ └─ name
│ │ └─ Identifier "b" [variable:1] @13:30
│ │ └─ Identifier "b" [variable:1] @13:35
│ └─ body
│ └─ FunctionBody @14:5
│ └─ ReturnStatement @14:5
@ -60,7 +60,7 @@ Program (script) @1:1
│ ├─ BindingPattern (object)
│ │ └─ entry
│ │ └─ name
│ │ └─ Identifier "x" [variable:0] @17:23
│ │ └─ Identifier "x" [variable:0] @17:25
│ └─ rest
│ └─ Identifier "rest" [argument:2] @17:16
└─ body
@ -72,4 +72,4 @@ Program (script) @1:1
│ └─ Identifier "x" [variable:0] @18:20
└─ MemberExpression @18:28
├─ Identifier "rest" [argument:2] @18:24
└─ Identifier "length" @18:28
└─ Identifier "length" @18:29

View file

@ -7,16 +7,16 @@ Program (script) @1:1
│ └─ BlockStatement @1:1
└─ elements
├─ ClassField @1:1
│ └─ PrivateIdentifier "#x" @1:1
│ └─ PrivateIdentifier "#x" @2:5
└─ ClassMethod @1:1
├─ StringLiteral "method" @1:1
├─ StringLiteral "method" @3:5
└─ FunctionExpression "" [strict] [uses-this] @3:5
└─ body
└─ FunctionBody @4:9
├─ ExpressionStatement @4:9
│ └─ MemberExpression @4:13
│ ├─ ThisExpression @4:9
│ └─ PrivateIdentifier "#x" @4:13
│ └─ PrivateIdentifier "#x" @4:14
├─ ExpressionStatement @5:9
│ └─ OptionalChain @5:13
│ ├─ ThisExpression @5:9

View file

@ -7,20 +7,20 @@ Program (script) @1:1
│ └─ BlockStatement @1:1
└─ elements
├─ ClassField @1:1
│ ├─ PrivateIdentifier "#x" @1:1
│ ├─ PrivateIdentifier "#x" @2:5
│ └─ initializer
│ └─ NumericLiteral 1 @2:10
├─ ClassMethod (getter) @1:1
│ ├─ PrivateIdentifier "#y" @1:1
│ ├─ PrivateIdentifier "#y" @3:9
│ └─ FunctionExpression "" [strict] [uses-this] @3:5
│ └─ body
│ └─ FunctionBody @4:9
│ └─ ReturnStatement @4:9
│ └─ MemberExpression @4:20
│ ├─ ThisExpression @4:16
│ └─ PrivateIdentifier "#x" @4:20
│ └─ PrivateIdentifier "#x" @4:21
├─ ClassMethod (setter) @1:1
│ ├─ PrivateIdentifier "#y" @1:1
│ ├─ PrivateIdentifier "#y" @6:9
│ └─ FunctionExpression "" [strict] [uses-this] @6:5
│ ├─ parameters
│ │ └─ Identifier "v" [argument:0] @6:12
@ -30,14 +30,14 @@ Program (script) @1:1
│ └─ AssignmentExpression (=) @7:17
│ ├─ MemberExpression @7:13
│ │ ├─ ThisExpression @7:9
│ │ └─ PrivateIdentifier "#x" @7:13
│ │ └─ PrivateIdentifier "#x" @7:14
│ └─ Identifier "v" [argument:0] @7:19
└─ ClassMethod @1:1
├─ StringLiteral "method" @1:1
├─ StringLiteral "method" @9:5
└─ FunctionExpression "" [strict] [uses-this] @9:5
└─ body
└─ FunctionBody @10:9
└─ ReturnStatement @10:9
└─ MemberExpression @10:20
├─ ThisExpression @10:16
└─ PrivateIdentifier "#x" @10:20
└─ PrivateIdentifier "#x" @10:21

View file

@ -5,7 +5,7 @@ Program (script) @3:1
│ └─ ReturnStatement @4:5
│ └─ ObjectExpression @4:12
│ └─ ObjectProperty @4:12
│ ├─ StringLiteral "arguments" @4:12
│ ├─ StringLiteral "arguments" @4:14
│ └─ NumericLiteral 1 @4:25
├─ FunctionDeclaration "plain_eval_key" @8:1
│ └─ body
@ -13,7 +13,7 @@ Program (script) @3:1
│ └─ ReturnStatement @9:5
│ └─ ObjectExpression @9:12
│ └─ ObjectProperty @9:12
│ ├─ StringLiteral "eval" @9:12
│ ├─ StringLiteral "eval" @9:14
│ └─ NumericLiteral 1 @9:20
├─ FunctionDeclaration "shorthand_arguments" @18:1
│ └─ body
@ -21,7 +21,7 @@ Program (script) @3:1
│ └─ ReturnStatement @19:5
│ └─ ObjectExpression @19:12
│ └─ ObjectProperty @19:12
│ ├─ StringLiteral "arguments" @19:12
│ ├─ StringLiteral "arguments" @19:14
│ └─ Identifier "arguments" [variable:0] @19:12
├─ FunctionDeclaration "computed_arguments_key" [might-need-arguments] @24:1
│ └─ body
@ -47,12 +47,12 @@ Program (script) @3:1
│ │ ├─ BindingPattern (object)
│ │ │ └─ entry
│ │ │ ├─ name
│ │ │ │ └─ Identifier "arguments" [variable:0] @37:9
│ │ │ │ └─ Identifier "arguments" [variable:0] @37:11
│ │ │ └─ alias
│ │ │ └─ Identifier "x" [variable:1] @37:9
│ │ │ └─ Identifier "x" [variable:1] @37:22
│ │ └─ ObjectExpression @37:28
│ │ └─ ObjectProperty @37:28
│ │ ├─ StringLiteral "arguments" @37:28
│ │ ├─ StringLiteral "arguments" @37:30
│ │ └─ NumericLiteral 1 @37:41
│ └─ ReturnStatement @38:5
│ └─ Identifier "x" [variable:1] @38:12
@ -64,10 +64,10 @@ Program (script) @3:1
└─ MemberExpression @43:41
├─ ObjectExpression @43:12
│ └─ ObjectProperty (method) @43:12
│ ├─ StringLiteral "arguments" @43:12
│ ├─ StringLiteral "arguments" @43:14
│ └─ FunctionExpression "" @43:14
│ └─ body
│ └─ FunctionBody @43:28
│ └─ ReturnStatement @43:28
│ └─ NumericLiteral 1 @43:35
└─ Identifier "arguments" @43:41
└─ Identifier "arguments" @43:42

View file

@ -9,12 +9,12 @@ Program (script) @1:1
├─ BindingPattern (object)
│ ├─ entry
│ │ ├─ name
│ │ │ └─ Identifier "__proto__" [global] @2:2
│ │ │ └─ Identifier "__proto__" [global] @2:4
│ │ └─ alias
│ │ └─ Identifier "x" [global] (var) @2:15
│ └─ entry
│ ├─ name
│ │ └─ Identifier "__proto__" [global] @2:2
│ │ └─ Identifier "__proto__" [global] @2:18
│ └─ alias
│ └─ Identifier "y" [global] (var) @2:29
└─ ObjectExpression @2:35

View file

@ -32,7 +32,7 @@ Program (script) @2:1
│ │ └─ CallExpression @16:16
│ │ ├─ MemberExpression @16:11
│ │ │ ├─ RegExpLiteral /test/ @16:5
│ │ │ └─ Identifier "test" @16:11
│ │ │ └─ Identifier "test" @16:12
│ │ └─ StringLiteral "test" @16:23
│ └─ consequent
│ └─ BlockStatement @16:26

View file

@ -8,7 +8,7 @@ Program (script) @2:1
│ └─ ReturnStatement @3:5
│ └─ MemberExpression @3:16
│ ├─ Identifier "args" [argument:0] @3:12
│ └─ Identifier "length" @3:16
│ └─ Identifier "length" @3:17
└─ FunctionDeclaration "rest_with_arguments" [might-need-arguments] @8:1
├─ parameters
│ └─ rest
@ -19,7 +19,7 @@ Program (script) @2:1
└─ BinaryExpression (+) @9:24
├─ MemberExpression @9:16
│ ├─ Identifier "args" [argument:0] @9:12
│ └─ Identifier "length" @9:16
│ └─ Identifier "length" @9:17
└─ MemberExpression @9:35
├─ Identifier "arguments" [variable:0] @9:26
└─ Identifier "length" @9:35
└─ Identifier "length" @9:36

View file

@ -9,11 +9,11 @@ Program (script) @2:1
│ │ └─ BlockStatement @2:9
│ └─ elements
│ ├─ ClassField static @2:9
│ │ ├─ StringLiteral "x" @2:9
│ │ ├─ StringLiteral "x" @3:12
│ │ └─ initializer
│ │ └─ NumericLiteral 1 @3:16
│ └─ ClassField static @2:9
│ ├─ StringLiteral "y" @2:9
│ ├─ StringLiteral "y" @4:12
│ └─ initializer
│ └─ NumericLiteral 2 @4:16
└─ VariableDeclaration (var) @8:1

View file

@ -7,7 +7,7 @@ Program (script) @1:1
│ │ └─ BlockStatement @1:1
│ └─ elements
│ └─ ClassMethod (getter) @1:1
│ ├─ StringLiteral "name" @1:1
│ ├─ StringLiteral "name" @2:9
│ └─ FunctionExpression "" [strict] @2:5
│ └─ body
│ └─ FunctionBody @3:9
@ -29,14 +29,14 @@ Program (script) @1:1
│ └─ Identifier "args" @6:1
└─ elements
└─ ClassMethod @6:1
├─ StringLiteral "method" @6:1
├─ StringLiteral "method" @7:5
└─ FunctionExpression "" [strict] [uses-this] [uses-this-from-environment] @7:5
├─ parameters
│ └─ Identifier "x" [argument:0] @7:12
│ └─ default
│ └─ MemberExpression @7:21
│ ├─ SuperExpression @7:16
│ └─ Identifier "name" @7:21
│ └─ Identifier "name" @7:22
└─ body
└─ FunctionBody @8:9
└─ ReturnStatement @8:9

View file

@ -7,7 +7,7 @@ Program (script) @1:1
│ │ └─ BlockStatement @1:1
│ └─ elements
│ └─ ClassMethod @1:1
│ ├─ StringLiteral "getValue" @1:1
│ ├─ StringLiteral "getValue" @2:5
│ └─ FunctionExpression "" [strict] @2:5
│ └─ body
│ └─ FunctionBody @3:9
@ -29,7 +29,7 @@ Program (script) @1:1
│ │ └─ Identifier "args" @7:1
│ └─ elements
│ ├─ ClassMethod @7:1
│ │ ├─ StringLiteral "getValue" @7:1
│ │ ├─ StringLiteral "getValue" @8:5
│ │ └─ FunctionExpression "" [strict] [uses-this] [uses-this-from-environment] @8:5
│ │ └─ body
│ │ └─ FunctionBody @9:9
@ -37,9 +37,9 @@ Program (script) @1:1
│ │ └─ CallExpression @9:30
│ │ └─ MemberExpression @9:21
│ │ ├─ SuperExpression @9:16
│ │ └─ Identifier "getValue" @9:21
│ │ └─ Identifier "getValue" @9:22
│ └─ ClassMethod @7:1
│ ├─ StringLiteral "getComputed" @7:1
│ ├─ StringLiteral "getComputed" @11:5
│ └─ FunctionExpression "" [strict] [uses-this] [uses-this-from-environment] @11:5
│ ├─ parameters
│ │ └─ Identifier "key" [argument:0] @11:17
@ -54,7 +54,7 @@ Program (script) @1:1
├─ Identifier "obj" [global] (let) @16:5
└─ ObjectExpression @16:11
└─ ObjectProperty (method) @16:11
├─ StringLiteral "foo" @16:11
├─ StringLiteral "foo" @17:5
└─ FunctionExpression "" [uses-this] [uses-this-from-environment] @17:5
└─ body
└─ FunctionBody @18:9
@ -62,4 +62,4 @@ Program (script) @1:1
└─ CallExpression @18:30
└─ MemberExpression @18:21
├─ SuperExpression @18:16
└─ Identifier "toString" @18:21
└─ Identifier "toString" @18:22

View file

@ -6,7 +6,7 @@ Program (script) @1:1
│ ├─ tag
│ │ └─ MemberExpression @1:15
│ │ ├─ Identifier "String" [global] @1:9
│ │ └─ Identifier "raw" @1:15
│ │ └─ Identifier "raw" @1:16
│ └─ template
│ └─ TemplateLiteral @1:19
│ └─ StringLiteral "foo

View file

@ -4,7 +4,7 @@ Program (script) @1:1
│ ├─ Identifier "o" [global] (var) @1:5
│ └─ ObjectExpression @1:9
│ └─ ObjectProperty @1:9
│ ├─ StringLiteral "x" @1:9
│ ├─ StringLiteral "x" @1:11
│ └─ NumericLiteral 42 @1:14
├─ VariableDeclaration (var) @2:1
│ └─ VariableDeclarator @2:1

View file

@ -62,7 +62,7 @@ Program (script) @4:1
│ │ └─ BindingPattern (object)
│ │ └─ entry
│ │ └─ name
│ │ └─ Identifier "x" [variable:0] @32:26
│ │ └─ Identifier "x" [variable:0] @32:28
│ │ └─ default
│ │ └─ Identifier "shadow" (var) @32:34
│ └─ body

View file

@ -0,0 +1,14 @@
// Identifiers inside a binding pattern should carry their own start
// position. Previously they inherited the pattern's opening `[` or `{`
// position, which made source maps and devtools point at the bracket
// rather than the binding name.
let { foo, bar } = {};
let { x: aliased, y: also } = {};
let [ first, , third ] = [];
let { nested: { inner }, ...rest } = {};
let [ a, [ b, c ] ] = [];
function destructured({ p, q: r }, [ s, t ]) {
return p + r + s + t;
}