Skip to content

Commit e09acfc

Browse files
committed
reuse default name in export default class
1 parent 494e2dc commit e09acfc

File tree

3 files changed

+78
-76
lines changed

3 files changed

+78
-76
lines changed

internal/bundler/snapshots/snapshots_lower.txt

+42-42
Original file line numberDiff line numberDiff line change
@@ -1525,36 +1525,36 @@ var foo4_default = class extends x {
15251525
};
15261526

15271527
// bar1.js
1528-
var _default = class extends x {
1528+
var _bar1_default = class extends x {
15291529
};
1530-
var default2 = _default;
1531-
__publicField(default2, "bar1", () => __async(_default, null, function* () {
1532-
return __superStaticGet(_default, "foo").call(this, "bar1");
1530+
var bar1_default = _bar1_default;
1531+
__publicField(bar1_default, "bar1", () => __async(_bar1_default, null, function* () {
1532+
return __superStaticGet(_bar1_default, "foo").call(this, "bar1");
15331533
}));
15341534

15351535
// bar2.js
1536-
var _default2 = class extends x {
1536+
var _bar2_default = class extends x {
15371537
};
1538-
var default2 = _default2;
1539-
__publicField(default2, "bar2", () => __async(_default2, null, function* () {
1540-
return () => __superStaticGet(_default2, "foo").call(this, "bar2");
1538+
var bar2_default = _bar2_default;
1539+
__publicField(bar2_default, "bar2", () => __async(_bar2_default, null, function* () {
1540+
return () => __superStaticGet(_bar2_default, "foo").call(this, "bar2");
15411541
}));
15421542

15431543
// bar3.js
1544-
var _default3 = class extends x {
1544+
var _bar3_default = class extends x {
15451545
};
1546-
var default2 = _default3;
1547-
__publicField(default2, "bar3", () => () => __async(_default3, null, function* () {
1548-
return __superStaticGet(_default3, "foo").call(this, "bar3");
1546+
var bar3_default = _bar3_default;
1547+
__publicField(bar3_default, "bar3", () => () => __async(_bar3_default, null, function* () {
1548+
return __superStaticGet(_bar3_default, "foo").call(this, "bar3");
15491549
}));
15501550

15511551
// bar4.js
1552-
var _default4 = class extends x {
1552+
var _bar4_default = class extends x {
15531553
};
1554-
var default2 = _default4;
1555-
__publicField(default2, "bar4", () => __async(_default4, null, function* () {
1556-
return () => __async(_default4, null, function* () {
1557-
return __superStaticGet(_default4, "foo").call(this, "bar4");
1554+
var bar4_default = _bar4_default;
1555+
__publicField(bar4_default, "bar4", () => __async(_bar4_default, null, function* () {
1556+
return () => __async(_bar4_default, null, function* () {
1557+
return __superStaticGet(_bar4_default, "foo").call(this, "bar4");
15581558
});
15591559
}));
15601560

@@ -1591,10 +1591,10 @@ var outer_default = function() {
15911591
});
15921592
}();
15931593
export {
1594-
_default as bar1,
1595-
_default2 as bar2,
1596-
_default3 as bar3,
1597-
_default4 as bar4,
1594+
bar1_default as bar1,
1595+
bar2_default as bar2,
1596+
bar3_default as bar3,
1597+
bar4_default as bar4,
15981598
baz1_default as baz1,
15991599
baz2_default as baz2,
16001600
foo1_default as foo1,
@@ -1657,36 +1657,36 @@ var foo4_default = class extends x {
16571657
};
16581658

16591659
// bar1.js
1660-
var _default = class extends x {
1660+
var _bar1_default = class extends x {
16611661
};
1662-
var default2 = _default;
1663-
__publicField(default2, "bar1", () => __async(_default, null, function* () {
1664-
return __superStaticSet(_default, "foo", "bar1");
1662+
var bar1_default = _bar1_default;
1663+
__publicField(bar1_default, "bar1", () => __async(_bar1_default, null, function* () {
1664+
return __superStaticSet(_bar1_default, "foo", "bar1");
16651665
}));
16661666

16671667
// bar2.js
1668-
var _default2 = class extends x {
1668+
var _bar2_default = class extends x {
16691669
};
1670-
var default2 = _default2;
1671-
__publicField(default2, "bar2", () => __async(_default2, null, function* () {
1672-
return () => __superStaticSet(_default2, "foo", "bar2");
1670+
var bar2_default = _bar2_default;
1671+
__publicField(bar2_default, "bar2", () => __async(_bar2_default, null, function* () {
1672+
return () => __superStaticSet(_bar2_default, "foo", "bar2");
16731673
}));
16741674

16751675
// bar3.js
1676-
var _default3 = class extends x {
1676+
var _bar3_default = class extends x {
16771677
};
1678-
var default2 = _default3;
1679-
__publicField(default2, "bar3", () => () => __async(_default3, null, function* () {
1680-
return __superStaticSet(_default3, "foo", "bar3");
1678+
var bar3_default = _bar3_default;
1679+
__publicField(bar3_default, "bar3", () => () => __async(_bar3_default, null, function* () {
1680+
return __superStaticSet(_bar3_default, "foo", "bar3");
16811681
}));
16821682

16831683
// bar4.js
1684-
var _default4 = class extends x {
1684+
var _bar4_default = class extends x {
16851685
};
1686-
var default2 = _default4;
1687-
__publicField(default2, "bar4", () => __async(_default4, null, function* () {
1688-
return () => __async(_default4, null, function* () {
1689-
return __superStaticSet(_default4, "foo", "bar4");
1686+
var bar4_default = _bar4_default;
1687+
__publicField(bar4_default, "bar4", () => __async(_bar4_default, null, function* () {
1688+
return () => __async(_bar4_default, null, function* () {
1689+
return __superStaticSet(_bar4_default, "foo", "bar4");
16901690
});
16911691
}));
16921692

@@ -1723,10 +1723,10 @@ var outer_default = function() {
17231723
});
17241724
}();
17251725
export {
1726-
_default as bar1,
1727-
_default2 as bar2,
1728-
_default3 as bar3,
1729-
_default4 as bar4,
1726+
bar1_default as bar1,
1727+
bar2_default as bar2,
1728+
bar3_default as bar3,
1729+
bar4_default as bar4,
17301730
baz1_default as baz1,
17311731
baz2_default as baz2,
17321732
foo1_default as foo1,

internal/js_parser/js_parser.go

+35-27
Original file line numberDiff line numberDiff line change
@@ -5876,7 +5876,8 @@ func (p *parser) parseStmt(opts parseStmtOpts) js_ast.Stmt {
58765876

58775877
// The default name is lazily generated only if no other name is present
58785878
createDefaultName := func() js_ast.LocRef {
5879-
defaultName := js_ast.LocRef{Loc: defaultLoc, Ref: p.newSymbol(js_ast.SymbolOther, p.source.IdentifierName+"_default")}
5879+
// This must be named "default" for when "--keep-names" is active
5880+
defaultName := js_ast.LocRef{Loc: defaultLoc, Ref: p.newSymbol(js_ast.SymbolOther, "default")}
58805881
p.currentScope.Generated = append(p.currentScope.Generated, defaultName.Ref)
58815882
return defaultName
58825883
}
@@ -8980,6 +8981,8 @@ func (p *parser) visitAndAppendStmt(stmts []js_ast.Stmt, stmt js_ast.Stmt) []js_
89808981
}
89818982
}
89828983

8984+
stmts = append(stmts, stmt)
8985+
89838986
case *js_ast.SFunction:
89848987
// If we need to preserve the name but there is no name, generate a name
89858988
var name string
@@ -9001,19 +9004,26 @@ func (p *parser) visitAndAppendStmt(stmts []js_ast.Stmt, stmt js_ast.Stmt) []js_
90019004
stmts = append(stmts, p.keepStmtSymbolName(s2.Fn.Name.Loc, s2.Fn.Name.Ref, name))
90029005
}
90039006

9004-
return stmts
9005-
90069007
case *js_ast.SClass:
9007-
result := p.visitClass(s.Value.Loc, &s2.Class, true /* isDefaultExport */)
9008+
result := p.visitClass(s.Value.Loc, &s2.Class, s.DefaultName.Ref)
90089009

90099010
// Lower class field syntax for browsers that don't support it
90109011
classStmts, _ := p.lowerClass(stmt, js_ast.Expr{}, result)
9011-
return append(stmts, classStmts...)
9012+
9013+
stmts = append(stmts, classStmts...)
90129014

90139015
default:
90149016
panic("Internal error")
90159017
}
90169018

9019+
// Use a more friendly name than "default" now that "--keep-names" has
9020+
// been applied and has made sure to enforce the name "default"
9021+
if p.symbols[s.DefaultName.Ref.InnerIndex].OriginalName == "default" {
9022+
p.symbols[s.DefaultName.Ref.InnerIndex].OriginalName = p.source.IdentifierName + "_default"
9023+
}
9024+
9025+
return stmts
9026+
90179027
case *js_ast.SExportEquals:
90189028
// "module.exports = value"
90199029
stmts = append(stmts, js_ast.AssignStmt(
@@ -9580,7 +9590,7 @@ func (p *parser) visitAndAppendStmt(stmts []js_ast.Stmt, stmt js_ast.Stmt) []js_
95809590
return stmts
95819591

95829592
case *js_ast.SClass:
9583-
result := p.visitClass(stmt.Loc, &s.Class, false /* isDefaultExport */)
9593+
result := p.visitClass(stmt.Loc, &s.Class, js_ast.InvalidRef)
95849594

95859595
// Remove the export flag inside a namespace
95869596
wasExportInsideNamespace := s.IsExport && p.enclosingNamespaceArgRef != nil
@@ -10105,7 +10115,7 @@ type visitClassResult struct {
1010510115
superCtorRef js_ast.Ref
1010610116
}
1010710117

10108-
func (p *parser) visitClass(nameScopeLoc logger.Loc, class *js_ast.Class, isDefaultExport bool) (result visitClassResult) {
10118+
func (p *parser) visitClass(nameScopeLoc logger.Loc, class *js_ast.Class, defaultNameRef js_ast.Ref) (result visitClassResult) {
1010910119
tsDecoratorScope := p.currentScope
1011010120
class.TSDecorators = p.visitTSDecorators(class.TSDecorators, tsDecoratorScope)
1011110121

@@ -10182,32 +10192,25 @@ func (p *parser) visitClass(nameScopeLoc logger.Loc, class *js_ast.Class, isDefa
1018210192
oldSuperCtorRef := p.superCtorRef
1018310193
p.superCtorRef = result.superCtorRef
1018410194

10185-
var classNameRef js_ast.Ref
10186-
if class.Name != nil {
10187-
classNameRef = class.Name.Ref
10188-
} else {
10189-
// Generate a name if one doesn't already exist. This is necessary for
10190-
// handling "this" in static class property initializers.
10191-
name := "this"
10192-
if isDefaultExport {
10193-
name = "default" // This is important for "--keep-names"
10194-
}
10195-
classNameRef = p.newSymbol(js_ast.SymbolOther, name)
10196-
}
10197-
1019810195
// Insert a shadowing name that spans the whole class, which matches
1019910196
// JavaScript's semantics. The class body (and extends clause) "captures" the
1020010197
// original value of the name. This matters for class statements because the
1020110198
// symbol can be re-assigned to something else later. The captured values
1020210199
// must be the original value of the name, not the re-assigned value.
1020310200
// Use "const" for this symbol to match JavaScript run-time semantics. You
1020410201
// are not allowed to assign to this symbol (it throws a TypeError).
10205-
name := p.symbols[classNameRef.InnerIndex].OriginalName
10206-
result.shadowRef = p.newSymbol(js_ast.SymbolConst, "_"+name)
10207-
p.recordDeclaredSymbol(result.shadowRef)
1020810202
if class.Name != nil {
10203+
name := p.symbols[class.Name.Ref.InnerIndex].OriginalName
10204+
result.shadowRef = p.newSymbol(js_ast.SymbolConst, "_"+name)
1020910205
p.currentScope.Members[name] = js_ast.ScopeMember{Loc: class.Name.Loc, Ref: result.shadowRef}
10206+
} else {
10207+
name := "_this"
10208+
if defaultNameRef != js_ast.InvalidRef {
10209+
name = "_" + p.source.IdentifierName + "_default"
10210+
}
10211+
result.shadowRef = p.newSymbol(js_ast.SymbolConst, name)
1021010212
}
10213+
p.recordDeclaredSymbol(result.shadowRef)
1021110214

1021210215
if class.ExtendsOrNil.Data != nil {
1021310216
class.ExtendsOrNil = p.visitExpr(class.ExtendsOrNil)
@@ -10377,10 +10380,15 @@ func (p *parser) visitClass(nameScopeLoc logger.Loc, class *js_ast.Class, isDefa
1037710380
} else if class.Name == nil {
1037810381
// If there was originally no class name but something inside needed one
1037910382
// (e.g. there was a static property initializer that referenced "this"),
10380-
// store our generated name so the class expression ends up with a name.
10383+
// populate the class name. If this is an "export default class" statement,
10384+
// use the existing default name so that things will work as expected if
10385+
// this is turned into a regular class statement later on.
10386+
classNameRef := defaultNameRef
10387+
if classNameRef == js_ast.InvalidRef {
10388+
classNameRef = p.newSymbol(js_ast.SymbolOther, "this")
10389+
p.recordDeclaredSymbol(classNameRef)
10390+
}
1038110391
class.Name = &js_ast.LocRef{Loc: nameScopeLoc, Ref: classNameRef}
10382-
p.currentScope.Generated = append(p.currentScope.Generated, classNameRef)
10383-
p.recordDeclaredSymbol(classNameRef)
1038410392
}
1038510393

1038610394
return
@@ -13508,7 +13516,7 @@ func (p *parser) visitExprInOut(expr js_ast.Expr, in exprIn) (js_ast.Expr, exprO
1350813516
}
1350913517

1351013518
case *js_ast.EClass:
13511-
result := p.visitClass(expr.Loc, &e.Class, false /* isDefaultExport */)
13519+
result := p.visitClass(expr.Loc, &e.Class, js_ast.InvalidRef)
1351213520

1351313521
// Lower class field syntax for browsers that don't support it
1351413522
_, expr = p.lowerClass(js_ast.Stmt{}, expr, result)

internal/js_parser/js_parser_lower.go

+1-7
Original file line numberDiff line numberDiff line change
@@ -2061,13 +2061,6 @@ func (p *parser) lowerClass(stmt js_ast.Stmt, expr js_ast.Expr, result visitClas
20612061
class = &s2.Class
20622062
defaultName = s.DefaultName
20632063
kind = classKindExportDefaultStmt
2064-
2065-
// The shadowing name inside the class expression should be the same as
2066-
// the default export name
2067-
if result.shadowRef != js_ast.InvalidRef {
2068-
p.mergeSymbols(result.shadowRef, defaultName.Ref)
2069-
}
2070-
20712064
if class.Name != nil {
20722065
nameToKeep = p.symbols[class.Name.Ref.InnerIndex].OriginalName
20732066
} else {
@@ -2691,6 +2684,7 @@ func (p *parser) lowerClass(stmt js_ast.Stmt, expr js_ast.Expr, result visitClas
26912684
ValueOrNil: init,
26922685
}},
26932686
}})
2687+
p.recordUsage(nameRef)
26942688
} else {
26952689
switch kind {
26962690
case classKindStmt:

0 commit comments

Comments
 (0)