@@ -49,14 +49,25 @@ object NameOps {
49
49
}
50
50
}
51
51
52
- class PrefixNameExtractor (pre : TermName ) {
53
- def apply (name : TermName ): TermName = pre ++ name
52
+ class PrefixNameExtractor (pre : TermName , info : NameInfo ) {
53
+ def apply (name : TermName ): TermName =
54
+ if (Config .semanticNames) name.derived(info) else pre ++ name
55
+
54
56
def unapply (name : TermName ): Option [TermName ] =
55
- if (name startsWith pre) Some (name.drop(pre.length).asTermName) else None
57
+ if (Config .semanticNames)
58
+ name match {
59
+ case DerivedTermName (original, `info`) => Some (original)
60
+ case _ => None
61
+ }
62
+ else tryUnmangle(name)
63
+
64
+ def tryUnmangle (name : TermName ): Option [TermName ] =
65
+ if (name startsWith pre) Some (name.drop(pre.length).asTermName)
66
+ else None
56
67
}
57
68
58
- object SuperAccessorName extends PrefixNameExtractor (nme.SUPER_PREFIX )
59
- object InitializerName extends PrefixNameExtractor (nme.INITIALIZER_PREFIX )
69
+ object SuperAccessorName extends PrefixNameExtractor (nme.SUPER_PREFIX , NameInfo . SuperAccessor )
70
+ object InitializerName extends PrefixNameExtractor (nme.INITIALIZER_PREFIX , NameInfo . Initializer )
60
71
61
72
implicit class NameDecorator [N <: Name ](val name : N ) extends AnyVal {
62
73
import nme ._
@@ -152,7 +163,9 @@ object NameOps {
152
163
}.asInstanceOf [N ]
153
164
154
165
/** The superaccessor for method with given name */
155
- def superName : TermName = (nme.SUPER_PREFIX ++ name).toTermName
166
+ def superName : TermName =
167
+ if (Config .semanticNames) name.derived(NameInfo .SuperAccessor ).toTermName
168
+ else (nme.SUPER_PREFIX ++ name).toTermName
156
169
157
170
/** The expanded name of `name` relative to given class `base`.
158
171
*/
@@ -165,9 +178,17 @@ object NameOps {
165
178
*/
166
179
def expandedName (prefix : Name , separator : Name = nme.EXPAND_SEPARATOR ): N =
167
180
likeTyped(
168
- if (Config .semanticNames)
169
- prefix.derived(NameInfo .qualifier(separator.toString)(name.toSimpleName))
170
- // note: expanded name may itself be expanded. For example, look at javap of scala.App.initCode
181
+ if (Config .semanticNames) {
182
+ def qualify (name : SimpleTermName ) =
183
+ prefix.derived(NameInfo .qualifier(separator.toString)(name))
184
+ name rewrite {
185
+ case name : SimpleTermName =>
186
+ qualify(name)
187
+ case DerivedTermName (_, _ : NameInfo .Qualified ) =>
188
+ // Note: an expanded name may itself be expanded. For example, look at javap of scala.App.initCode
189
+ qualify(name.toSimpleName)
190
+ }
191
+ }
171
192
else prefix ++ separator ++ name)
172
193
173
194
def expandedName (prefix : Name ): N = expandedName(prefix, nme.EXPAND_SEPARATOR )
@@ -178,35 +199,45 @@ object NameOps {
178
199
* signs. This can happen for instance if a super accessor is paired with
179
200
* an encoded name, e.g. super$$plus$eq. See #765.
180
201
*/
181
- def unexpandedName : N = likeTyped {
202
+ def unexpandedName : N =
182
203
if (Config .semanticNames)
183
- name.rewrite {
184
- case DerivedTermName (_, NameInfo .Expand (unexp)) => unexp
204
+ likeTyped {
205
+ name.rewrite { case DerivedTermName (_, NameInfo .Expand (unexp)) => unexp }
185
206
}
186
- else {
187
- var idx = name.lastIndexOfSlice(nme.EXPAND_SEPARATOR )
207
+ else unexpandedNameOfMangled
188
208
189
- // Hack to make super accessors from traits work. They would otherwise fail because of #765
190
- // TODO: drop this once we have more robust name handling
191
- if (idx > FalseSuperLength && name.slice(idx - FalseSuperLength , idx) == FalseSuper )
192
- idx -= FalseSuper .length
209
+ def unexpandedNameOfMangled : N = likeTyped {
210
+ var idx = name.lastIndexOfSlice(nme.EXPAND_SEPARATOR )
193
211
194
- if (idx < 0 ) name else (name drop (idx + nme.EXPAND_SEPARATOR .length))
195
- }
212
+ // Hack to make super accessors from traits work. They would otherwise fail because of #765
213
+ // TODO: drop this once we have more robust name handling
214
+ if (idx > FalseSuperLength && name.slice(idx - FalseSuperLength , idx) == FalseSuper )
215
+ idx -= FalseSuper .length
216
+
217
+ if (idx < 0 ) name else (name drop (idx + nme.EXPAND_SEPARATOR .length))
196
218
}
197
219
198
- def expandedPrefix : N = likeTyped {
220
+ def expandedPrefix : N =
199
221
if (Config .semanticNames)
200
- name.rewrite {
201
- case DerivedTermName (prefix, NameInfo .Expand (_)) => prefix
222
+ likeTyped {
223
+ name.rewrite { case DerivedTermName (prefix, NameInfo .Expand (_)) => prefix }
202
224
}
203
- else {
204
- val idx = name.lastIndexOfSlice(nme.EXPAND_SEPARATOR )
205
- assert(idx >= 0 )
206
- name.take(idx)
207
- }
225
+ else expandedPrefixOfMangled
226
+
227
+ def expandedPrefixOfMangled : N = {
228
+ val idx = name.lastIndexOfSlice(nme.EXPAND_SEPARATOR )
229
+ assert(idx >= 0 )
230
+ likeTyped(name.take(idx))
208
231
}
209
232
233
+ def unmangleExpandedName : N =
234
+ if (Config .semanticNames && name.isSimple) {
235
+ val unmangled = unexpandedNameOfMangled
236
+ if (name eq unmangled) name
237
+ else likeTyped(expandedPrefixOfMangled.derived(NameInfo .Expand (unmangled.asSimpleName)))
238
+ }
239
+ else name
240
+
210
241
def shadowedName : N = likeTyped(nme.SHADOWED ++ name)
211
242
212
243
def revertShadowed : N = likeTyped(name.drop(nme.SHADOWED .length))
@@ -415,9 +446,9 @@ object NameOps {
415
446
name rewrite {
416
447
case DerivedTermName (methName, NameInfo .DefaultGetter (_)) => methName
417
448
}
418
- else mangledDefaultGetterToMethod
449
+ else defaultGetterToMethodOfMangled
419
450
420
- def mangledDefaultGetterToMethod : TermName = {
451
+ def defaultGetterToMethodOfMangled : TermName = {
421
452
val p = name.indexOfSlice(DEFAULT_GETTER )
422
453
if (p >= 0 ) {
423
454
val q = name.take(p).asTermName
@@ -432,9 +463,9 @@ object NameOps {
432
463
name collect {
433
464
case DerivedTermName (methName, NameInfo .DefaultGetter (num)) => num
434
465
} getOrElse - 1
435
- else mangledDefaultGetterIndex
466
+ else defaultGetterIndexOfMangled
436
467
437
- def mangledDefaultGetterIndex : Int = {
468
+ def defaultGetterIndexOfMangled : Int = {
438
469
var i = name.length
439
470
while (i > 0 && name(i - 1 ).isDigit) i -= 1
440
471
if (i > 0 && i < name.length && name.take(i).endsWith(DEFAULT_GETTER ))
@@ -525,11 +556,21 @@ object NameOps {
525
556
526
557
def unmangleMethodName : TermName =
527
558
if (Config .semanticNames && name.isSimple) {
528
- val idx = name.mangledDefaultGetterIndex
529
- if (idx >= 0 ) name.mangledDefaultGetterToMethod .defaultGetterName(idx)
559
+ val idx = name.defaultGetterIndexOfMangled
560
+ if (idx >= 0 ) name.defaultGetterToMethodOfMangled .defaultGetterName(idx)
530
561
else name
531
562
}
532
563
else name
564
+
565
+ def unmangleSuperName : TermName =
566
+ if (Config .semanticNames && name.isSimple)
567
+ SuperAccessorName .tryUnmangle(name.lastPart) match {
568
+ case scala.Some (original) =>
569
+ name.mapLast(_ => original.asSimpleName).derived(NameInfo .SuperAccessor )
570
+ case None =>
571
+ name
572
+ }
573
+ else name
533
574
}
534
575
535
576
private final val FalseSuper = " $$super" .toTermName
0 commit comments