Skip to content

Commit b83ffe5

Browse files
committed
fix(mangler): mangle private class members used in nested classes properly (#14218)
fixes #14209 refs #14027
1 parent 632652d commit b83ffe5

File tree

3 files changed

+31
-5
lines changed

3 files changed

+31
-5
lines changed

crates/oxc_codegen/src/gen.rs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2752,11 +2752,9 @@ impl Gen for AccessorProperty<'_> {
27522752
impl Gen for PrivateIdentifier<'_> {
27532753
fn r#gen(&self, p: &mut Codegen, _ctx: Context) {
27542754
let name = if let Some(class_index) = p.current_class_index()
2755-
&& let Some(mangled) = &p
2756-
.private_member_mappings
2757-
.as_ref()
2758-
.and_then(|m| m[class_index].get(self.name.as_str()))
2759-
{
2755+
&& let Some(mangled) = &p.private_member_mappings.as_ref().and_then(|m| {
2756+
m[0..=class_index].iter().rev().find_map(|m| m.get(self.name.as_str()))
2757+
}) {
27602758
(*mangled).clone()
27612759
} else {
27622760
self.name.into_compact_str()

crates/oxc_minifier/tests/mangler/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,8 @@ fn private_member_mangling() {
118118
"class Foo { #x; check() { return #x in this; } }",
119119
// Nested classes
120120
"class Outer { #outerField = 1; inner() { return class Inner { #innerField = 2; get() { return this.#innerField; } }; } }",
121+
"class Outer { #shared = 1; getInner() { let self = this; return class { method() { return self.#shared; } }; } }",
122+
"class Outer { #shared = 1; getInner() { return class { #shared = 2; method() { return this.#shared; } }; } }",
121123
// Mixed public and private
122124
"class Foo { publicField = 1; #privateField = 2; getSum() { return this.publicField + this.#privateField; } }",
123125
// Test same names across different classes should reuse mangled names

crates/oxc_minifier/tests/mangler/snapshots/private_member_mangling.snap

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,32 @@ class Outer {
6060
}
6161
}
6262

63+
class Outer { #shared = 1; getInner() { let self = this; return class { method() { return self.#shared; } }; } }
64+
class Outer {
65+
#e = 1;
66+
getInner() {
67+
let e = this;
68+
return class {
69+
method() {
70+
return e.#e;
71+
}
72+
};
73+
}
74+
}
75+
76+
class Outer { #shared = 1; getInner() { return class { #shared = 2; method() { return this.#shared; } }; } }
77+
class Outer {
78+
#e = 1;
79+
getInner() {
80+
return class {
81+
#e = 2;
82+
method() {
83+
return this.#e;
84+
}
85+
};
86+
}
87+
}
88+
6389
class Foo { publicField = 1; #privateField = 2; getSum() { return this.publicField + this.#privateField; } }
6490
class Foo {
6591
publicField = 1;

0 commit comments

Comments
 (0)