Skip to content

Commit 0698383

Browse files
committed
Add NameExtractors
Use a new scheme for creating and accessing semantic names which is based on semantic name extractors with nested info classes.
1 parent 606294c commit 0698383

File tree

9 files changed

+90
-202
lines changed

9 files changed

+90
-202
lines changed

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

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import SymDenotations.{ SymDenotation, ClassDenotation, NoDenotation }
66
import Contexts.{Context, ContextBase}
77
import Names._
88
import NameOps._
9+
import NameExtractors._
910
import StdNames._
1011
import Symbols.NoSymbol
1112
import Symbols._
@@ -1185,19 +1186,19 @@ object Denotations {
11851186
}
11861187
else owner
11871188
}
1188-
def recur(path: Name, wrap: Name => Name = identity): Denotation = path match {
1189+
def recur(path: Name, wrap: TermName => Name = identity): Denotation = path match {
11891190
case path: TypeName =>
1190-
recur(path.toTermName, n => wrap(n.toTypeName))
1191-
case DerivedTermName(prefix, NameInfo.ModuleClass) =>
1192-
recur(prefix, n => wrap(n.derived(NameInfo.ModuleClass)))
1193-
case DerivedTermName(prefix, NameInfo.Select(selector)) =>
1191+
recur(path.toTermName, n => n.toTypeName)
1192+
case ModuleClassName(underlying) =>
1193+
recur(underlying, n => wrap(ModuleClassName(n)))
1194+
case QualifiedName(prefix, selector) =>
11941195
select(recur(prefix), wrap(selector))
1195-
case DerivedTermName(prefix, qual: NameInfo.Qualified) =>
1196-
recur(prefix, n => wrap(n ++ qual.separator ++ qual.name))
1196+
case AnyQualifiedName(prefix, info) =>
1197+
recur(prefix, n => wrap(info.mkString(n).toTermName))
11971198
case path: SimpleTermName =>
1198-
def recurSimple(len: Int, wrap: Name => Name): Denotation = {
1199+
def recurSimple(len: Int, wrap: TermName => Name): Denotation = {
11991200
val point = path.lastIndexOf('.', len - 1)
1200-
val selector = wrap(path.slice(point + 1, len))
1201+
val selector = wrap(path.slice(point + 1, len).asTermName)
12011202
val prefix =
12021203
if (point > 0) recurSimple(point, identity)
12031204
else if (selector.isTermName) defn.RootClass.denot

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

Lines changed: 0 additions & 122 deletions
This file was deleted.

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

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ package core
44
import java.security.MessageDigest
55
import scala.annotation.switch
66
import scala.io.Codec
7-
import Names._, StdNames._, Contexts._, Symbols._, Flags._
7+
import Names._, StdNames._, Contexts._, Symbols._, Flags._, NameExtractors._
88
import Decorators.PreNamedString
99
import util.{Chars, NameTransformer}
1010
import Chars.isOperatorPart
@@ -49,14 +49,14 @@ object NameOps {
4949
}
5050
}
5151

52-
class PrefixNameExtractor(pre: TermName, info: NameInfo) {
52+
class PrefixNameExtractor(pre: TermName, bldr: NameExtractors.PrefixNameExtractor) {
5353
def apply(name: TermName): TermName =
54-
if (Config.semanticNames) name.derived(info) else pre ++ name
54+
if (Config.semanticNames) bldr(name) else pre ++ name
5555

5656
def unapply(name: TermName): Option[TermName] =
5757
if (Config.semanticNames)
5858
name match {
59-
case DerivedTermName(original, `info`) => Some(original)
59+
case bldr(original) => Some(original)
6060
case _ => None
6161
}
6262
else tryUnmangle(name)
@@ -66,8 +66,8 @@ object NameOps {
6666
else None
6767
}
6868

69-
object SuperAccessorName extends PrefixNameExtractor(nme.SUPER_PREFIX, NameInfo.SuperAccessor)
70-
object InitializerName extends PrefixNameExtractor(nme.INITIALIZER_PREFIX, NameInfo.Initializer)
69+
object SuperAccessorName extends PrefixNameExtractor(nme.SUPER_PREFIX, NameExtractors.SuperAccessorName)
70+
object InitializerName extends PrefixNameExtractor(nme.INITIALIZER_PREFIX, NameExtractors.InitializerName)
7171

7272
implicit class NameDecorator[N <: Name](val name: N) extends AnyVal {
7373
import nme._
@@ -83,12 +83,12 @@ object NameOps {
8383
def isProtectedAccessorName = name startsWith PROTECTED_PREFIX
8484
def isReplWrapperName = name.toSimpleName containsSlice INTERPRETER_IMPORT_WRAPPER
8585
def isTraitSetterName =
86-
if (Config.semanticNames) name.is(NameInfo.TraitSetterKind)
86+
if (Config.semanticNames) name.is(TraitSetterName)
8787
else name containsSlice TRAIT_SETTER_SEPARATOR
8888
def isSetterName = name endsWith SETTER_SUFFIX
8989
def isSingletonName = name endsWith SINGLETON_SUFFIX
9090
def isModuleClassName =
91-
if (Config.semanticNames) name.is(NameInfo.ModuleClass.kind)
91+
if (Config.semanticNames) name.is(ModuleClassName)
9292
else name endsWith MODULE_SUFFIX
9393
def isAvoidClashName = name endsWith AVOID_CLASH_SUFFIX
9494
def isImportName = name startsWith IMPORT
@@ -138,7 +138,7 @@ object NameOps {
138138

139139
/** Convert this module name to corresponding module class name */
140140
def moduleClassName: TypeName =
141-
if (Config.semanticNames) name.derived(NameInfo.ModuleClass).toTypeName
141+
if (Config.semanticNames) name.derived(ModuleClassName).toTypeName
142142
else (name ++ tpnme.MODULE_SUFFIX).toTypeName
143143

144144
/** Convert this module class name to corresponding source module name */
@@ -147,7 +147,7 @@ object NameOps {
147147
/** If name ends in module class suffix, drop it */
148148
def stripModuleClassSuffix: Name =
149149
if (isModuleClassName)
150-
if (Config.semanticNames) name.exclude(NameInfo.ModuleClass.kind)
150+
if (Config.semanticNames) name.exclude(ModuleClassName)
151151
else name dropRight MODULE_SUFFIX.length
152152
else name
153153

@@ -166,7 +166,7 @@ object NameOps {
166166

167167
/** The superaccessor for method with given name */
168168
def superName: TermName =
169-
if (Config.semanticNames) name.derived(NameInfo.SuperAccessor).toTermName
169+
if (Config.semanticNames) SuperAccessorName(name.toTermName)
170170
else (nme.SUPER_PREFIX ++ name).toTermName
171171

172172
/** The expanded name of `name` relative to given class `base`.
@@ -182,11 +182,11 @@ object NameOps {
182182
likeTyped(
183183
if (Config.semanticNames) {
184184
def qualify(name: SimpleTermName) =
185-
prefix.derived(NameInfo.qualifier(separator.toString)(name))
185+
separatorToQualified(separator.toString)(prefix.toTermName, name)
186186
name rewrite {
187187
case name: SimpleTermName =>
188188
qualify(name)
189-
case DerivedTermName(_, _: NameInfo.Qualified) =>
189+
case AnyQualifiedName(_, _) =>
190190
// Note: an expanded name may itself be expanded. For example, look at javap of scala.App.initCode
191191
qualify(name.toSimpleName)
192192
}
@@ -204,7 +204,7 @@ object NameOps {
204204
def unexpandedName: N =
205205
if (Config.semanticNames)
206206
likeTyped {
207-
name.rewrite { case DerivedTermName(_, NameInfo.Expand(unexp)) => unexp }
207+
name.rewrite { case XpandedName(_, unexp) => unexp }
208208
}
209209
else unexpandedNameOfMangled
210210

@@ -222,7 +222,7 @@ object NameOps {
222222
def expandedPrefix: N =
223223
if (Config.semanticNames)
224224
likeTyped {
225-
name.rewrite { case DerivedTermName(prefix, NameInfo.Expand(_)) => prefix }
225+
name.rewrite { case XpandedName(prefix, _) => prefix }
226226
}
227227
else expandedPrefixOfMangled
228228

@@ -236,7 +236,8 @@ object NameOps {
236236
if (Config.semanticNames && name.isSimple) {
237237
val unmangled = unexpandedNameOfMangled
238238
if (name eq unmangled) name
239-
else likeTyped(expandedPrefixOfMangled.derived(NameInfo.Expand(unmangled.asSimpleName)))
239+
else likeTyped(
240+
XpandedName(expandedPrefixOfMangled.toTermName, unmangled.asSimpleName))
240241
}
241242
else name
242243

@@ -440,7 +441,7 @@ object NameOps {
440441
if (name.isSetterName) {
441442
if (name.isTraitSetterName) {
442443
if (Config.semanticNames) {
443-
val DerivedTermName(_, NameInfo.TraitSetter(original)) = name
444+
val TraitSetterName(_, original) = name
444445
original.fieldName
445446
}
446447
else {
@@ -468,7 +469,7 @@ object NameOps {
468469
* @note Default getter name suffixes start at 1, so `pos` has to be adjusted by +1
469470
*/
470471
def defaultGetterName(pos: Int): TermName =
471-
if (Config.semanticNames) name.derived(NameInfo.DefaultGetter(pos))
472+
if (Config.semanticNames) DefaultGetterName(name, pos)
472473
else {
473474
val prefix = if (name.isConstructorName) DEFAULT_GETTER_INIT else name
474475
prefix ++ DEFAULT_GETTER ++ (pos + 1).toString
@@ -478,7 +479,7 @@ object NameOps {
478479
def defaultGetterToMethod: TermName =
479480
if (Config.semanticNames)
480481
name rewrite {
481-
case DerivedTermName(methName, NameInfo.DefaultGetter(_)) => methName
482+
case DefaultGetterName(methName, _) => methName
482483
}
483484
else defaultGetterToMethodOfMangled
484485

@@ -495,7 +496,7 @@ object NameOps {
495496
def defaultGetterIndex: Int =
496497
if (Config.semanticNames)
497498
name collect {
498-
case DerivedTermName(methName, NameInfo.DefaultGetter(num)) => num
499+
case DefaultGetterName(_, num) => num
499500
} getOrElse -1
500501
else defaultGetterIndexOfMangled
501502

@@ -600,7 +601,7 @@ object NameOps {
600601
if (Config.semanticNames && name.isSimple)
601602
SuperAccessorName.tryUnmangle(name.lastPart) match {
602603
case scala.Some(original) =>
603-
name.mapLast(_ => original.asSimpleName).derived(NameInfo.SuperAccessor)
604+
SuperAccessorName(name.mapLast(_ => original.asSimpleName))
604605
case None =>
605606
name
606607
}

0 commit comments

Comments
 (0)