1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
use std::{borrow::Cow, mem::take};
use swc_common::pass::CompilerPass;
use swc_ecma_ast::*;
use swc_ecma_visit::{as_folder, noop_visit_mut_type, Fold, VisitMut};
pub fn import_hoister() -> impl Fold + VisitMut + CompilerPass {
as_folder(Hoister)
}
struct Hoister;
impl CompilerPass for Hoister {
fn name() -> Cow<'static, str> {
Cow::Borrowed("import-hoister")
}
}
impl VisitMut for Hoister {
noop_visit_mut_type!();
fn visit_mut_module(&mut self, module: &mut Module) {
let mut found_other = false;
let mut need_work = false;
for stmt in &module.body {
match stmt {
ModuleItem::ModuleDecl(ModuleDecl::Import(..)) => {
if found_other {
need_work = true;
break;
}
}
_ => {
found_other = true;
}
}
}
if !need_work {
return;
}
let mut imports = Vec::with_capacity(module.body.len());
let mut extra = vec![];
for body in take(&mut module.body) {
match body {
ModuleItem::ModuleDecl(ModuleDecl::Import(..)) => {
imports.push(body);
}
_ => {
extra.push(body);
}
}
}
imports.extend(extra);
module.body = imports;
}
}