@@ -16,30 +16,51 @@ package internal
16
16
17
17
import java .util .concurrent .ConcurrentHashMap
18
18
19
+ import scala .reflect .api .NameTableApi
20
+
19
21
trait Names extends api.Names {
20
- def nameTableSize : Int = cache.size
22
+ type NameTable = scala.reflect.internal.NameTable
23
+ override val nameTable : NameTable = newNameTable
21
24
22
- override final type Name = AName
23
- override final type TypeName = TermNameImpl # TypeNameImpl
24
- override final type TermName = TermNameImpl
25
+ protected def newNameTable : NameTable = new NameTable
26
+
27
+ def nameTableSize : Int = nameTable.nameTableSize
28
+ override final type Name = nameTable.AName
29
+ override final type TypeName = nameTable.TypeNameImpl
30
+ override final type TermName = nameTable.TermNameImpl
25
31
26
32
implicit final val NameTag = ClassTag [Name ](classOf [Name ])
27
33
implicit final val TermNameTag = ClassTag [TermName ](classOf [TermName ])
28
34
implicit final val TypeNameTag = ClassTag [TypeName ](classOf [TypeName ])
29
35
30
-
31
- override object TermName extends TermNameExtractor {
32
- @ inline override def apply (s : String ): TermName = newTermName(s)
33
- override def unapply (name : TermName ): Option [String ] = Some (name.rawString)
36
+ override final def newTypeName (value : String ): TypeName = nameTable.newTypeName(value)
37
+ override final def newTermName (value : String ): TermName = nameTable.newTermName(value)
38
+ object TermName extends TermNameExtractor {
39
+ def apply (s : String ) = newTermName(s)
40
+ def unapply (name : TermName ): Option [String ] = Some (name.toString)
34
41
}
35
- override object TypeName extends TypeNameExtractor {
36
- @ inline override def apply (s : String ): TypeName = newTypeName(s)
37
- override def unapply (name : TypeName ): Option [String ] = Some (name.rawString )
42
+ object TypeName extends TypeNameExtractor {
43
+ def apply (s : String ) = newTypeName(s)
44
+ def unapply (name : TypeName ): Option [String ] = Some (name.toString )
38
45
}
39
- override final def newTypeName (value : String ): TypeName = newTermName(value).companionName
46
+ // deprecated stuff
47
+ @ deprecated
48
+ @ inline final def newTermNameCached (s : String ): TermName = newTermName(s)
49
+
50
+ @ deprecated
51
+ @ inline final def newTypeNameCached (s : String ): TypeName = newTypeName(s)
52
+ }
53
+ class NameTable extends NameTableApi {
54
+ override final type Name = AName
55
+ override final type TypeName = TypeNameImpl
56
+ override final type TermName = TermNameImpl
57
+
58
+ def nameTableSize : Int = cache.size
59
+
60
+ private [this ] final val cache = new ConcurrentHashMap [String , TermNameImpl ](1000 , 0.75F , 1 )
40
61
41
- override final def newTermName (value : String ): TermName = {
42
- // TODO consider a better structure to use than a CHM
62
+ override final def newTermName (value : String ): TermNameImpl = {
63
+ // TODO consider a better structure to use than a CHM
43
64
var res = cache.get(value)
44
65
if (res eq null ) {
45
66
val next = new TermNameImpl (value)
@@ -50,25 +71,22 @@ trait Names extends api.Names {
50
71
res
51
72
// same as cache.computeIfAbsent(value, new NameHolder(_)) but faster
52
73
}
53
- private [this ] final val cache = new ConcurrentHashMap [String , TermName ](1000 , 0.75F , 1 )
54
- // deprecated stuff
55
- @ deprecated @ inline final def newTermNameCached (s : String ): TermName = newTermName(s)
56
- @ deprecated @ inline final def newTypeNameCached (s : String ): TypeName = newTypeName(s)
74
+ final def newTypeName (value: String ): TypeName = newTermName(value).companionName
57
75
58
76
abstract sealed class AName extends NameApi with CharSequence {
59
77
type ThisNameType <: AName
60
78
@ inline override final def length (): Int = value.length
61
79
override final def subSequence (start : Int , end : Int ): CharSequence = value.subSequence(start, end)
62
80
override def decoded : String = decodedName.toString
63
81
override def encoded : String = encodedName.toString
64
- @ inline private [Names ] def rawString = value
65
- override def decodedName : ThisNameType
66
- override def encodedName : ThisNameType
82
+ @ inline private [NameTable ] def rawString = value
83
+ def decodedName : ThisNameType
84
+ def encodedName : ThisNameType
67
85
68
86
// non API methods
69
87
protected def value : String
70
88
71
- def companionName : Name
89
+ def companionName : AName
72
90
73
91
/** Return the subname with characters from from to to-1. */
74
92
def subName (from : Int , to : Int ): ThisNameType =
@@ -250,12 +268,12 @@ trait Names extends api.Names {
250
268
}
251
269
final class TermNameImpl (override val toString : String ) extends AName with TermNameApi {
252
270
type ThisNameType = TermName
271
+
253
272
override def isTermName = true
254
273
override def isTypeName = false
255
274
256
275
override protected def value : String = toString
257
276
258
-
259
277
override def toTermName : TermName = this
260
278
override def toTypeName : TypeName = typeName
261
279
@@ -269,7 +287,7 @@ trait Names extends api.Names {
269
287
def identifier = identifier_ & 0x80FF
270
288
def markAsIdentifier (java : Boolean , newIdentifier : Int ) {
271
289
require((identifier.toShort & 0x80FF ) == identifier.toShort)
272
- val flag = (if (java) 0x1000 else 0x2000 ).toShort
290
+ val flag = (if (java) 0x1000 else 0x2000 ).toShort
273
291
if (identifier_ == 0 ) {
274
292
// first call
275
293
this .identifier_ = (newIdentifier | flag).toShort
@@ -290,31 +308,30 @@ trait Names extends api.Names {
290
308
else this
291
309
}
292
310
override lazy final val encodedName : TermName = {
293
- val res = NameTransformer .encode(value)
294
- if (res == value) this else newName(res)
295
- }
296
-
297
- private lazy val typeName : TypeName = new TypeNameImpl
311
+ val res = NameTransformer .encode(value)
312
+ if (res == value) this else newName(res)
313
+ }
298
314
315
+ private [NameTable ] lazy val typeName : TypeNameImpl = new TypeNameImpl (this )
299
316
300
- final class TypeNameImpl extends AName with TypeNameApi {
301
- type ThisNameType = TypeName
302
- override def isTermName = false
303
- override def isTypeName = true
304
- override def decodedName : TypeName = TermNameImpl .this .decodedName.typeName
305
- override def encodedName : TypeName = TermNameImpl .this .encodedName.typeName
317
+ }
318
+ final class TypeNameImpl (term : TermNameImpl ) extends AName with TypeNameApi {
319
+ type ThisNameType = TypeName
320
+ override def isTermName = false
321
+ override def isTypeName = true
322
+ override def decodedName : TypeName = term.decodedName.typeName
323
+ override def encodedName : TypeName = term.encodedName.typeName
306
324
307
325
308
- override protected def value : String = TermNameImpl . this .toString
309
- override def toString : String = TermNameImpl . this .toString
326
+ override protected def value : String = term .toString
327
+ override def toString : String = term .toString
310
328
311
- override def toTermName : TermName = TermNameImpl . this
312
- override def toTypeName : TypeName = this
329
+ override def toTermName : TermName = term
330
+ override def toTypeName : TypeName = this
313
331
314
- override def companionName = TermNameImpl .this
315
- override def newName (str : String ) = newTypeName(str)
316
- override def nameKind = " type"
317
- def debugString = decoded + " !"
318
- }
332
+ override def companionName = term
333
+ override def newName (str : String ) = newTypeName(str)
334
+ override def nameKind = " type"
335
+ def debugString = decoded + " !"
319
336
}
320
337
}
0 commit comments