feat(ast): add AstKind::AssignmentTargetPattern, AstKind::ArrayAssignmentTarget and AstKind::ObjectAssignmentTarget (#4456)

close: #4435
This commit is contained in:
Dunqing 2024-07-25 09:32:33 +00:00
parent e3b0c4066a
commit aaee07e170
9 changed files with 51 additions and 16 deletions

View file

@ -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(),

View file

@ -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(),

View file

@ -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]

View file

@ -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]

View file

@ -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;

View file

@ -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));
}

View file

@ -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
}
]
}

View file

@ -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
}
]
}

View file

@ -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",