Skip to content

Commit

Permalink
fix: use simple import for require
Browse files Browse the repository at this point in the history
  • Loading branch information
magic-akari committed Apr 1, 2023
1 parent f10cc09 commit 9edce72
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 77 deletions.
92 changes: 20 additions & 72 deletions crates/swc_ecma_transforms_base/src/helpers/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,9 @@ use std::{
use once_cell::sync::Lazy;
use rustc_hash::FxHashMap;
use swc_atoms::JsWord;
use swc_common::{
collections::AHashSet, util::take::Take, FileName, FilePathMapping, Mark, SourceMap,
SyntaxContext, DUMMY_SP,
};
use swc_common::{FileName, FilePathMapping, Mark, SourceMap, SyntaxContext, DUMMY_SP};
use swc_ecma_ast::*;
use swc_ecma_utils::{prepend_stmts, DropSpan, ExprFactory, IntoIndirectCall};
use swc_ecma_utils::{prepend_stmts, quote_ident, DropSpan, ExprFactory};
use swc_ecma_visit::{as_folder, noop_visit_mut_type, Fold, VisitMut, VisitMutWith};

#[macro_export]
Expand Down Expand Up @@ -208,23 +205,19 @@ macro_rules! define_helpers {
buf
}

fn build_requires(&self) ->(Vec<Stmt>, AHashSet::<Id>){
fn build_requires(&self) -> Vec<Stmt>{
let mut buf = vec![];
let mut id_set: AHashSet<Id> = Default::default();

HELPERS.with(|helpers|{
debug_assert!(helpers.external);
$(
let enable = helpers.inner.$name.load(Ordering::Relaxed);
if enable {
buf.push(self.build_reqire(stringify!($name), helpers.mark.0));
id_set.insert((concat!("_", stringify!($name)).into(), SyntaxContext::empty().apply_mark(helpers.mark.0)));
buf.push(self.build_reqire(stringify!($name), helpers.mark.0))
}
// add_require_to!(buf, $name, helpers.inner.$name, helpers.mark.0, self.global_mark);
)*
});

(buf, id_set)
buf
}
}
};
Expand Down Expand Up @@ -388,15 +381,11 @@ define_helpers!(Helpers {
});

pub fn inject_helpers(global_mark: Mark) -> impl Fold + VisitMut {
as_folder(InjectHelpers {
global_mark,
helper_id_set: Default::default(),
})
as_folder(InjectHelpers { global_mark })
}

struct InjectHelpers {
global_mark: Mark,
helper_id_set: AHashSet<Id>,
}

impl InjectHelpers {
Expand All @@ -416,17 +405,17 @@ impl InjectHelpers {
}
}

fn make_helpers_for_script(&self) -> (Vec<Stmt>, AHashSet<Id>) {
fn make_helpers_for_script(&self) -> Vec<Stmt> {
let external = HELPERS.with(|helper| helper.external());

if external {
if self.is_helper_used() {
self.build_requires()
} else {
Default::default()
vec![]
}
} else {
(self.build_helpers(), Default::default())
self.build_helpers()
}
}

Expand All @@ -447,6 +436,7 @@ impl InjectHelpers {
.as_arg()],
type_args: None,
};
let ident = Ident::new(format!("_{}", name).into(), DUMMY_SP.apply_mark(mark));
let decl = Decl::Var(
VarDecl {
span: DUMMY_SP,
Expand All @@ -455,29 +445,23 @@ impl InjectHelpers {
decls: vec![VarDeclarator {
span: DUMMY_SP,
name: Pat::Ident(
Ident::new(format!("_{}", name).into(), DUMMY_SP.apply_mark(mark)).into(),
ident.clone().into();
),
init: Some(
MemberExpr {
span: DUMMY_SP,
obj: c.into(),
prop: ident.into(),
}
.into(),
),
init: Some(c.into()),
definite: false,
}],
}
.into(),
);
Stmt::Decl(decl)
}

fn map_helper_ref_ident(&mut self, ref_ident: &Ident) -> Option<Expr> {
self.helper_id_set.contains(&ref_ident.to_id()).then(|| {
let ident = ref_ident.clone().without_loc();

MemberExpr {
span: ref_ident.span,
obj: Box::new(ident.clone().into()),
prop: ident.into(),
}
.into()
})
}
}

impl VisitMut for InjectHelpers {
Expand All @@ -490,45 +474,9 @@ impl VisitMut for InjectHelpers {
}

fn visit_mut_script(&mut self, script: &mut Script) {
let (helpers, id_set) = self.make_helpers_for_script();
let helpers = self.make_helpers_for_script();

prepend_stmts(&mut script.body, helpers.into_iter());

if !id_set.is_empty() {
self.helper_id_set = id_set;
script.visit_mut_children_with(self);
}
}

fn visit_mut_expr(&mut self, n: &mut Expr) {
match n {
Expr::Ident(ref_ident) => {
if let Some(expr) = self.map_helper_ref_ident(ref_ident) {
*n = expr;
}
}

_ => n.visit_mut_children_with(self),
};
}

fn visit_mut_callee(&mut self, n: &mut Callee) {
match n {
Callee::Expr(e) if e.is_ident() => {
let is_indirect_callee = e
.as_ident()
.map(|ident| self.helper_id_set.contains(&ident.to_id()))
.unwrap_or_default();

e.visit_mut_with(self);

if is_indirect_callee {
*n = n.take().into_indirect()
}
}

_ => n.visit_mut_children_with(self),
}
}
}

Expand Down
27 changes: 22 additions & 5 deletions packages/swc-helpers/scripts/ast_grep.js
Original file line number Diff line number Diff line change
Expand Up @@ -65,14 +65,31 @@ export function ast_grep() {
report_export_mismatch(tree.filename(), match);
}

const has_assign = match
.find({
rule: {
pattern: func_name,
kind: "identifier",
inside: { kind: "assignment_expression", field: "left" },
},
});

const export_start = match.range().start.index;
const export_end = export_start + export_lentgh;

source.update(
export_start,
export_end,
`module.exports = { get ${func_name}() { return ${func_name}; } };`,
);
if (has_assign) {
source.update(
export_start,
export_end,
`exports.${func_name} = function() { return ${func_name}.apply(this, arguments) };`,
);
} else {
source.update(
export_start,
export_end,
`exports.${func_name} = ${func_name};`,
);
}
} else {
report_noexport(tree.filename());
}
Expand Down

0 comments on commit 9edce72

Please sign in to comment.