11package dotty .tools .backend .sjs
22
3+ import scala .annotation .tailrec
4+
35import scala .collection .mutable
46
57import dotty .tools .FatalError
68
79import dotty .tools .dotc .core ._
10+ import Decorators ._
811import Periods ._
912import SymDenotations ._
1013import Contexts ._
14+ import Flags ._
1115import Types ._
1216import Symbols ._
1317import Denotations ._
@@ -103,11 +107,17 @@ object JSEncoding {
103107 js.Ident (localNames.localSymbolName(sym), Some (sym.unexpandedName.decoded))
104108 }
105109
110+ private [this ] var allRefClassesCache : Set [Symbol ] = _
106111 private def allRefClasses (implicit ctx : Context ): Set [Symbol ] = {
107- // TODO
108- /* (Set(ObjectRefClass, VolatileObjectRefClass) ++
109- refClass.values ++ volatileRefClass.values)*/
110- Set ()
112+ if (allRefClassesCache == null ) {
113+ val baseNames = List (" Object" , " Boolean" , " Character" , " Byte" , " Short" ,
114+ " Int" , " Long" , " Float" , " Double" )
115+ val fullNames = baseNames.flatMap { base =>
116+ List (s " scala.runtime. ${base}Ref " , s " scala.runtime.Volatile ${base}Ref " )
117+ }
118+ allRefClassesCache = fullNames.map(name => ctx.requiredClass(name)).toSet
119+ }
120+ allRefClassesCache
111121 }
112122
113123 def encodeFieldSym (sym : Symbol )(
@@ -120,14 +130,19 @@ object JSEncoding {
120130 if (name0.charAt(name0.length()- 1 ) != ' ' ) name0
121131 else name0.substring(0 , name0.length()- 1 )
122132
133+ @ tailrec
134+ def superClassCount (sym : Symbol , acc : Int ): Int =
135+ if (sym == defn.ObjectClass ) acc
136+ else superClassCount(sym.asClass.superClass, acc + 1 )
137+
123138 /* We have to special-case fields of Ref types (IntRef, ObjectRef, etc.)
124139 * because they are emitted as private by our .scala source files, but
125140 * they are considered public at use site since their symbols come from
126141 * Java-emitted .class files.
127142 */
128143 val idSuffix =
129144 if (sym.is(Flags .Private ) || allRefClasses.contains(sym.owner))
130- sym.owner.asClass.baseClasses.size .toString
145+ superClassCount( sym.owner, 0 ) .toString
131146 else
132147 " f"
133148
0 commit comments