refactor(transformer): add an empty SPAN utility for creating AST nodes (#1067)

This commit is contained in:
Boshen 2023-10-26 18:43:53 +08:00 committed by GitHub
parent d8f1a7fce6
commit d9ba532ca6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 43 additions and 51 deletions

View file

@ -9,5 +9,5 @@ mod span;
pub use crate::{ pub use crate::{
atom::Atom, atom::Atom,
source_type::{Language, LanguageVariant, ModuleKind, SourceType, VALID_EXTENSIONS}, source_type::{Language, LanguageVariant, ModuleKind, SourceType, VALID_EXTENSIONS},
span::{GetSpan, Span}, span::{GetSpan, Span, SPAN},
}; };

View file

@ -4,6 +4,9 @@ use miette::{SourceOffset, SourceSpan};
#[cfg(feature = "serde")] #[cfg(feature = "serde")]
use serde::Serialize; use serde::Serialize;
/// An Empty span useful for creating AST nodes.
pub const SPAN: Span = Span::new(0, 0);
/// Newtype for working with text ranges /// Newtype for working with text ranges
/// ///
/// See the [`text-size`](https://docs.rs/text-size) crate for details. /// See the [`text-size`](https://docs.rs/text-size) crate for details.

View file

@ -1,7 +1,7 @@
use std::rc::Rc; use std::rc::Rc;
use oxc_ast::{ast::*, AstBuilder}; use oxc_ast::{ast::*, AstBuilder};
use oxc_span::Span; use oxc_span::SPAN;
use crate::options::{TransformOptions, TransformTarget}; use crate::options::{TransformOptions, TransformTarget};
@ -24,7 +24,7 @@ impl<'a> OptionalCatchBinding<'a> {
if clause.param.is_some() { if clause.param.is_some() {
return; return;
} }
let binding_identifier = BindingIdentifier::new(Span::default(), "_unused".into()); let binding_identifier = BindingIdentifier::new(SPAN, "_unused".into());
let binding_pattern_kind = self.ast.binding_pattern_identifier(binding_identifier); let binding_pattern_kind = self.ast.binding_pattern_identifier(binding_identifier);
let binding_pattern = self.ast.binding_pattern(binding_pattern_kind, None, false); let binding_pattern = self.ast.binding_pattern(binding_pattern_kind, None, false);
clause.param = Some(binding_pattern); clause.param = Some(binding_pattern);

View file

@ -3,7 +3,7 @@ use std::rc::Rc;
use oxc_allocator::Vec; use oxc_allocator::Vec;
use oxc_ast::{ast::*, AstBuilder}; use oxc_ast::{ast::*, AstBuilder};
use oxc_span::Span; use oxc_span::SPAN;
use oxc_syntax::operator::{AssignmentOperator, BinaryOperator, LogicalOperator}; use oxc_syntax::operator::{AssignmentOperator, BinaryOperator, LogicalOperator};
use crate::{ use crate::{
@ -66,7 +66,6 @@ impl<'a> NullishCoalescingOperator<'a> {
return; return;
} }
let span = Span::default();
let reference; let reference;
let assignment; let assignment;
@ -82,25 +81,25 @@ impl<'a> NullishCoalescingOperator<'a> {
); );
let right = self.ast.copy(&logical_expr.left); let right = self.ast.copy(&logical_expr.left);
assignment = assignment =
self.ast.assignment_expression(span, AssignmentOperator::Assign, left, right); self.ast.assignment_expression(SPAN, AssignmentOperator::Assign, left, right);
}; };
let test = if self.no_document_all { let test = if self.no_document_all {
let null = self.ast.literal_null_expression(NullLiteral::new(span)); let null = self.ast.literal_null_expression(NullLiteral::new(SPAN));
self.ast.binary_expression(span, assignment, BinaryOperator::Inequality, null) self.ast.binary_expression(SPAN, assignment, BinaryOperator::Inequality, null)
} else { } else {
let op = BinaryOperator::StrictInequality; let op = BinaryOperator::StrictInequality;
let null = self.ast.literal_null_expression(NullLiteral::new(span)); let null = self.ast.literal_null_expression(NullLiteral::new(SPAN));
let left = self.ast.binary_expression(span, self.ast.copy(&assignment), op, null); let left = self.ast.binary_expression(SPAN, self.ast.copy(&assignment), op, null);
let right = let right =
self.ast.binary_expression(span, self.ast.copy(&reference), op, self.ast.void_0()); self.ast.binary_expression(SPAN, self.ast.copy(&reference), op, self.ast.void_0());
self.ast.logical_expression(span, left, LogicalOperator::And, right) self.ast.logical_expression(SPAN, left, LogicalOperator::And, right)
}; };
let right = self.ast.move_expression(&mut logical_expr.right); let right = self.ast.move_expression(&mut logical_expr.right);
*expr = self.ast.conditional_expression(span, test, reference, right); *expr = self.ast.conditional_expression(SPAN, test, reference, right);
} }
} }

