mirror of
https://github.com/swc-project/swc.git
synced 2024-11-28 02:29:04 +03:00
fix(es/modules): Handle this
in class methods (#5065)
This commit is contained in:
parent
73874486b2
commit
ef543b1b22
@ -160,7 +160,7 @@ impl VisitMut for Amd {
|
|||||||
stmts.visit_mut_children_with(&mut ModuleRefRewriter {
|
stmts.visit_mut_children_with(&mut ModuleRefRewriter {
|
||||||
import_map,
|
import_map,
|
||||||
lazy_record: Default::default(),
|
lazy_record: Default::default(),
|
||||||
top_level: true,
|
is_global_this: true,
|
||||||
});
|
});
|
||||||
|
|
||||||
// ====================
|
// ====================
|
||||||
|
@ -136,7 +136,7 @@ impl VisitMut for Cjs {
|
|||||||
stmts.visit_mut_children_with(&mut ModuleRefRewriter {
|
stmts.visit_mut_children_with(&mut ModuleRefRewriter {
|
||||||
import_map,
|
import_map,
|
||||||
lazy_record,
|
lazy_record,
|
||||||
top_level: true,
|
is_global_this: true,
|
||||||
});
|
});
|
||||||
|
|
||||||
*n = stmts;
|
*n = stmts;
|
||||||
|
@ -35,7 +35,7 @@ pub(crate) struct ModuleRefRewriter {
|
|||||||
|
|
||||||
pub lazy_record: AHashSet<Id>,
|
pub lazy_record: AHashSet<Id>,
|
||||||
|
|
||||||
pub top_level: bool,
|
pub is_global_this: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl VisitMut for ModuleRefRewriter {
|
impl VisitMut for ModuleRefRewriter {
|
||||||
@ -67,7 +67,7 @@ impl VisitMut for ModuleRefRewriter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Expr::This(ThisExpr { span }) => {
|
Expr::This(ThisExpr { span }) => {
|
||||||
if self.top_level {
|
if self.is_global_this {
|
||||||
*n = *undefined(*span);
|
*n = *undefined(*span);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -99,38 +99,34 @@ impl VisitMut for ModuleRefRewriter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn visit_mut_function(&mut self, n: &mut Function) {
|
fn visit_mut_function(&mut self, n: &mut Function) {
|
||||||
n.params.visit_mut_with(self);
|
self.visit_mut_with_non_global_this(n);
|
||||||
|
|
||||||
self.visit_mut_with_non_top_level(&mut n.body);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn visit_mut_constructor(&mut self, n: &mut Constructor) {
|
fn visit_mut_constructor(&mut self, n: &mut Constructor) {
|
||||||
n.params.visit_mut_with(self);
|
self.visit_mut_with_non_global_this(n);
|
||||||
|
|
||||||
self.visit_mut_with_non_top_level(&mut n.body);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn visit_mut_class_prop(&mut self, n: &mut ClassProp) {
|
fn visit_mut_class_prop(&mut self, n: &mut ClassProp) {
|
||||||
n.key.visit_mut_with(self);
|
n.key.visit_mut_with(self);
|
||||||
|
|
||||||
self.visit_mut_with_non_top_level(&mut n.value);
|
self.visit_mut_with_non_global_this(&mut n.value);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn visit_mut_static_block(&mut self, n: &mut StaticBlock) {
|
fn visit_mut_static_block(&mut self, n: &mut StaticBlock) {
|
||||||
self.visit_mut_with_non_top_level(&mut n.body);
|
self.visit_mut_with_non_global_this(n);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ModuleRefRewriter {
|
impl ModuleRefRewriter {
|
||||||
fn visit_mut_with_non_top_level<T>(&mut self, n: &mut T)
|
fn visit_mut_with_non_global_this<T>(&mut self, n: &mut T)
|
||||||
where
|
where
|
||||||
T: VisitMutWith<Self>,
|
T: VisitMutWith<Self>,
|
||||||
{
|
{
|
||||||
let top_level = self.top_level;
|
let top_level = self.is_global_this;
|
||||||
|
|
||||||
self.top_level = false;
|
self.is_global_this = false;
|
||||||
n.visit_mut_with(self);
|
n.visit_mut_children_with(self);
|
||||||
self.top_level = top_level;
|
self.is_global_this = top_level;
|
||||||
}
|
}
|
||||||
|
|
||||||
fn map_module_ref_ident(&mut self, ref_ident: &Ident) -> Option<Expr> {
|
fn map_module_ref_ident(&mut self, ref_ident: &Ident) -> Option<Expr> {
|
||||||
|
@ -140,7 +140,7 @@ impl VisitMut for Umd {
|
|||||||
stmts.visit_mut_children_with(&mut ModuleRefRewriter {
|
stmts.visit_mut_children_with(&mut ModuleRefRewriter {
|
||||||
import_map,
|
import_map,
|
||||||
lazy_record: Default::default(),
|
lazy_record: Default::default(),
|
||||||
top_level: true,
|
is_global_this: true,
|
||||||
});
|
});
|
||||||
|
|
||||||
// ====================
|
// ====================
|
||||||
|
@ -0,0 +1,6 @@
|
|||||||
|
class Foo {
|
||||||
|
bar = 5;
|
||||||
|
getThing(a, b = this.bar) {
|
||||||
|
return a + b;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,11 @@
|
|||||||
|
define([
|
||||||
|
"require"
|
||||||
|
], function(require) {
|
||||||
|
"use strict";
|
||||||
|
class Foo {
|
||||||
|
bar = 5;
|
||||||
|
getThing(a, b = this.bar) {
|
||||||
|
return a + b;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
@ -0,0 +1,7 @@
|
|||||||
|
"use strict";
|
||||||
|
class Foo {
|
||||||
|
bar = 5;
|
||||||
|
getThing(a, b = this.bar) {
|
||||||
|
return a + b;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,13 @@
|
|||||||
|
(function(global, factory) {
|
||||||
|
if (typeof module === "object" && typeof module.exports === "object") factory();
|
||||||
|
else if (typeof define === "function" && define.amd) define([], factory);
|
||||||
|
else if (global = typeof globalThis !== "undefined" ? globalThis : global || self) factory();
|
||||||
|
})(this, function() {
|
||||||
|
"use strict";
|
||||||
|
class Foo {
|
||||||
|
bar = 5;
|
||||||
|
getThing(a, b = this.bar) {
|
||||||
|
return a + b;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
@ -0,0 +1,28 @@
|
|||||||
|
export class Foo {
|
||||||
|
[this] = this;
|
||||||
|
|
||||||
|
[this](a, b = this.x) {
|
||||||
|
return a + b;
|
||||||
|
}
|
||||||
|
|
||||||
|
static [this] = this;
|
||||||
|
static [this](a, b = this.x) {
|
||||||
|
return a + b;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function foo(a = this) {
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default {
|
||||||
|
[this]: this,
|
||||||
|
|
||||||
|
[this](a, b = this.x) {
|
||||||
|
return a + b;
|
||||||
|
},
|
||||||
|
|
||||||
|
[this]: function (a, b = this.x) {
|
||||||
|
return a + b;
|
||||||
|
},
|
||||||
|
};
|
@ -0,0 +1,42 @@
|
|||||||
|
define([
|
||||||
|
"require",
|
||||||
|
"exports"
|
||||||
|
], function(require, exports) {
|
||||||
|
"use strict";
|
||||||
|
Object.defineProperty(exports, "__esModule", {
|
||||||
|
value: true
|
||||||
|
});
|
||||||
|
function _export(target, all) {
|
||||||
|
for(var name in all)Object.defineProperty(target, name, {
|
||||||
|
get: all[name],
|
||||||
|
enumerable: true
|
||||||
|
});
|
||||||
|
}
|
||||||
|
_export(exports, {
|
||||||
|
Foo: ()=>Foo,
|
||||||
|
default: ()=>_default,
|
||||||
|
foo: ()=>foo
|
||||||
|
});
|
||||||
|
class Foo {
|
||||||
|
[void 0] = this;
|
||||||
|
[void 0](a, b = this.x) {
|
||||||
|
return a + b;
|
||||||
|
}
|
||||||
|
static [void 0] = this;
|
||||||
|
static [void 0](a, b = this.x) {
|
||||||
|
return a + b;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function foo(a = this) {
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
var _default = {
|
||||||
|
[void 0]: void 0,
|
||||||
|
[void 0] (a, b = this.x) {
|
||||||
|
return a + b;
|
||||||
|
},
|
||||||
|
[void 0]: function(a, b = this.x) {
|
||||||
|
return a + b;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
});
|
@ -0,0 +1,37 @@
|
|||||||
|
"use strict";
|
||||||
|
Object.defineProperty(exports, "__esModule", {
|
||||||
|
value: true
|
||||||
|
});
|
||||||
|
function _export(target, all) {
|
||||||
|
for(var name in all)Object.defineProperty(target, name, {
|
||||||
|
get: all[name],
|
||||||
|
enumerable: true
|
||||||
|
});
|
||||||
|
}
|
||||||
|
_export(exports, {
|
||||||
|
Foo: ()=>Foo,
|
||||||
|
default: ()=>_default,
|
||||||
|
foo: ()=>foo
|
||||||
|
});
|
||||||
|
class Foo {
|
||||||
|
[void 0] = this;
|
||||||
|
[void 0](a, b = this.x) {
|
||||||
|
return a + b;
|
||||||
|
}
|
||||||
|
static [void 0] = this;
|
||||||
|
static [void 0](a, b = this.x) {
|
||||||
|
return a + b;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function foo(a = this) {
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
var _default = {
|
||||||
|
[void 0]: void 0,
|
||||||
|
[void 0] (a, b = this.x) {
|
||||||
|
return a + b;
|
||||||
|
},
|
||||||
|
[void 0]: function(a, b = this.x) {
|
||||||
|
return a + b;
|
||||||
|
}
|
||||||
|
};
|
@ -0,0 +1,45 @@
|
|||||||
|
(function(global, factory) {
|
||||||
|
if (typeof module === "object" && typeof module.exports === "object") factory(exports);
|
||||||
|
else if (typeof define === "function" && define.amd) define([
|
||||||
|
"exports"
|
||||||
|
], factory);
|
||||||
|
else if (global = typeof globalThis !== "undefined" ? globalThis : global || self) factory(global.input = {});
|
||||||
|
})(this, function(exports) {
|
||||||
|
"use strict";
|
||||||
|
Object.defineProperty(exports, "__esModule", {
|
||||||
|
value: true
|
||||||
|
});
|
||||||
|
function _export(target, all) {
|
||||||
|
for(var name in all)Object.defineProperty(target, name, {
|
||||||
|
get: all[name],
|
||||||
|
enumerable: true
|
||||||
|
});
|
||||||
|
}
|
||||||
|
_export(exports, {
|
||||||
|
Foo: ()=>Foo,
|
||||||
|
default: ()=>_default,
|
||||||
|
foo: ()=>foo
|
||||||
|
});
|
||||||
|
class Foo {
|
||||||
|
[void 0] = this;
|
||||||
|
[void 0](a, b = this.x) {
|
||||||
|
return a + b;
|
||||||
|
}
|
||||||
|
static [void 0] = this;
|
||||||
|
static [void 0](a, b = this.x) {
|
||||||
|
return a + b;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function foo(a = this) {
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
var _default = {
|
||||||
|
[void 0]: void 0,
|
||||||
|
[void 0] (a, b = this.x) {
|
||||||
|
return a + b;
|
||||||
|
},
|
||||||
|
[void 0]: function(a, b = this.x) {
|
||||||
|
return a + b;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
});
|
Loading…
Reference in New Issue
Block a user