@@ -49,14 +49,25 @@ object NameOps {
4949 }
5050 }
5151
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+
5456 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
5667 }
5768
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 )
6071
6172 implicit class NameDecorator [N <: Name ](val name : N ) extends AnyVal {
6273 import nme ._
@@ -152,7 +163,9 @@ object NameOps {
152163 }.asInstanceOf [N ]
153164
154165 /** 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
156169
157170 /** The expanded name of `name` relative to given class `base`.
158171 */
@@ -165,9 +178,17 @@ object NameOps {
165178 */
166179 def expandedName (prefix : Name , separator : Name = nme.EXPAND_SEPARATOR ): N =
167180 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+ }
171192 else prefix ++ separator ++ name)
172193
173194 def expandedName (prefix : Name ): N = expandedName(prefix, nme.EXPAND_SEPARATOR )
@@ -178,35 +199,45 @@ object NameOps {
178199 * signs. This can happen for instance if a super accessor is paired with
179200 * an encoded name, e.g. super$$plus$eq. See #765.
180201 */
181- def unexpandedName : N = likeTyped {
202+ def unexpandedName : N =
182203 if (Config .semanticNames)
183- name.rewrite {
184- case DerivedTermName (_, NameInfo .Expand (unexp)) => unexp
204+ likeTyped {
205+ name.rewrite { case DerivedTermName (_, NameInfo .Expand (unexp)) => unexp }
185206 }
186- else {
187- var idx = name.lastIndexOfSlice(nme.EXPAND_SEPARATOR )
207+ else unexpandedNameOfMangled
188208
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 )
193211
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))
196218 }
197219
198- def expandedPrefix : N = likeTyped {
220+ def expandedPrefix : N =
199221 if (Config .semanticNames)
200- name.rewrite {
201- case DerivedTermName (prefix, NameInfo .Expand (_)) => prefix
222+ likeTyped {
223+ name.rewrite { case DerivedTermName (prefix, NameInfo .Expand (_)) => prefix }
202224 }
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))
208231 }
209232
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+
210241 def shadowedName : N = likeTyped(nme.SHADOWED ++ name)
211242
212243 def revertShadowed : N = likeTyped(name.drop(nme.SHADOWED .length))
@@ -415,9 +446,9 @@ object NameOps {
415446 name rewrite {
416447 case DerivedTermName (methName, NameInfo .DefaultGetter (_)) => methName
417448 }
418- else mangledDefaultGetterToMethod
449+ else defaultGetterToMethodOfMangled
419450
420- def mangledDefaultGetterToMethod : TermName = {
451+ def defaultGetterToMethodOfMangled : TermName = {
421452 val p = name.indexOfSlice(DEFAULT_GETTER )
422453 if (p >= 0 ) {
423454 val q = name.take(p).asTermName
@@ -432,9 +463,9 @@ object NameOps {
432463 name collect {
433464 case DerivedTermName (methName, NameInfo .DefaultGetter (num)) => num
434465 } getOrElse - 1
435- else mangledDefaultGetterIndex
466+ else defaultGetterIndexOfMangled
436467
437- def mangledDefaultGetterIndex : Int = {
468+ def defaultGetterIndexOfMangled : Int = {
438469 var i = name.length
439470 while (i > 0 && name(i - 1 ).isDigit) i -= 1
440471 if (i > 0 && i < name.length && name.take(i).endsWith(DEFAULT_GETTER ))
@@ -525,11 +556,21 @@ object NameOps {
525556
526557 def unmangleMethodName : TermName =
527558 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)
530561 else name
531562 }
532563 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
533574 }
534575
535576 private final val FalseSuper = " $$super" .toTermName
0 commit comments