1
1
package dotty .tools .backend .sjs
2
2
3
+ import scala .annotation .tailrec
4
+
3
5
import scala .collection .mutable
4
6
5
7
import dotty .tools .FatalError
6
8
7
9
import dotty .tools .dotc .core ._
10
+ import Decorators ._
8
11
import Periods ._
9
12
import SymDenotations ._
10
13
import Contexts ._
14
+ import Flags ._
11
15
import Types ._
12
16
import Symbols ._
13
17
import Denotations ._
@@ -103,13 +107,6 @@ object JSEncoding {
103
107
js.Ident (localNames.localSymbolName(sym), Some (sym.unexpandedName.decoded))
104
108
}
105
109
106
- private def allRefClasses (implicit ctx : Context ): Set [Symbol ] = {
107
- // TODO
108
- /* (Set(ObjectRefClass, VolatileObjectRefClass) ++
109
- refClass.values ++ volatileRefClass.values)*/
110
- Set ()
111
- }
112
-
113
110
def encodeFieldSym (sym : Symbol )(
114
111
implicit ctx : Context , pos : ir.Position ): js.Ident = {
115
112
require(sym.owner.isClass && sym.isTerm && ! sym.is(Flags .Method ) && ! sym.is(Flags .Module ),
@@ -120,14 +117,19 @@ object JSEncoding {
120
117
if (name0.charAt(name0.length()- 1 ) != ' ' ) name0
121
118
else name0.substring(0 , name0.length()- 1 )
122
119
120
+ @ tailrec
121
+ def superClassCount (sym : Symbol , acc : Int ): Int =
122
+ if (sym == defn.ObjectClass ) acc
123
+ else superClassCount(sym.asClass.superClass, acc + 1 )
124
+
123
125
/* We have to special-case fields of Ref types (IntRef, ObjectRef, etc.)
124
126
* because they are emitted as private by our .scala source files, but
125
127
* they are considered public at use site since their symbols come from
126
128
* Java-emitted .class files.
127
129
*/
128
130
val idSuffix =
129
- if (sym.is(Flags .Private ) || allRefClasses.contains(sym.owner))
130
- sym.owner.asClass.baseClasses.size .toString
131
+ if (sym.is(Flags .Private ) || jsdefn. allRefClasses.contains(sym.owner))
132
+ superClassCount( sym.owner, 0 ) .toString
131
133
else
132
134
" f"
133
135
0 commit comments