@@ -66,20 +66,13 @@ object Names {
66
66
/** This name converted to a simple term name */
67
67
def toSimpleName : SimpleName
68
68
69
- @ sharable // because it's just a cache for performance
70
- private [this ] var myMangled : Name = null
71
-
72
- protected [Names ] def mangle : ThisName
73
-
74
69
/** This name converted to a simple term name and in addition
75
70
* with all symbolic operator characters expanded.
76
71
*/
77
- final def mangled : ThisName = {
78
- if (myMangled == null ) myMangled = mangle
79
- myMangled.asInstanceOf [ThisName ]
80
- }
72
+ def mangled : ThisName
81
73
82
- def mangledString : String = mangled.toString
74
+ /** Convert to string after mangling */
75
+ def mangledString : String
83
76
84
77
/** Apply rewrite rule given by `f` to some part of this name, skipping and rewrapping
85
78
* other decorators.
@@ -100,6 +93,11 @@ object Names {
100
93
/** Apply `f` to all simple term names making up this name */
101
94
def mapParts (f : SimpleName => SimpleName ): ThisName
102
95
96
+ /** If this a qualified name, split it into underlyng, last part, and separator
97
+ * Otherwise return an empty name, the name itself, and "")
98
+ */
99
+ def split : (TermName , TermName , String )
100
+
103
101
/** A name in the same (term or type) namespace as this name and
104
102
* with same characters as given `name`.
105
103
*/
@@ -252,6 +250,31 @@ object Names {
252
250
thisKind == kind ||
253
251
! thisKind.definesNewName && thisKind.tag > kind.tag && underlying.is(kind)
254
252
}
253
+
254
+ @ sharable // because it's just a cache for performance
255
+ private [Names ] var myMangledString : String = null
256
+
257
+ @ sharable // because it's just a cache for performance
258
+ private [this ] var myMangled : Name = null
259
+
260
+ protected [Names ] def mangle : ThisName
261
+
262
+ final def mangled : ThisName = {
263
+ if (myMangled == null ) myMangled = mangle
264
+ myMangled.asInstanceOf [ThisName ]
265
+ }
266
+
267
+ final def mangledString : String = {
268
+ if (myMangledString == null ) {
269
+ val (prefix, suffix, separator) = split
270
+ val mangledSuffix = suffix.mangled.toString
271
+ myMangledString =
272
+ if (prefix.isEmpty) mangledSuffix
273
+ else str.sanitize(prefix.mangledString + separator + mangledSuffix)
274
+ }
275
+ myMangledString
276
+ }
277
+
255
278
}
256
279
257
280
/** A simple name is essentiall an interned string */
@@ -317,6 +340,7 @@ object Names {
317
340
override def collect [T ](f : PartialFunction [Name , T ]): Option [T ] = f.lift(this )
318
341
override def mapLast (f : SimpleName => SimpleName ) = f(this )
319
342
override def mapParts (f : SimpleName => SimpleName ) = f(this )
343
+ override def split = (EmptyTermName , this , " " )
320
344
321
345
override def encode : SimpleName = {
322
346
val dontEncode =
@@ -391,9 +415,6 @@ object Names {
391
415
.contains(elem.getMethodName))
392
416
}
393
417
394
- def sliceToString (from : Int , end : Int ) =
395
- if (end <= from) " " else new String (chrs, start + from, end - from)
396
-
397
418
def debugString : String = toString
398
419
}
399
420
@@ -409,12 +430,14 @@ object Names {
409
430
410
431
override def asSimpleName = toTermName.asSimpleName
411
432
override def toSimpleName = toTermName.toSimpleName
412
- override final def mangle = toTermName.mangle.toTypeName
433
+ override def mangled = toTermName.mangled.toTypeName
434
+ override def mangledString = toTermName.mangledString
413
435
414
436
override def rewrite (f : PartialFunction [Name , Name ]): ThisName = toTermName.rewrite(f).toTypeName
415
437
override def collect [T ](f : PartialFunction [Name , T ]): Option [T ] = toTermName.collect(f)
416
438
override def mapLast (f : SimpleName => SimpleName ) = toTermName.mapLast(f).toTypeName
417
439
override def mapParts (f : SimpleName => SimpleName ) = toTermName.mapParts(f).toTypeName
440
+ override def split = toTermName.split
418
441
419
442
override def likeSpaced (name : Name ): TypeName = name.toTypeName
420
443
@@ -470,6 +493,14 @@ object Names {
470
493
case _ => underlying.mapParts(f).derived(info)
471
494
}
472
495
496
+ override def split = info match {
497
+ case info : QualifiedInfo =>
498
+ (underlying, info.name, info.kind.asInstanceOf [QualifiedNameKind ].separator)
499
+ case _ =>
500
+ val (prefix, suffix, separator) = underlying.split
501
+ (prefix, suffix.derived(info), separator)
502
+ }
503
+
473
504
override def isEmpty = false
474
505
override def encode : ThisName = underlying.encode.derived(info.map(_.encode))
475
506
override def decode : ThisName = underlying.decode.derived(info.map(_.decode))
0 commit comments