View file

@ -2,7 +2,7 @@ use std::rc::Rc;
use oxc_allocator::Vec; use oxc_allocator::Vec;
use oxc_ast::{ast::*, AstBuilder}; use oxc_ast::{ast::*, AstBuilder};
use oxc_span::Span; use oxc_span::SPAN;
use oxc_syntax::operator::{AssignmentOperator, LogicalOperator}; use oxc_syntax::operator::{AssignmentOperator, LogicalOperator};
use crate::{ use crate::{
@ -73,7 +73,6 @@ impl<'a> LogicalAssignmentOperators<'a> {
assign_target = self.ast.simple_assignment_target_identifier((*ident).clone()); assign_target = self.ast.simple_assignment_target_identifier((*ident).clone());
} }
SimpleAssignmentTarget::MemberAssignmentTarget(member_expr) => { SimpleAssignmentTarget::MemberAssignmentTarget(member_expr) => {
let span = Span::default();
let op = AssignmentOperator::Assign; let op = AssignmentOperator::Assign;
// `a.b &&= c` -> `var _a; (_a = a).b && (_a.b = c)` // `a.b &&= c` -> `var _a; (_a = a).b && (_a.b = c)`
@ -86,7 +85,7 @@ impl<'a> LogicalAssignmentOperators<'a> {
self.ast.simple_assignment_target_identifier(ident.clone()), self.ast.simple_assignment_target_identifier(ident.clone()),
); );
expr.object = expr.object =
self.ast.assignment_expression(span, op, target, right); self.ast.assignment_expression(SPAN, op, target, right);
left_expr = self.ast.member_expression( left_expr = self.ast.member_expression(
MemberExpression::StaticMemberExpression(expr), MemberExpression::StaticMemberExpression(expr),
); );
@ -122,7 +121,7 @@ impl<'a> LogicalAssignmentOperators<'a> {
self.ast.simple_assignment_target_identifier(ident.clone()), self.ast.simple_assignment_target_identifier(ident.clone()),
); );
expr.object = expr.object =
self.ast.assignment_expression(span, op, target, right); self.ast.assignment_expression(SPAN, op, target, right);
if let Some(property_ident) = &property_ident { if let Some(property_ident) = &property_ident {
let left = AssignmentTarget::SimpleAssignmentTarget( let left = AssignmentTarget::SimpleAssignmentTarget(
self.ast.simple_assignment_target_identifier( self.ast.simple_assignment_target_identifier(
@ -131,7 +130,7 @@ impl<'a> LogicalAssignmentOperators<'a> {
); );
let right = self.ast.copy(&computed_expr.expression); let right = self.ast.copy(&computed_expr.expression);
expr.expression = expr.expression =
self.ast.assignment_expression(span, op, left, right); self.ast.assignment_expression(SPAN, op, left, right);
} }
left_expr = self.ast.member_expression( left_expr = self.ast.member_expression(
MemberExpression::ComputedMemberExpression(expr), MemberExpression::ComputedMemberExpression(expr),
@ -167,7 +166,7 @@ impl<'a> LogicalAssignmentOperators<'a> {
); );
let right = self.ast.copy(&computed_expr.expression); let right = self.ast.copy(&computed_expr.expression);
expr.expression = expr.expression =
self.ast.assignment_expression(span, op, left, right); self.ast.assignment_expression(SPAN, op, left, right);
} }
left_expr = self.ast.member_expression( left_expr = self.ast.member_expression(
MemberExpression::ComputedMemberExpression(expr), MemberExpression::ComputedMemberExpression(expr),
@ -199,10 +198,9 @@ impl<'a> LogicalAssignmentOperators<'a> {
let assign_op = AssignmentOperator::Assign; let assign_op = AssignmentOperator::Assign;
let assign_target = AssignmentTarget::SimpleAssignmentTarget(assign_target); let assign_target = AssignmentTarget::SimpleAssignmentTarget(assign_target);
let right = self.ast.move_expression(&mut assignment_expr.right); let right = self.ast.move_expression(&mut assignment_expr.right);
let right = let right = self.ast.assignment_expression(SPAN, assign_op, assign_target, right);
self.ast.assignment_expression(Span::default(), assign_op, assign_target, right);
let logical_expr = self.ast.logical_expression(Span::default(), left_expr, operator, right); let logical_expr = self.ast.logical_expression(SPAN, left_expr, operator, right);
*expr = logical_expr; *expr = logical_expr;
} }

View file

@ -1,7 +1,7 @@
use std::{collections::HashSet, rc::Rc}; use std::{collections::HashSet, rc::Rc};
use oxc_ast::{ast::*, AstBuilder}; use oxc_ast::{ast::*, AstBuilder};
use oxc_span::{Atom, Span}; use oxc_span::{Atom, SPAN};
use crate::options::{TransformOptions, TransformTarget}; use crate::options::{TransformOptions, TransformTarget};
@ -38,13 +38,12 @@ impl<'a> ClassStaticBlock<'a> {
continue; continue;
}; };
let span = block.span;
let static_block_private_id = generate_uid(&private_names, &mut i); let static_block_private_id = generate_uid(&private_names, &mut i);
let key = PropertyKey::PrivateIdentifier(self.ast.alloc(PrivateIdentifier { let key =
span: Span::default(), PropertyKey::PrivateIdentifier(self.ast.alloc(PrivateIdentifier {
name: static_block_private_id.clone(), span: SPAN,
})); name: static_block_private_id.clone(),
}));
let value = match block.body.len() { let value = match block.body.len() {
0 => None, 0 => None,
@ -75,7 +74,7 @@ impl<'a> ClassStaticBlock<'a> {
} }
_ => { _ => {
let params = self.ast.formal_parameters( let params = self.ast.formal_parameters(
Span::default(), SPAN,
FormalParameterKind::ArrowFormalParameters, FormalParameterKind::ArrowFormalParameters,
self.ast.new_vec(), self.ast.new_vec(),
None, None,
@ -83,10 +82,10 @@ impl<'a> ClassStaticBlock<'a> {
let statements = self.ast.move_statement_vec(&mut block.body); let statements = self.ast.move_statement_vec(&mut block.body);
let function_body = let function_body =
self.ast.function_body(Span::default(), self.ast.new_vec(), statements); self.ast.function_body(SPAN, self.ast.new_vec(), statements);
let callee = self.ast.arrow_expression( let callee = self.ast.arrow_expression(
Span::default(), SPAN,
false, false,
false, false,
false, false,
@ -96,20 +95,15 @@ impl<'a> ClassStaticBlock<'a> {
None, None,
); );
let callee = self.ast.parenthesized_expression(Span::default(), callee); let callee = self.ast.parenthesized_expression(SPAN, callee);
let value = self.ast.call_expression( let value =
Span::default(), self.ast.call_expression(SPAN, callee, self.ast.new_vec(), false, None);
callee,
self.ast.new_vec(),
false,
None,
);
Some(value) Some(value)
} }
}; };
*element = self.ast.class_property(span, key, value, false, true, self.ast.new_vec()); *element = self.ast.class_property(SPAN, key, value, false, true, self.ast.new_vec());
} }
} }
} }

