mirror of
https://github.com/danbulant/oxc
synced 2026-05-24 12:21:58 +00:00
feat(ast_lower): mark assignment target identifiers as ReferenceFlag::Write
closes #465
This commit is contained in:
parent
925cee20c1
commit
d7f9ca13bc
1 changed files with 25 additions and 19 deletions
|
|
@ -44,8 +44,13 @@ impl<'a> AstLower<'a> {
|
|||
self.semantic.declare_symbol(span, name, includes, excludes)
|
||||
}
|
||||
|
||||
pub fn enter_identifier_reference(&mut self, span: Span, name: &Atom) -> ReferenceId {
|
||||
let reference = Reference::new(span, name.clone(), ReferenceFlag::read());
|
||||
pub fn enter_identifier_reference(
|
||||
&mut self,
|
||||
span: Span,
|
||||
name: &Atom,
|
||||
reference_flag: ReferenceFlag,
|
||||
) -> ReferenceId {
|
||||
let reference = Reference::new(span, name.clone(), reference_flag);
|
||||
self.semantic.declare_reference(reference)
|
||||
}
|
||||
|
||||
|
|
@ -397,7 +402,7 @@ impl<'a> AstLower<'a> {
|
|||
self.hir.literal_template_expression(lit)
|
||||
}
|
||||
ast::Expression::Identifier(ident) => {
|
||||
let lit = self.lower_identifier_reference(ident);
|
||||
let lit = self.lower_identifier_reference(ident, ReferenceFlag::Read);
|
||||
self.hir.identifier_reference_expression(lit)
|
||||
}
|
||||
ast::Expression::MetaProperty(meta) => self.lower_meta_property(meta),
|
||||
|
|
@ -437,18 +442,18 @@ impl<'a> AstLower<'a> {
|
|||
ast::Expression::Super(expr) => self.lower_super(expr),
|
||||
ast::Expression::JSXElement(elem) => {
|
||||
// TODO: implement JSX
|
||||
let ident = self.lower_identifier_reference(&ast::IdentifierReference {
|
||||
span: elem.span,
|
||||
name: "undefined".into(),
|
||||
});
|
||||
let ident = self.lower_identifier_reference(
|
||||
&ast::IdentifierReference { span: elem.span, name: "undefined".into() },
|
||||
ReferenceFlag::Read,
|
||||
);
|
||||
self.hir.identifier_reference_expression(ident)
|
||||
}
|
||||
ast::Expression::JSXFragment(elem) => {
|
||||
// TODO: implement JSX
|
||||
let ident = self.lower_identifier_reference(&ast::IdentifierReference {
|
||||
span: elem.span,
|
||||
name: "undefined".into(),
|
||||
});
|
||||
let ident = self.lower_identifier_reference(
|
||||
&ast::IdentifierReference { span: elem.span, name: "undefined".into() },
|
||||
ReferenceFlag::Read,
|
||||
);
|
||||
self.hir.identifier_reference_expression(ident)
|
||||
}
|
||||
// Syntax trimmed for the following expressions
|
||||
|
|
@ -802,7 +807,7 @@ impl<'a> AstLower<'a> {
|
|||
) -> hir::SimpleAssignmentTarget<'a> {
|
||||
match target {
|
||||
ast::SimpleAssignmentTarget::AssignmentTargetIdentifier(ident) => {
|
||||
let ident = self.lower_identifier_reference(ident);
|
||||
let ident = self.lower_identifier_reference(ident, ReferenceFlag::Write);
|
||||
self.hir.assignment_target_identifier(ident)
|
||||
}
|
||||
ast::SimpleAssignmentTarget::MemberAssignmentTarget(member_expr) => {
|
||||
|
|
@ -830,7 +835,7 @@ impl<'a> AstLower<'a> {
|
|||
) -> hir::SimpleAssignmentTarget<'a> {
|
||||
match expr {
|
||||
ast::Expression::Identifier(ident) => {
|
||||
let ident = self.lower_identifier_reference(ident);
|
||||
let ident = self.lower_identifier_reference(ident, ReferenceFlag::Write);
|
||||
self.hir.assignment_target_identifier(ident)
|
||||
}
|
||||
ast::Expression::MemberExpression(member_expr) => {
|
||||
|
|
@ -839,10 +844,10 @@ impl<'a> AstLower<'a> {
|
|||
}
|
||||
expr => {
|
||||
// return undefined because this is invalid syntax
|
||||
let ident = self.lower_identifier_reference(&ast::IdentifierReference {
|
||||
span: expr.span(),
|
||||
name: "undefined".into(),
|
||||
});
|
||||
let ident = self.lower_identifier_reference(
|
||||
&ast::IdentifierReference { span: expr.span(), name: "undefined".into() },
|
||||
ReferenceFlag::Write,
|
||||
);
|
||||
self.hir.assignment_target_identifier(ident)
|
||||
}
|
||||
}
|
||||
|
|
@ -931,7 +936,7 @@ impl<'a> AstLower<'a> {
|
|||
&mut self,
|
||||
ident: &ast::AssignmentTargetPropertyIdentifier<'a>,
|
||||
) -> Box<'a, hir::AssignmentTargetPropertyIdentifier<'a>> {
|
||||
let binding = self.lower_identifier_reference(&ident.binding);
|
||||
let binding = self.lower_identifier_reference(&ident.binding, ReferenceFlag::Write);
|
||||
let init = ident.init.as_ref().map(|expr| self.lower_expression(expr));
|
||||
self.hir.assignment_target_property_identifier(ident.span, binding, init)
|
||||
}
|
||||
|
|
@ -1083,8 +1088,9 @@ impl<'a> AstLower<'a> {
|
|||
fn lower_identifier_reference(
|
||||
&mut self,
|
||||
ident: &ast::IdentifierReference,
|
||||
reference_flag: ReferenceFlag,
|
||||
) -> hir::IdentifierReference {
|
||||
let reference_id = self.enter_identifier_reference(ident.span, &ident.name);
|
||||
let reference_id = self.enter_identifier_reference(ident.span, &ident.name, reference_flag);
|
||||
self.hir.identifier_reference(ident.span, ident.name.clone(), reference_id)
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue