Skip to content

Commit 06c64cf

Browse files
authored
fix(es/renamer): Fix (broken) identifier preserving API (#10474)
**Description:** The previous API is just broken
1 parent 9f104af commit 06c64cf

File tree

4 files changed

+38
-36
lines changed

4 files changed

+38
-36
lines changed

crates/swc_ecma_minifier/src/pass/mangle_names/mod.rs

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -48,36 +48,29 @@ pub(crate) fn mangle_names(
4848
keep_class_names: options.keep_class_names,
4949
top_level_mark,
5050
ignore_eval: options.eval,
51-
preserved_symbols: options.reserved.iter().cloned().collect(),
5251
},
5352
ManglingRenamer {
5453
chars,
55-
preserved,
54+
preserved: &preserved,
5655
cache,
5756
mangle_name_cache,
57+
reserved: &options.reserved,
5858
},
5959
));
6060
}
6161

62-
struct ManglingRenamer {
62+
struct ManglingRenamer<'a> {
6363
chars: Base54Chars,
64-
preserved: FxHashSet<Id>,
64+
preserved: &'a FxHashSet<Id>,
6565
cache: Option<RenameMap>,
6666
mangle_name_cache: Option<Arc<dyn MangleCache>>,
67+
reserved: &'a Vec<Atom>,
6768
}
6869

69-
impl Renamer for ManglingRenamer {
70+
impl<'a> Renamer for ManglingRenamer<'a> {
7071
const MANGLE: bool = true;
7172
const RESET_N: bool = false;
7273

73-
fn preserved_ids_for_module(&mut self, _: &Module) -> FxHashSet<Id> {
74-
self.preserved.clone()
75-
}
76-
77-
fn preserved_ids_for_script(&mut self, _: &Script) -> FxHashSet<Id> {
78-
self.preserved.clone()
79-
}
80-
8174
fn new_name_for(&self, _: &Id, n: &mut usize) -> Atom {
8275
self.chars.encode(n, true)
8376
}
@@ -91,6 +84,18 @@ impl Renamer for ManglingRenamer {
9184
cacher.update_vars_cache(update);
9285
}
9386
}
87+
88+
fn unresolved_symbols(&self) -> Vec<Atom> {
89+
self.reserved
90+
.iter()
91+
.cloned()
92+
.chain(self.preserved.iter().map(|id| id.0.clone()))
93+
.collect()
94+
}
95+
96+
fn preserve_name(&self, orig: &Id) -> bool {
97+
self.preserved.contains(orig)
98+
}
9499
}
95100

96101
struct LabelMangler {

crates/swc_ecma_transforms_base/src/hygiene/mod.rs

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
use rustc_hash::FxHashSet;
2-
use swc_atoms::Atom;
31
use swc_common::Mark;
42
use swc_ecma_ast::*;
53
use swc_ecma_utils::stack_size::maybe_grow_default;
@@ -22,9 +20,6 @@ pub struct Config {
2220

2321
/// Mangle even if vars are visible to `eval` or `with`.
2422
pub ignore_eval: bool,
25-
26-
/// Used for preventing mangler from renaming variables to reserved names.
27-
pub preserved_symbols: FxHashSet<Atom>,
2823
}
2924

3025
/// See [hygiene_with_config] for doc. Creates a `hygiene` pass with default

crates/swc_ecma_transforms_base/src/rename/analyzer/scope.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,8 @@ impl Scope {
149149
let mut n = 0;
150150

151151
for id in queue {
152-
if preserved.contains(&id)
152+
if renamer.preserve_name(&id)
153+
|| preserved.contains(&id)
153154
|| to.get(&id).is_some()
154155
|| previous.get(&id).is_some()
155156
|| id.0 == "eval"
@@ -288,7 +289,8 @@ impl Scope {
288289
let mut n = 0;
289290

290291
for id in queue {
291-
if preserved.contains(&id)
292+
if renamer.preserve_name(&id)
293+
|| preserved.contains(&id)
292294
|| to.get(&id).is_some()
293295
|| previous.get(&id).is_some()
294296
|| id.0 == "eval"

crates/swc_ecma_transforms_base/src/rename/mod.rs

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -34,14 +34,6 @@ pub trait Renamer: Send + Sync {
3434
/// It should be true if you expect lots of collisions
3535
const MANGLE: bool;
3636

37-
fn preserved_ids_for_module(&mut self, _: &Module) -> FxHashSet<Id> {
38-
Default::default()
39-
}
40-
41-
fn preserved_ids_for_script(&mut self, _: &Script) -> FxHashSet<Id> {
42-
Default::default()
43-
}
44-
4537
fn get_cached(&self) -> Option<Cow<RenameMap>> {
4638
None
4739
}
@@ -50,6 +42,16 @@ pub trait Renamer: Send + Sync {
5042

5143
/// Should increment `n`.
5244
fn new_name_for(&self, orig: &Id, n: &mut usize) -> Atom;
45+
46+
fn unresolved_symbols(&self) -> Vec<Atom> {
47+
Default::default()
48+
}
49+
50+
/// Return true if the identifier should be preserved.
51+
#[inline]
52+
fn preserve_name(&self, _orig: &Id) -> bool {
53+
false
54+
}
5355
}
5456

5557
pub type RenameMap = FxHashMap<Id, Atom>;
@@ -175,10 +177,12 @@ where
175177
.extend(self.preserved.iter().map(|v| v.0.clone()));
176178
}
177179

178-
if !self.config.preserved_symbols.is_empty() {
179-
unresolved
180-
.to_mut()
181-
.extend(self.config.preserved_symbols.iter().cloned());
180+
{
181+
let extra_unresolved = self.renamer.unresolved_symbols();
182+
183+
if !extra_unresolved.is_empty() {
184+
unresolved.to_mut().extend(extra_unresolved);
185+
}
182186
}
183187

184188
if R::MANGLE {
@@ -347,8 +351,6 @@ where
347351
fn visit_mut_module(&mut self, m: &mut Module) {
348352
self.load_cache();
349353

350-
self.preserved = self.renamer.preserved_ids_for_module(m);
351-
352354
let has_eval = !self.config.ignore_eval && contains_eval(m, true);
353355

354356
self.unresolved = self.get_unresolved(m, has_eval);
@@ -392,8 +394,6 @@ where
392394
fn visit_mut_script(&mut self, m: &mut Script) {
393395
self.load_cache();
394396

395-
self.preserved = self.renamer.preserved_ids_for_script(m);
396-
397397
let has_eval = !self.config.ignore_eval && contains_eval(m, true);
398398

399399
self.unresolved = self.get_unresolved(m, has_eval);

0 commit comments

Comments
 (0)