Skip to content

Commit d088249

Browse files
committed
New unmangling for ExpandedName
1 parent 127b4b0 commit d088249

File tree

3 files changed

+40
-45
lines changed

3 files changed

+40
-45
lines changed

compiler/src/dotty/tools/dotc/core/NameKinds.scala

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,9 +151,27 @@ object NameKinds {
151151

152152
val QualifiedName = new QualifiedNameKind(QUALIFIED, ".")
153153
val FlattenedName = new QualifiedNameKind(FLATTENED, "$")
154-
val ExpandedName = new QualifiedNameKind(EXPANDED, str.EXPAND_SEPARATOR)
155154
val TraitSetterName = new QualifiedNameKind(TRAITSETTER, str.TRAIT_SETTER_SEPARATOR)
156155

156+
val ExpandedName = new QualifiedNameKind(EXPANDED, str.EXPAND_SEPARATOR) {
157+
private val FalseSuper = "$$super".toTermName
158+
private val FalseSuperLength = FalseSuper.length
159+
160+
override def unmangle(name: SimpleTermName): TermName = {
161+
var i = name.lastIndexOfSlice(str.EXPAND_SEPARATOR)
162+
if (i < 0) name
163+
else {
164+
// Hack to make super accessors from traits work. They would otherwise fail because of #765
165+
// The problem is that in `x$$super$$plus` the expansion prefix needs to be `x`
166+
// instead of `x$$super`.
167+
if (i > FalseSuperLength && name.slice(i - FalseSuperLength, i) == FalseSuper)
168+
i -= FalseSuper.length
169+
170+
apply(name.take(i).asTermName, name.drop(i + str.EXPAND_SEPARATOR.length).asSimpleName)
171+
}
172+
}
173+
}
174+
157175
val UniqueName = new UniqueNameKind("$") {
158176
override def mkString(underlying: TermName, info: ThisInfo) =
159177
if (underlying.isEmpty) "$" + info.num + "$" else super.mkString(underlying, info)

compiler/src/dotty/tools/dotc/core/NameOps.scala

Lines changed: 17 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -151,17 +151,6 @@ object NameOps {
151151
name.rewrite { case ExpandedName(_, unexp) => unexp }
152152
}
153153

154-
def unexpandedNameOfMangled: N = likeTyped {
155-
var idx = name.lastIndexOfSlice(nme.EXPAND_SEPARATOR)
156-
157-
// Hack to make super accessors from traits work. They would otherwise fail because of #765
158-
// TODO: drop this once we have more robust name handling
159-
if (idx > FalseSuperLength && name.slice(idx - FalseSuperLength, idx) == FalseSuper)
160-
idx -= FalseSuper.length
161-
162-
if (idx < 0) name else (name drop (idx + nme.EXPAND_SEPARATOR.length))
163-
}
164-
165154
def expandedPrefix: N = likeTyped { name.exclude(ExpandedName) }
166155

167156
def expandedPrefixOfMangled: N = {
@@ -170,15 +159,6 @@ object NameOps {
170159
likeTyped(name.take(idx))
171160
}
172161

173-
def unmangleExpandedName: N =
174-
if (name.isSimple) {
175-
val unmangled = unexpandedNameOfMangled
176-
if (name eq unmangled) name
177-
else likeTyped(
178-
ExpandedName(expandedPrefixOfMangled.toTermName, unmangled.asSimpleName))
179-
}
180-
else name
181-
182162
def implClassName: N = likeTyped(name ++ tpnme.IMPL_CLASS_SUFFIX)
183163

184164
def errorName: N = likeTyped(name ++ nme.ERROR)
@@ -323,6 +303,23 @@ object NameOps {
323303

324304
/** If name length exceeds allowable limit, replace part of it by hash */
325305
def compactified(implicit ctx: Context): TermName = termName(compactify(name.toString))
306+
307+
def unmangle(kind: NameKind): N = likeTyped {
308+
name rewrite {
309+
case unmangled: SimpleTermName =>
310+
kind.unmangle(unmangled)
311+
case ExpandedName(prefix, last) =>
312+
kind.unmangle(last) rewrite {
313+
case kernel: SimpleTermName =>
314+
ExpandedName(prefix, kernel)
315+
}
316+
}
317+
}
318+
319+
def unmangle(kinds: List[NameKind]): N = {
320+
val unmangled = (name /: kinds)(_.unmangle(_))
321+
if (unmangled eq name) name else unmangled.unmangle(kinds)
322+
}
326323
}
327324

328325
// needed???
@@ -442,26 +439,6 @@ object NameOps {
442439
case NO_NAME => primitivePostfixMethodName
443440
case name => name
444441
}
445-
446-
def unmangleSuperName: TermName =
447-
if (name.isSimple && name.startsWith(str.SUPER_PREFIX))
448-
SuperAccessorName(name.drop(str.SUPER_PREFIX.length).asTermName)
449-
else name
450-
451-
def unmangle(kind: NameKind): TermName = name rewrite {
452-
case unmangled: SimpleTermName =>
453-
kind.unmangle(unmangled)
454-
case ExpandedName(prefix, last) =>
455-
kind.unmangle(last) rewrite {
456-
case kernel: SimpleTermName =>
457-
ExpandedName(prefix, kernel)
458-
}
459-
}
460-
461-
def unmangle(kinds: List[NameKind]): TermName = {
462-
val unmangled = (name /: kinds)(_.unmangle(_))
463-
if (unmangled eq name) name else unmangled.unmangle(kinds)
464-
}
465442
}
466443

467444
private final val FalseSuper = "$$super".toTermName

compiler/src/dotty/tools/dotc/core/unpickleScala2/Scala2Unpickler.scala

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import java.lang.Double.longBitsToDouble
99

1010
import Contexts._, Symbols._, Types._, Scopes._, SymDenotations._, Names._, NameOps._
1111
import StdNames._, Denotations._, NameOps._, Flags._, Constants._, Annotations._
12-
import NameKinds.Scala2MethodNameKinds
12+
import NameKinds.{Scala2MethodNameKinds, SuperAccessorName, ExpandedName}
1313
import dotty.tools.dotc.typer.ProtoTypes.{FunProtoTyped, FunProto}
1414
import util.Positions._
1515
import dotty.tools.dotc.ast.{tpd, Trees, untpd}, ast.tpd._
@@ -437,12 +437,12 @@ class Scala2Unpickler(bytes: Array[Byte], classRoot: ClassDenotation, moduleClas
437437
if (name == nme.TRAIT_CONSTRUCTOR) nme.CONSTRUCTOR
438438
else name.asTermName.unmangle(Scala2MethodNameKinds)
439439
}
440-
if (flags is Scala2ExpandedName) {
441-
name = name.unmangleExpandedName
440+
if ((flags is Scala2ExpandedName) && name.isSimple) {
441+
name = name.unmangle(ExpandedName)
442442
flags = flags &~ Scala2ExpandedName
443443
}
444444
if (flags is Scala2SuperAccessor) {
445-
name = name.asTermName.unmangleSuperName
445+
name = name.asTermName.unmangle(SuperAccessorName)
446446
flags = flags &~ Scala2SuperAccessor
447447
}
448448

0 commit comments

Comments
 (0)