mirror of
https://github.com/danbulant/oxc
synced 2026-05-19 20:28:58 +00:00
feat(ast): add AstKind::AssignmentTargetPattern, AstKind::ArrayAssignmentTarget and AstKind::ObjectAssignmentTarget (#4456)
close: #4435
This commit is contained in:
parent
e3b0c4066a
commit
aaee07e170
9 changed files with 51 additions and 16 deletions
|
|
@ -261,6 +261,9 @@ impl<'a> AstKind<'a> {
|
|||
Self::ArrayExpressionElement(_) => "ArrayExpressionElement".into(),
|
||||
Self::AssignmentTarget(_) => "AssignmentTarget".into(),
|
||||
Self::SimpleAssignmentTarget(_) => "SimpleAssignmentTarget".into(),
|
||||
Self::AssignmentTargetPattern(_) => "AssignmentTargetPattern".into(),
|
||||
Self::ArrayAssignmentTarget(_) => "ArrayAssignmentTarget".into(),
|
||||
Self::ObjectAssignmentTarget(_) => "ObjectAssignmentTarget".into(),
|
||||
Self::AssignmentTargetWithDefault(_) => "AssignmentTargetWithDefault".into(),
|
||||
Self::SpreadElement(_) => "SpreadElement".into(),
|
||||
Self::Elision(_) => "Elision".into(),
|
||||
|
|
|
|||
|
|
@ -41,6 +41,9 @@ pub enum AstType {
|
|||
AssignmentExpression,
|
||||
AssignmentTarget,
|
||||
SimpleAssignmentTarget,
|
||||
AssignmentTargetPattern,
|
||||
ArrayAssignmentTarget,
|
||||
ObjectAssignmentTarget,
|
||||
AssignmentTargetWithDefault,
|
||||
SequenceExpression,
|
||||
Super,
|
||||
|
|
@ -211,6 +214,9 @@ pub enum AstKind<'a> {
|
|||
AssignmentExpression(&'a AssignmentExpression<'a>),
|
||||
AssignmentTarget(&'a AssignmentTarget<'a>),
|
||||
SimpleAssignmentTarget(&'a SimpleAssignmentTarget<'a>),
|
||||
AssignmentTargetPattern(&'a AssignmentTargetPattern<'a>),
|
||||
ArrayAssignmentTarget(&'a ArrayAssignmentTarget<'a>),
|
||||
ObjectAssignmentTarget(&'a ObjectAssignmentTarget<'a>),
|
||||
AssignmentTargetWithDefault(&'a AssignmentTargetWithDefault<'a>),
|
||||
SequenceExpression(&'a SequenceExpression<'a>),
|
||||
Super(&'a Super),
|
||||
|
|
@ -382,6 +388,9 @@ impl<'a> GetSpan for AstKind<'a> {
|
|||
Self::AssignmentExpression(it) => it.span(),
|
||||
Self::AssignmentTarget(it) => it.span(),
|
||||
Self::SimpleAssignmentTarget(it) => it.span(),
|
||||
Self::AssignmentTargetPattern(it) => it.span(),
|
||||
Self::ArrayAssignmentTarget(it) => it.span(),
|
||||
Self::ObjectAssignmentTarget(it) => it.span(),
|
||||
Self::AssignmentTargetWithDefault(it) => it.span(),
|
||||
Self::SequenceExpression(it) => it.span(),
|
||||
Self::Super(it) => it.span(),
|
||||
|
|
|
|||
|
|
@ -2750,6 +2750,8 @@ pub mod walk {
|
|||
visitor: &mut V,
|
||||
it: &AssignmentTargetPattern<'a>,
|
||||
) {
|
||||
let kind = AstKind::AssignmentTargetPattern(visitor.alloc(it));
|
||||
visitor.enter_node(kind);
|
||||
match it {
|
||||
AssignmentTargetPattern::ArrayAssignmentTarget(it) => {
|
||||
visitor.visit_array_assignment_target(it)
|
||||
|
|
@ -2758,6 +2760,7 @@ pub mod walk {
|
|||
visitor.visit_object_assignment_target(it)
|
||||
}
|
||||
}
|
||||
visitor.leave_node(kind);
|
||||
}
|
||||
|
||||
#[inline]
|
||||
|
|
@ -2765,13 +2768,15 @@ pub mod walk {
|
|||
visitor: &mut V,
|
||||
it: &ArrayAssignmentTarget<'a>,
|
||||
) {
|
||||
// NOTE: AstKind doesn't exists!
|
||||
let kind = AstKind::ArrayAssignmentTarget(visitor.alloc(it));
|
||||
visitor.enter_node(kind);
|
||||
for elements in it.elements.iter().flatten() {
|
||||
visitor.visit_assignment_target_maybe_default(elements);
|
||||
}
|
||||
if let Some(rest) = &it.rest {
|
||||
visitor.visit_assignment_target_rest(rest);
|
||||
}
|
||||
visitor.leave_node(kind);
|
||||
}
|
||||
|
||||
#[inline]
|
||||
|
|
@ -2815,11 +2820,13 @@ pub mod walk {
|
|||
visitor: &mut V,
|
||||
it: &ObjectAssignmentTarget<'a>,
|
||||
) {
|
||||
// NOTE: AstKind doesn't exists!
|
||||
let kind = AstKind::ObjectAssignmentTarget(visitor.alloc(it));
|
||||
visitor.enter_node(kind);
|
||||
visitor.visit_assignment_target_properties(&it.properties);
|
||||
if let Some(rest) = &it.rest {
|
||||
visitor.visit_assignment_target_rest(rest);
|
||||
}
|
||||
visitor.leave_node(kind);
|
||||
}
|
||||
|
||||
#[inline]
|
||||
|
|
|
|||
|
|
@ -2868,6 +2868,8 @@ pub mod walk_mut {
|
|||
visitor: &mut V,
|
||||
it: &mut AssignmentTargetPattern<'a>,
|
||||
) {
|
||||
let kind = AstType::AssignmentTargetPattern;
|
||||
visitor.enter_node(kind);
|
||||
match it {
|
||||
AssignmentTargetPattern::ArrayAssignmentTarget(it) => {
|
||||
visitor.visit_array_assignment_target(it)
|
||||
|
|
@ -2876,6 +2878,7 @@ pub mod walk_mut {
|
|||
visitor.visit_object_assignment_target(it)
|
||||
}
|
||||
}
|
||||
visitor.leave_node(kind);
|
||||
}
|
||||
|
||||
#[inline]
|
||||
|
|
@ -2883,13 +2886,15 @@ pub mod walk_mut {
|
|||
visitor: &mut V,
|
||||
it: &mut ArrayAssignmentTarget<'a>,
|
||||
) {
|
||||
// NOTE: AstType doesn't exists!
|
||||
let kind = AstType::ArrayAssignmentTarget;
|
||||
visitor.enter_node(kind);
|
||||
for elements in it.elements.iter_mut().flatten() {
|
||||
visitor.visit_assignment_target_maybe_default(elements);
|
||||
}
|
||||
if let Some(rest) = &mut it.rest {
|
||||
visitor.visit_assignment_target_rest(rest);
|
||||
}
|
||||
visitor.leave_node(kind);
|
||||
}
|
||||
|
||||
#[inline]
|
||||
|
|
@ -2933,11 +2938,13 @@ pub mod walk_mut {
|
|||
visitor: &mut V,
|
||||
it: &mut ObjectAssignmentTarget<'a>,
|
||||
) {
|
||||
// NOTE: AstType doesn't exists!
|
||||
let kind = AstType::ObjectAssignmentTarget;
|
||||
visitor.enter_node(kind);
|
||||
visitor.visit_assignment_target_properties(&mut it.properties);
|
||||
if let Some(rest) = &mut it.rest {
|
||||
visitor.visit_assignment_target_rest(rest);
|
||||
}
|
||||
visitor.leave_node(kind);
|
||||
}
|
||||
|
||||
#[inline]
|
||||
|
|
|
|||
|
|
@ -129,7 +129,9 @@ fn is_read(current_node_id: AstNodeId, nodes: &AstNodes) -> bool {
|
|||
AstKind::ForInStatement(_)
|
||||
| AstKind::ForOfStatement(_)
|
||||
| AstKind::AssignmentTargetWithDefault(_)
|
||||
| AstKind::AssignmentTarget(_),
|
||||
| AstKind::AssignmentTarget(_)
|
||||
| AstKind::ObjectAssignmentTarget(_)
|
||||
| AstKind::ArrayAssignmentTarget(_),
|
||||
)
|
||||
| (AstKind::SimpleAssignmentTarget(_), AstKind::AssignmentExpression(_)) => {
|
||||
return false;
|
||||
|
|
|
|||
|
|
@ -67,7 +67,12 @@ impl Rule for PreferDomNodeTextContent {
|
|||
if identifier.name == "innerText"
|
||||
&& matches!(parent_node_kind, AstKind::PropertyKey(_))
|
||||
&& (matches!(grand_parent_node_kind, AstKind::ObjectPattern(_))
|
||||
|| matches!(grand_parent_node_kind, AstKind::AssignmentTarget(_)))
|
||||
|| matches!(
|
||||
grand_parent_node_kind,
|
||||
AstKind::ObjectAssignmentTarget(_)
|
||||
| AstKind::SimpleAssignmentTarget(_)
|
||||
| AstKind::AssignmentTarget(_)
|
||||
))
|
||||
{
|
||||
ctx.diagnostic(prefer_dom_node_text_content_diagnostic(identifier.span));
|
||||
return;
|
||||
|
|
@ -77,8 +82,13 @@ impl Rule for PreferDomNodeTextContent {
|
|||
// `({innerText} = node)`
|
||||
if let AstKind::IdentifierReference(identifier_ref) = node.kind() {
|
||||
if identifier_ref.name == "innerText"
|
||||
&& matches!(parent_node_kind, AstKind::AssignmentTarget(_))
|
||||
&& matches!(grand_parent_node_kind, AstKind::AssignmentExpression(_))
|
||||
&& matches!(
|
||||
parent_node_kind,
|
||||
AstKind::ObjectAssignmentTarget(_)
|
||||
| AstKind::AssignmentTarget(_)
|
||||
| AstKind::SimpleAssignmentTarget(_)
|
||||
)
|
||||
&& matches!(grand_parent_node_kind, AstKind::AssignmentTargetPattern(_))
|
||||
{
|
||||
ctx.diagnostic(prefer_dom_node_text_content_diagnostic(identifier_ref.span));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@ input_file: crates/oxc_semantic/tests/fixtures/typescript-eslint/destructuring/a
|
|||
"flag": "ReferenceFlag(Read)",
|
||||
"id": 0,
|
||||
"name": "obj",
|
||||
"node_id": 16
|
||||
"node_id": 18
|
||||
}
|
||||
]
|
||||
},
|
||||
|
|
@ -33,7 +33,7 @@ input_file: crates/oxc_semantic/tests/fixtures/typescript-eslint/destructuring/a
|
|||
"flag": "ReferenceFlag(Write)",
|
||||
"id": 1,
|
||||
"name": "b",
|
||||
"node_id": 20
|
||||
"node_id": 22
|
||||
}
|
||||
]
|
||||
},
|
||||
|
|
@ -47,7 +47,7 @@ input_file: crates/oxc_semantic/tests/fixtures/typescript-eslint/destructuring/a
|
|||
"flag": "ReferenceFlag(Write)",
|
||||
"id": 2,
|
||||
"name": "c",
|
||||
"node_id": 24
|
||||
"node_id": 28
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@ input_file: crates/oxc_semantic/tests/fixtures/typescript-eslint/destructuring/o
|
|||
"flag": "ReferenceFlag(Read)",
|
||||
"id": 2,
|
||||
"name": "obj",
|
||||
"node_id": 23
|
||||
"node_id": 27
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -11,16 +11,13 @@ use super::generated_header;
|
|||
|
||||
pub struct AstKindGenerator;
|
||||
|
||||
pub const BLACK_LIST: [&str; 65] = [
|
||||
pub const BLACK_LIST: [&str; 62] = [
|
||||
"Expression",
|
||||
"ObjectPropertyKind",
|
||||
"TemplateElement",
|
||||
"ComputedMemberExpression",
|
||||
"StaticMemberExpression",
|
||||
"PrivateFieldExpression",
|
||||
"AssignmentTargetPattern",
|
||||
"ArrayAssignmentTarget",
|
||||
"ObjectAssignmentTarget",
|
||||
"AssignmentTargetRest",
|
||||
"AssignmentTargetMaybeDefault",
|
||||
"AssignmentTargetProperty",
|
||||
|
|
|
|||
Loading…
Reference in a new issue