@@ -45,13 +45,13 @@ private[emitter] final class ClassEmitter(sjsGen: SJSGen) {
45
45
46
46
def buildClass (className : ClassName , isJSClass : Boolean , jsClassCaptures : Option [List [ParamDef ]],
47
47
hasClassInitializer : Boolean ,
48
- superClass : Option [ClassIdent ], jsSuperClass : Option [Tree ], useESClass : Boolean ,
48
+ superClass : Option [ClassIdent ], storeJSSuperClass : Option [js. Tree ], useESClass : Boolean ,
49
49
members : List [js.Tree ])(
50
50
implicit moduleContext : ModuleContext ,
51
51
globalKnowledge : GlobalKnowledge , pos : Position ): WithGlobals [List [js.Tree ]] = {
52
52
53
53
if (! isJSClass) {
54
- assert(jsSuperClass .isEmpty, className)
54
+ assert(storeJSSuperClass .isEmpty, className)
55
55
56
56
if (useESClass) {
57
57
val parentVarWithGlobals = for (parentIdent <- superClass) yield {
@@ -70,30 +70,23 @@ private[emitter] final class ClassEmitter(sjsGen: SJSGen) {
70
70
// Wrap the entire class def in an accessor function
71
71
import TreeDSL ._
72
72
73
- val genStoreJSSuperClass = jsSuperClass.map { jsSuperClass =>
74
- for (rhs <- desugarExpr(jsSuperClass, resultType = AnyType )) yield {
75
- js.VarDef (fileLevelVar(VarField .superClass).ident, Some (rhs))
76
- }
77
- }
78
-
79
73
val classValueIdent = fileLevelVarIdent(VarField .b, genName(className))
80
74
val classValueVar = js.VarRef (classValueIdent)
81
75
val createClassValueVar = genEmptyMutableLet(classValueIdent)
82
76
83
77
val entireClassDefWithGlobals = if (useESClass) {
84
- genJSSuperCtor(superClass, jsSuperClass ).map { jsSuperClass =>
78
+ genJSSuperCtor(superClass, storeJSSuperClass.isDefined ).map { jsSuperClass =>
85
79
List (classValueVar := js.ClassDef (Some (classValueIdent), Some (jsSuperClass), members))
86
80
}
87
81
} else {
88
82
WithGlobals (members)
89
83
}
90
84
91
85
val classDefStatsWithGlobals = for {
92
- optStoreJSSuperClass <- WithGlobals .option(genStoreJSSuperClass)
93
86
entireClassDef <- entireClassDefWithGlobals
94
87
createStaticFields <- genCreateStaticFieldsOfJSClass(className)
95
88
} yield {
96
- optStoreJSSuperClass .toList ::: entireClassDef ::: createStaticFields
89
+ storeJSSuperClass .toList ::: entireClassDef ::: createStaticFields
97
90
}
98
91
99
92
jsClassCaptures.fold {
@@ -225,7 +218,7 @@ private[emitter] final class ClassEmitter(sjsGen: SJSGen) {
225
218
226
219
/** Generates the JS constructor for a JS class. */
227
220
def genJSConstructor (className : ClassName , superClass : Option [ClassIdent ],
228
- jsSuperClass : Option [ Tree ] , useESClass : Boolean , jsConstructorDef : JSConstructorDef )(
221
+ hasJSSuperClass : Boolean , useESClass : Boolean , jsConstructorDef : JSConstructorDef )(
229
222
implicit moduleContext : ModuleContext ,
230
223
globalKnowledge : GlobalKnowledge , pos : Position ): WithGlobals [List [js.Tree ]] = {
231
224
@@ -240,7 +233,7 @@ private[emitter] final class ClassEmitter(sjsGen: SJSGen) {
240
233
} else {
241
234
for {
242
235
ctorFun <- ctorFunWithGlobals
243
- superCtor <- genJSSuperCtor(superClass, jsSuperClass )
236
+ superCtor <- genJSSuperCtor(superClass, hasJSSuperClass )
244
237
} yield {
245
238
import TreeDSL ._
246
239
@@ -254,16 +247,24 @@ private[emitter] final class ClassEmitter(sjsGen: SJSGen) {
254
247
}
255
248
}
256
249
257
- private def genJSSuperCtor (superClass : Option [ClassIdent ], jsSuperClass : Option [ Tree ] )(
250
+ private def genJSSuperCtor (superClass : Option [ClassIdent ], hasJSSuperClass : Boolean )(
258
251
implicit moduleContext : ModuleContext , globalKnowledge : GlobalKnowledge ,
259
252
pos : Position ): WithGlobals [js.Tree ] = {
260
- if (jsSuperClass.isDefined ) {
253
+ if (hasJSSuperClass ) {
261
254
WithGlobals (fileLevelVar(VarField .superClass))
262
255
} else {
263
256
genJSClassConstructor(superClass.get.name, keepOnlyDangerousVarNames = true )
264
257
}
265
258
}
266
259
260
+ def genStoreJSSuperClass (jsSuperClass : Tree )(
261
+ implicit moduleContext : ModuleContext , globalKnowledge : GlobalKnowledge ,
262
+ pos : Position ): WithGlobals [js.Tree ] = {
263
+ for (rhs <- desugarExpr(jsSuperClass, resultType = AnyType )) yield {
264
+ js.VarDef (fileLevelVar(VarField .superClass).ident, Some (rhs))
265
+ }
266
+ }
267
+
267
268
/** Generates the JavaScript constructor of a class, as a `js.Function`.
268
269
*
269
270
* For ECMAScript 2015, that `js.Function` must be decomposed and reformed
0 commit comments