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::ArrayExpressionElement(_) => "ArrayExpressionElement".into(),
Self::AssignmentTarget(_) => "AssignmentTarget".into(), Self::AssignmentTarget(_) => "AssignmentTarget".into(),
Self::SimpleAssignmentTarget(_) => "SimpleAssignmentTarget".into(), Self::SimpleAssignmentTarget(_) => "SimpleAssignmentTarget".into(),
Self::AssignmentTargetPattern(_) => "AssignmentTargetPattern".into(),
Self::ArrayAssignmentTarget(_) => "ArrayAssignmentTarget".into(),
Self::ObjectAssignmentTarget(_) => "ObjectAssignmentTarget".into(),
Self::AssignmentTargetWithDefault(_) => "AssignmentTargetWithDefault".into(), Self::AssignmentTargetWithDefault(_) => "AssignmentTargetWithDefault".into(),
Self::SpreadElement(_) => "SpreadElement".into(), Self::SpreadElement(_) => "SpreadElement".into(),
Self::Elision(_) => "Elision".into(), Self::Elision(_) => "Elision".into(),

View file

@ -41,6 +41,9 @@ pub enum AstType {
AssignmentExpression, AssignmentExpression,
AssignmentTarget, AssignmentTarget,
SimpleAssignmentTarget, SimpleAssignmentTarget,
AssignmentTargetPattern,
ArrayAssignmentTarget,
ObjectAssignmentTarget,
AssignmentTargetWithDefault, AssignmentTargetWithDefault,
SequenceExpression, SequenceExpression,
Super, Super,
@ -211,6 +214,9 @@ pub enum AstKind<'a> {
AssignmentExpression(&'a AssignmentExpression<'a>), AssignmentExpression(&'a AssignmentExpression<'a>),
AssignmentTarget(&'a AssignmentTarget<'a>), AssignmentTarget(&'a AssignmentTarget<'a>),
SimpleAssignmentTarget(&'a SimpleAssignmentTarget<'a>), SimpleAssignmentTarget(&'a SimpleAssignmentTarget<'a>),
AssignmentTargetPattern(&'a AssignmentTargetPattern<'a>),
ArrayAssignmentTarget(&'a ArrayAssignmentTarget<'a>),
ObjectAssignmentTarget(&'a ObjectAssignmentTarget<'a>),
AssignmentTargetWithDefault(&'a AssignmentTargetWithDefault<'a>), AssignmentTargetWithDefault(&'a AssignmentTargetWithDefault<'a>),
SequenceExpression(&'a SequenceExpression<'a>), SequenceExpression(&'a SequenceExpression<'a>),
Super(&'a Super), Super(&'a Super),
@ -382,6 +388,9 @@ impl<'a> GetSpan for AstKind<'a> {
Self::AssignmentExpression(it) => it.span(), Self::AssignmentExpression(it) => it.span(),
Self::AssignmentTarget(it) => it.span(), Self::AssignmentTarget(it) => it.span(),
Self::SimpleAssignmentTarget(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::AssignmentTargetWithDefault(it) => it.span(),
Self::SequenceExpression(it) => it.span(), Self::SequenceExpression(it) => it.span(),
Self::Super(it) => it.span(), Self::Super(it) => it.span(),

View file

@ -2750,6 +2750,8 @@ pub mod walk {
visitor: &mut V, visitor: &mut V,
it: &AssignmentTargetPattern<'a>, it: &AssignmentTargetPattern<'a>,
) { ) {
let kind = AstKind::AssignmentTargetPattern(visitor.alloc(it));
visitor.enter_node(kind);
match it { match it {
AssignmentTargetPattern::ArrayAssignmentTarget(it) => { AssignmentTargetPattern::ArrayAssignmentTarget(it) => {
visitor.visit_array_assignment_target(it) visitor.visit_array_assignment_target(it)
@ -2758,6 +2760,7 @@ pub mod walk {
visitor.visit_object_assignment_target(it) visitor.visit_object_assignment_target(it)
} }
} }
visitor.leave_node(kind);
} }
#[inline] #[inline]
@ -2765,13 +2768,15 @@ pub mod walk {
visitor: &mut V, visitor: &mut V,
it: &ArrayAssignmentTarget<'a>, 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() { for elements in it.elements.iter().flatten() {
visitor.visit_assignment_target_maybe_default(elements); visitor.visit_assignment_target_maybe_default(elements);
} }
if let Some(rest) = &it.rest { if let Some(rest) = &it.rest {
visitor.visit_assignment_target_rest(rest); visitor.visit_assignment_target_rest(rest);
} }
visitor.leave_node(kind);
} }
#[inline] #[inline]
@ -2815,11 +2820,13 @@ pub mod walk {
visitor: &mut V, visitor: &mut V,
it: &ObjectAssignmentTarget<'a>, 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); visitor.visit_assignment_target_properties(&it.properties);
if let Some(rest) = &it.rest { if let Some(rest) = &it.rest {
visitor.visit_assignment_target_rest(rest); visitor.visit_assignment_target_rest(rest);
} }
visitor.leave_node(kind);
} }
#[inline] #[inline]

View file

