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:
parent
cec0be6f3d
commit
30394ece8d
43 changed files with 271 additions and 208 deletions
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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 }
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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()));
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
95
Tests/LibJS/AST/expected/binding-pattern-positions.txt
Normal file
95
Tests/LibJS/AST/expected/binding-pattern-positions.txt
Normal 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
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
14
Tests/LibJS/AST/input/binding-pattern-positions.js
Normal file
14
Tests/LibJS/AST/input/binding-pattern-positions.js
Normal 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;
|
||||
}
|
||||
Loading…
Reference in a new issue