Skip to content

Commit 9981ae1

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 2ea6b17 commit 9981ae1

File tree

9 files changed

+94
-206
lines changed

9 files changed

+94
-206
lines changed

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

+10-9
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._
@@ -1205,19 +1206,19 @@ object Denotations {
12051206
}
12061207
else owner
12071208
}
1208-
def recur(path: Name, wrap: Name => Name = identity): Denotation = path match {
1209+
def recur(path: Name, wrap: TermName => Name = identity): Denotation = path match {
12091210
case path: TypeName =>
1210-
recur(path.toTermName, n => wrap(n.toTypeName))
1211-
case DerivedTermName(prefix, NameInfo.ModuleClass) =>
1212-
recur(prefix, n => wrap(n.derived(NameInfo.ModuleClass)))
1213-
case DerivedTermName(prefix, NameInfo.Select(selector)) =>
1211+
recur(path.toTermName, n => n.toTypeName)
1212+
case ModuleClassName(underlying) =>
1213+
recur(underlying, n => wrap(ModuleClassName(n)))
1214+
case QualifiedName(prefix, selector) =>
12141215
select(recur(prefix), wrap(selector))
1215-
case DerivedTermName(prefix, qual: NameInfo.Qualified) =>
1216-
recur(prefix, n => wrap(n ++ qual.separator ++ qual.name))
1216+
case AnyQualifiedName(prefix, info) =>
1217+
recur(prefix, n => wrap(info.mkString(n).toTermName))
12171218
case path: SimpleTermName =>
1218-
def recurSimple(len: Int, wrap: Name => Name): Denotation = {
1219+
def recurSimple(len: Int, wrap: TermName => Name): Denotation = {
12191220
val point = path.lastIndexOf('.', len - 1)
1220-
val selector = wrap(path.slice(point + 1, len))
1221+
val selector = wrap(path.slice(point + 1, len).asTermName)
12211222
val prefix =
12221223
if (point > 0) recurSimple(point, identity)
12231224
else if (selector.isTermName) defn.RootClass.denot

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

-122
This file was deleted.

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

+22-21
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

@@ -414,7 +415,7 @@ object NameOps {
414415
if (name.isSetterName) {
415416
if (name.isTraitSetterName) {
416417
if (Config.semanticNames) {
417-
val DerivedTermName(_, NameInfo.TraitSetter(original)) = name
418+
val TraitSetterName(_, original) = name
418419
original.fieldName
419420
}
420421
else {
@@ -442,7 +443,7 @@ object NameOps {
442443
* @note Default getter name suffixes start at 1, so `pos` has to be adjusted by +1
443444
*/
444445
def defaultGetterName(pos: Int): TermName =
445-
if (Config.semanticNames) name.derived(NameInfo.DefaultGetter(pos))
446+
if (Config.semanticNames) DefaultGetterName(name, pos)
446447
else {
447448
val prefix = if (name.isConstructorName) DEFAULT_GETTER_INIT else name
448449
prefix ++ DEFAULT_GETTER ++ (pos + 1).toString
@@ -452,7 +453,7 @@ object NameOps {
452453
def defaultGetterToMethod: TermName =
453454
if (Config.semanticNames)
454455
name rewrite {
455-
case DerivedTermName(methName, NameInfo.DefaultGetter(_)) => methName
456+
case DefaultGetterName(methName, _) => methName
456457
}
457458
else defaultGetterToMethodOfMangled
458459

@@ -469,7 +470,7 @@ object NameOps {
469470
def defaultGetterIndex: Int =
470471
if (Config.semanticNames)
471472
name collect {
472-
case DerivedTermName(methName, NameInfo.DefaultGetter(num)) => num
473+
case DefaultGetterName(_, num) => num
473474
} getOrElse -1
474475
else defaultGetterIndexOfMangled
475476

@@ -574,7 +575,7 @@ object NameOps {
574575
if (Config.semanticNames && name.isSimple)
575576
SuperAccessorName.tryUnmangle(name.lastPart) match {
576577
case scala.Some(original) =>
577-
name.mapLast(_ => original.asSimpleName).derived(NameInfo.SuperAccessor)
578+
SuperAccessorName(name.mapLast(_ => original.asSimpleName))
578579
case None =>
579580
name
580581
}

0 commit comments

Comments
 (0)