@ -2868,6 +2868,8 @@ pub mod walk_mut {
visitor: &mut V, visitor: &mut V,
it: &mut AssignmentTargetPattern<'a>, it: &mut AssignmentTargetPattern<'a>,
) { ) {
let kind = AstType::AssignmentTargetPattern;
visitor.enter_node(kind);
match it { match it {
AssignmentTargetPattern::ArrayAssignmentTarget(it) => { AssignmentTargetPattern::ArrayAssignmentTarget(it) => {
visitor.visit_array_assignment_target(it) visitor.visit_array_assignment_target(it)
@ -2876,6 +2878,7 @@ pub mod walk_mut {
visitor.visit_object_assignment_target(it) visitor.visit_object_assignment_target(it)
} }
} }
visitor.leave_node(kind);
} }
#[inline] #[inline]
@ -2883,13 +2886,15 @@ pub mod walk_mut {
visitor: &mut V, visitor: &mut V,
it: &mut ArrayAssignmentTarget<'a>, 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() { for elements in it.elements.iter_mut().flatten() {
visitor.visit_assignment_target_maybe_default(elements); visitor.visit_assignment_target_maybe_default(elements);
} }
if let Some(rest) = &mut it.rest { if let Some(rest) = &mut it.rest {
visitor.visit_assignment_target_rest(rest); visitor.visit_assignment_target_rest(rest);
} }
visitor.leave_node(kind);
} }
#[inline] #[inline]
@ -2933,11 +2938,13 @@ pub mod walk_mut {
visitor: &mut V, visitor: &mut V,
it: &mut ObjectAssignmentTarget<'a>, 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); visitor.visit_assignment_target_properties(&mut it.properties);
if let Some(rest) = &mut it.rest { if let Some(rest) = &mut it.rest {
visitor.visit_assignment_target_rest(rest); visitor.visit_assignment_target_rest(rest);
} }
visitor.leave_node(kind);
} }
#[inline] #[inline]

View file

@ -129,7 +129,9 @@ fn is_read(current_node_id: AstNodeId, nodes: &AstNodes) -> bool {
AstKind::ForInStatement(_) AstKind::ForInStatement(_)
| AstKind::ForOfStatement(_) | AstKind::ForOfStatement(_)
| AstKind::AssignmentTargetWithDefault(_) | AstKind::AssignmentTargetWithDefault(_)
| AstKind::AssignmentTarget(_), | AstKind::AssignmentTarget(_)
| AstKind::ObjectAssignmentTarget(_)
| AstKind::ArrayAssignmentTarget(_),
) )
| (AstKind::SimpleAssignmentTarget(_), AstKind::AssignmentExpression(_)) => { | (AstKind::SimpleAssignmentTarget(_), AstKind::AssignmentExpression(_)) => {
return false; return false;

View file

@ -67,7 +67,12 @@ impl Rule for PreferDomNodeTextContent {
if identifier.name == "innerText" if identifier.name == "innerText"
&& matches!(parent_node_kind, AstKind::PropertyKey(_)) && matches!(parent_node_kind, AstKind::PropertyKey(_))
&& (matches!(grand_parent_node_kind, AstKind::ObjectPattern(_)) && (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)); ctx.diagnostic(prefer_dom_node_text_content_diagnostic(identifier.span));
return; return;
@ -77,8 +82,13 @@ impl Rule for PreferDomNodeTextContent {
// `({innerText} = node)` // `({innerText} = node)`
if let AstKind::IdentifierReference(identifier_ref) = node.kind() { if let AstKind::IdentifierReference(identifier_ref) = node.kind() {
if identifier_ref.name == "innerText" if identifier_ref.name == "innerText"
&& matches!(parent_node_kind, AstKind::AssignmentTarget(_)) && matches!(
&& matches!(grand_parent_node_kind, AstKind::AssignmentExpression(_)) 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)); 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)", "flag": "ReferenceFlag(Read)",
"id": 0, "id": 0,
"name": "obj", "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)", "flag": "ReferenceFlag(Write)",
"id": 1, "id": 1,
"name": "b", "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)", "flag": "ReferenceFlag(Write)",
"id": 2, "id": 2,
"name": "c", "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)", "flag": "ReferenceFlag(Read)",
"id": 2, "id": 2,
"name": "obj", "name": "obj",
"node_id": 23 "node_id": 27
} }
] ]
} }

View file

@ -11,16 +11,13 @@ use super::generated_header;
pub struct AstKindGenerator; pub struct AstKindGenerator;
pub const BLACK_LIST: [&str; 65] = [ pub const BLACK_LIST: [&str; 62] = [
"Expression", "Expression",
"ObjectPropertyKind", "ObjectPropertyKind",
"TemplateElement", "TemplateElement",
"ComputedMemberExpression", "ComputedMemberExpression",
"StaticMemberExpression", "StaticMemberExpression",
"PrivateFieldExpression", "PrivateFieldExpression",
"AssignmentTargetPattern",
"ArrayAssignmentTarget",
"ObjectAssignmentTarget",
"AssignmentTargetRest", "AssignmentTargetRest",
"AssignmentTargetMaybeDefault", "AssignmentTargetMaybeDefault",
"AssignmentTargetProperty", "AssignmentTargetProperty",