@@ -27,6 +27,7 @@ import org.scalajs.ir.Names.DefaultModuleID
27
27
import org .scalajs .ir .OriginalName .NoOriginalName
28
28
import org .scalajs .ir .Position .NoPosition
29
29
import org .scalajs .ir .Trees .OptimizerHints
30
+ import org .scalajs .ir .Version .Unversioned
30
31
31
32
import dotty .tools .dotc .transform .sjs .JSExportUtils .*
32
33
import dotty .tools .dotc .transform .sjs .JSSymUtils .*
@@ -185,18 +186,21 @@ final class JSExportsGen(jsCodeGen: JSCodeGen)(using Context) {
185
186
}).toList
186
187
}
187
188
188
- def genStaticExports (classSym : Symbol ): List [js.MemberDef ] = {
189
+ def genStaticExports (classSym : Symbol ): ( List [js.JSFieldDef ], List [js. JSMethodPropDef ]) = {
189
190
val exports = for {
190
191
sym <- classSym.info.decls.toList
191
192
info <- staticExportsOf(sym)
192
193
} yield {
193
194
(info, sym)
194
195
}
195
196
196
- (for {
197
+ val fields = List .newBuilder[js.JSFieldDef ]
198
+ val methodProps = List .newBuilder[js.JSMethodPropDef ]
199
+
200
+ for {
197
201
(info, tups) <- exports.groupBy(_._1)
198
202
kind <- checkSameKind(tups)
199
- } yield {
203
+ } {
200
204
def alts = tups.map(_._2)
201
205
202
206
implicit val pos = info.pos
@@ -205,10 +209,12 @@ final class JSExportsGen(jsCodeGen: JSCodeGen)(using Context) {
205
209
206
210
kind match {
207
211
case Method =>
208
- genMemberExportOrDispatcher(JSName .Literal (info.jsName), isProp = false , alts, static = true )
212
+ methodProps +=
213
+ genMemberExportOrDispatcher(JSName .Literal (info.jsName), isProp = false , alts, static = true )
209
214
210
215
case Property =>
211
- genMemberExportOrDispatcher(JSName .Literal (info.jsName), isProp = true , alts, static = true )
216
+ methodProps +=
217
+ genMemberExportOrDispatcher(JSName .Literal (info.jsName), isProp = true , alts, static = true )
212
218
213
219
case Field =>
214
220
val sym = checkSingleField(tups)
@@ -219,19 +225,21 @@ final class JSExportsGen(jsCodeGen: JSCodeGen)(using Context) {
219
225
.withMutable(true )
220
226
val name = js.StringLiteral (info.jsName)
221
227
val irTpe = genExposedFieldIRType(sym)
222
- js.JSFieldDef (flags, name, irTpe)
228
+ fields += js.JSFieldDef (flags, name, irTpe)
223
229
224
230
case kind =>
225
231
throw new AssertionError (s " unexpected static export kind: $kind" )
226
232
}
227
- }).toList
233
+ }
234
+
235
+ (fields.result(), methodProps.result())
228
236
}
229
237
230
238
/** Generates exported methods and properties for a class.
231
239
*
232
240
* @param classSym symbol of the class we export for
233
241
*/
234
- def genMemberExports (classSym : ClassSymbol ): List [js.MemberDef ] = {
242
+ def genMemberExports (classSym : ClassSymbol ): List [js.JSMethodPropDef ] = {
235
243
val classInfo = classSym.info
236
244
val allExports = classInfo.memberDenots(takeAllFilter, { (name, buf) =>
237
245
if (isExportName(name))
@@ -251,7 +259,7 @@ final class JSExportsGen(jsCodeGen: JSCodeGen)(using Context) {
251
259
newlyDeclaredExportNames.map(genMemberExport(classSym, _))
252
260
}
253
261
254
- private def genMemberExport (classSym : ClassSymbol , name : TermName ): js.MemberDef = {
262
+ private def genMemberExport (classSym : ClassSymbol , name : TermName ): js.JSMethodPropDef = {
255
263
/* This used to be `.member(name)`, but it caused #3538, since we were
256
264
* sometimes selecting mixin forwarders, whose type history does not go
257
265
* far enough back in time to see varargs. We now explicitly exclude
@@ -284,11 +292,11 @@ final class JSExportsGen(jsCodeGen: JSCodeGen)(using Context) {
284
292
genMemberExportOrDispatcher(JSName .Literal (jsName), isProp, alts.map(_.symbol), static = false )
285
293
}
286
294
287
- def genJSClassDispatchers (classSym : Symbol , dispatchMethodsNames : List [JSName ]): List [js.MemberDef ] = {
295
+ def genJSClassDispatchers (classSym : Symbol , dispatchMethodsNames : List [JSName ]): List [js.JSMethodPropDef ] = {
288
296
dispatchMethodsNames.map(genJSClassDispatcher(classSym, _))
289
297
}
290
298
291
- private def genJSClassDispatcher (classSym : Symbol , name : JSName ): js.MemberDef = {
299
+ private def genJSClassDispatcher (classSym : Symbol , name : JSName ): js.JSMethodPropDef = {
292
300
val alts = classSym.info.membersBasedOnFlags(required = Method , excluded = Bridge )
293
301
.map(_.symbol)
294
302
.filter { sym =>
@@ -311,14 +319,14 @@ final class JSExportsGen(jsCodeGen: JSCodeGen)(using Context) {
311
319
em " Conflicting properties and methods for ${classSym.fullName}:: $name. " ,
312
320
firstAlt.srcPos)
313
321
implicit val pos = firstAlt.span
314
- js.JSPropertyDef (js.MemberFlags .empty, genExpr(name)(firstAlt.sourcePos), None , None )
322
+ js.JSPropertyDef (js.MemberFlags .empty, genExpr(name)(firstAlt.sourcePos), None , None )( Unversioned )
315
323
} else {
316
324
genMemberExportOrDispatcher(name, isProp, alts, static = false )
317
325
}
318
326
}
319
327
320
328
private def genMemberExportOrDispatcher (jsName : JSName , isProp : Boolean ,
321
- alts : List [Symbol ], static : Boolean ): js.MemberDef = {
329
+ alts : List [Symbol ], static : Boolean ): js.JSMethodPropDef = {
322
330
withNewLocalNameScope {
323
331
if (isProp)
324
332
genExportProperty(alts, jsName, static)
@@ -362,7 +370,7 @@ final class JSExportsGen(jsCodeGen: JSCodeGen)(using Context) {
362
370
}
363
371
}
364
372
365
- js.JSPropertyDef (flags, genExpr(jsName)(alts.head.sourcePos), getterBody, setterArgAndBody)
373
+ js.JSPropertyDef (flags, genExpr(jsName)(alts.head.sourcePos), getterBody, setterArgAndBody)( Unversioned )
366
374
}
367
375
368
376
private def genExportMethod (alts0 : List [Symbol ], jsName : JSName , static : Boolean )(using Context ): js.JSMethodDef = {
@@ -389,7 +397,7 @@ final class JSExportsGen(jsCodeGen: JSCodeGen)(using Context) {
389
397
genOverloadDispatch(jsName, overloads, jstpe.AnyType )
390
398
391
399
js.JSMethodDef (flags, genExpr(jsName), formalArgs, restParam, body)(
392
- OptimizerHints .empty, None )
400
+ OptimizerHints .empty, Unversioned )
393
401
}
394
402
395
403
def genOverloadDispatch (jsName : JSName , alts : List [Exported ], tpe : jstpe.Type )(
0 commit comments