Skip to content

Commit 57ddd2b

Browse files
committed
Fix converting Prefix/Suffix names to strings
The previous logic would have applied several suffixes in reverse.
1 parent ac1415f commit 57ddd2b

File tree

2 files changed

+17
-15
lines changed

2 files changed

+17
-15
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ object NameKinds {
9191
class PrefixNameKind(tag: Int, prefix: String, optInfoString: String = "")
9292
extends ClassifiedNameKind(tag, if (optInfoString.isEmpty) s"Prefix $prefix" else optInfoString) {
9393
def mkString(underlying: TermName, info: ThisInfo) =
94-
underlying.mapLast(n => termName(prefix + str.sanitize(n.toString))).toString
94+
underlying.qualToString(_.toString, n => prefix + n.toString)
9595
override def unmangle(name: SimpleName): TermName =
9696
if (name.startsWith(prefix)) apply(name.drop(prefix.length).asSimpleName)
9797
else name
@@ -101,7 +101,7 @@ object NameKinds {
101101
class SuffixNameKind(tag: Int, suffix: String, optInfoString: String = "")
102102
extends ClassifiedNameKind(tag, if (optInfoString.isEmpty) s"Suffix $suffix" else optInfoString) {
103103
def mkString(underlying: TermName, info: ThisInfo) =
104-
underlying.mapLast(n => termName(str.sanitize(n.toString) + suffix)).toString
104+
underlying.qualToString(_.toString, n => n.toString + suffix)
105105
override def unmangle(name: SimpleName): TermName =
106106
if (name.endsWith(suffix)) apply(name.take(name.length - suffix.length).asSimpleName)
107107
else name

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

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -93,11 +93,6 @@ object Names {
9393
/** Apply `f` to all simple term names making up this name */
9494
def mapParts(f: SimpleName => SimpleName): ThisName
9595

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-
10196
/** A name in the same (term or type) namespace as this name and
10297
* with same characters as given `name`.
10398
*/
@@ -265,16 +260,24 @@ object Names {
265260
}
266261

267262
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-
}
263+
if (myMangledString == null)
264+
myMangledString = qualToString(_.mangledString, _.mangled.toString)
275265
myMangledString
276266
}
277267

268+
/** If this a qualified name, split it into underlyng, last part, and separator
269+
* Otherwise return an empty name, the name itself, and "")
270+
*/
271+
def split: (TermName, TermName, String)
272+
273+
/** Convert to string as follows. If this is a qualified name
274+
* `<first> <sep> <last>`, the sanitized version of `f1(<first>) <sep> f2(<last>)`.
275+
* Otherwise `f2` applied to this name.
276+
*/
277+
def qualToString(f1: TermName => String, f2: TermName => String) = {
278+
val (first, last, sep) = split
279+
if (first.isEmpty) f2(last) else str.sanitize(f1(first) + sep + f2(last))
280+
}
278281
}
279282

280283
/** A simple name is essentiall an interned string */
@@ -437,7 +440,6 @@ object Names {
437440
override def collect[T](f: PartialFunction[Name, T]): Option[T] = toTermName.collect(f)
438441
override def mapLast(f: SimpleName => SimpleName) = toTermName.mapLast(f).toTypeName
439442
override def mapParts(f: SimpleName => SimpleName) = toTermName.mapParts(f).toTypeName
440-
override def split = toTermName.split
441443

442444
override def likeSpaced(name: Name): TypeName = name.toTypeName
443445

0 commit comments

Comments
 (0)