View file

@ -4,12 +4,10 @@ use std::rc::Rc;
use oxc_allocator::Vec; use oxc_allocator::Vec;
use oxc_ast::{ast::*, AstBuilder}; use oxc_ast::{ast::*, AstBuilder};
use oxc_span::Span; use oxc_span::SPAN;
pub use self::options::{ReactJsxOptions, ReactJsxRuntime}; pub use self::options::{ReactJsxOptions, ReactJsxRuntime};
const SPAN: Span = Span::new(0, 0);
/// Transform React JSX /// Transform React JSX
/// ///
/// References: /// References:

View file

@ -1,5 +1,5 @@
use oxc_ast::{ast::*, AstBuilder}; use oxc_ast::{ast::*, AstBuilder};
use oxc_span::{Atom, Span}; use oxc_span::{Atom, SPAN};
use std::rc::Rc; use std::rc::Rc;
@ -57,15 +57,15 @@ impl<'a> RegexpFlags<'a> {
if regex.flags.intersection(self.transform_flags).is_empty() { if regex.flags.intersection(self.transform_flags).is_empty() {
return; return;
} }
let ident = IdentifierReference::new(Span::default(), Atom::from("RegExp")); let ident = IdentifierReference::new(SPAN, Atom::from("RegExp"));
let callee = self.ast.identifier_reference_expression(ident); let callee = self.ast.identifier_reference_expression(ident);
let pattern = StringLiteral::new(Span::default(), Atom::from(regex.pattern.as_str())); let pattern = StringLiteral::new(SPAN, Atom::from(regex.pattern.as_str()));
let flags = StringLiteral::new(Span::default(), Atom::from(regex.flags.to_string())); let flags = StringLiteral::new(SPAN, Atom::from(regex.flags.to_string()));
let pattern_literal = self.ast.literal_string_expression(pattern); let pattern_literal = self.ast.literal_string_expression(pattern);
let flags_literal = self.ast.literal_string_expression(flags); let flags_literal = self.ast.literal_string_expression(flags);
let mut arguments = self.ast.new_vec_with_capacity(2); let mut arguments = self.ast.new_vec_with_capacity(2);
arguments.push(Argument::Expression(pattern_literal)); arguments.push(Argument::Expression(pattern_literal));
arguments.push(Argument::Expression(flags_literal)); arguments.push(Argument::Expression(flags_literal));
*expr = self.ast.new_expression(Span::default(), callee, arguments, None); *expr = self.ast.new_expression(SPAN, callee, arguments, None);
} }
} }

View file

@ -1,5 +1,5 @@
use oxc_ast::{ast::*, AstBuilder}; use oxc_ast::{ast::*, AstBuilder};
use oxc_span::{Atom, Span}; use oxc_span::{Atom, SPAN};
use std::rc::Rc; use std::rc::Rc;
@ -116,7 +116,7 @@ impl<'a> TypeScript<'a> {
&& !program.body.iter().any(|s| matches!(s, Statement::ModuleDeclaration(_))) && !program.body.iter().any(|s| matches!(s, Statement::ModuleDeclaration(_)))
{ {
let empty_export = self.ast.export_named_declaration( let empty_export = self.ast.export_named_declaration(
Span::default(), SPAN,
None, None,
self.ast.new_vec(), self.ast.new_vec(),
None, None,