mirror of
https://github.com/danbulant/oxc
synced 2026-05-21 13:18:59 +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::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(),
|
||||||
|
|
|
||||||
|
|
@ -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(),
|
||||||
|
|
|
||||||
|
|
@ -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]
|
||||||
|
|
|
||||||
|
|
@ -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]
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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",
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue