Skip to content

Commit af9fabb

Browse files
committed
Add ShadowedName and AvoidClashName
1 parent 1db196d commit af9fabb

11 files changed

+27
-33
lines changed

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
package dotty.tools.dotc
1+
package dotty.tools
2+
package dotc
23
package core
34

45
import Names._
@@ -11,7 +12,7 @@ import collection.mutable
1112

1213
object NameExtractors {
1314

14-
private val extractors = new mutable.HashMap[Int, ClassifiedNameExtractor]
15+
@sharable private val extractors = new mutable.HashMap[Int, ClassifiedNameExtractor]
1516

1617
abstract class NameInfo extends DotClass {
1718
def tag: Int
@@ -124,6 +125,8 @@ object NameExtractors {
124125
val SuperAccessorName = new PrefixNameExtractor(SUPERACCESSOR, str.SUPER_PREFIX, "SuperAccessor")
125126
val InitializerName = new PrefixNameExtractor(INITIALIZER, str.INITIALIZER_PREFIX, "Initializer")
126127
val ShadowedName = new PrefixNameExtractor(SHADOWED, str.SHADOWED_PREFIX, "Shadowed")
128+
val LocalDummyName = new PrefixNameExtractor(LOCALDUMMY, str.LOCAL_DUMMY_PREFIX, "LocalDummy")
129+
val AvoidClashName = new SuffixNameExtractor(AVOIDCLASH, str.AVOID_CLASH_SUFFIX, "AvoidClash")
127130
val ModuleClassName = new SuffixNameExtractor(OBJECTCLASS, "$", "ModuleClass")
128131

129132
object SignedName extends NameExtractor(63) {

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

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -64,10 +64,8 @@ object NameOps {
6464
def isReplWrapperName = name.toSimpleName containsSlice INTERPRETER_IMPORT_WRAPPER
6565
def isSetterName = name endsWith SETTER_SUFFIX
6666
def isSingletonName = name endsWith SINGLETON_SUFFIX
67-
def isAvoidClashName = name endsWith AVOID_CLASH_SUFFIX
6867
def isImportName = name startsWith IMPORT
6968
def isFieldName = name endsWith LOCAL_SUFFIX
70-
def isShadowedName = name.startsWith(nme.SHADOWED)
7169
def isDefaultGetterName = name.isTermName && name.asTermName.defaultGetterIndex >= 0
7270
def isScala2LocalSuffix = name.endsWith(" ")
7371
def isModuleVarName(name: Name): Boolean =
@@ -119,17 +117,10 @@ object NameOps {
119117
/** If name ends in module class suffix, drop it */
120118
def stripModuleClassSuffix: Name = name.exclude(ModuleClassName)
121119

122-
/** Append a suffix so that this name does not clash with another name in the same scope */
123-
def avoidClashName: TermName = (name ++ AVOID_CLASH_SUFFIX).toTermName
124-
125-
/** If name ends in "avoid clash" suffix, drop it */
126-
def stripAvoidClashSuffix: Name =
127-
if (isAvoidClashName) name dropRight AVOID_CLASH_SUFFIX.length else name
128-
129120
/** If flags is a ModuleClass but not a Package, add module class suffix */
130121
def adjustIfModuleClass(flags: Flags.FlagSet): N = {
131122
if (flags is (ModuleClass, butNot = Package)) name.asTypeName.moduleClassName
132-
else stripAvoidClashSuffix
123+
else likeTyped(name.toTermName.exclude(AvoidClashName))
133124
}.asInstanceOf[N]
134125

135126
/** The superaccessor for method with given name */
@@ -192,10 +183,6 @@ object NameOps {
192183
}
193184
else name
194185

195-
def shadowedName: N = likeTyped(nme.SHADOWED ++ name)
196-
197-
def revertShadowed: N = likeTyped(name.drop(nme.SHADOWED.length))
198-
199186
def implClassName: N = likeTyped(name ++ tpnme.IMPL_CLASS_SUFFIX)
200187

201188
def errorName: N = likeTyped(name ++ nme.ERROR)

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -167,13 +167,16 @@ object Names {
167167
}
168168
}
169169

170+
private def rewrap(underlying: TermName) =
171+
if (underlying eq this.underlying) this else underlying.add(info)
172+
170173
/** Return derived name with given `info` and the current
171174
* name as underlying name.
172175
*/
173176
def derived(info: NameInfo): TermName = {
174177
val ownTag = this.info.tag
175178
if (ownTag < info.tag || definesNewName(info.tag)) add(info)
176-
else if (ownTag > info.tag) underlying.derived(info).add(this.info)
179+
else if (ownTag > info.tag) rewrap(underlying.derived(info))
177180
else {
178181
assert(info == this.info)
179182
this
@@ -183,7 +186,7 @@ object Names {
183186
def exclude(kind: NameExtractor): TermName = {
184187
val ownTag = this.info.tag
185188
if (ownTag < kind.tag || definesNewName(ownTag)) this
186-
else if (ownTag > kind.tag) underlying.exclude(kind).add(this.info)
189+
else if (ownTag > kind.tag) rewrap(underlying.exclude(kind))
187190
else underlying
188191
}
189192

@@ -202,9 +205,6 @@ object Names {
202205

203206
def apply(n: Int) = chrs(start + n)
204207

205-
//override def derived(info: NameInfo): TermName = add(info)
206-
//override def is(kind: NameExtractor) = false
207-
208208
private def contains(ch: Char): Boolean = {
209209
var i = 0
210210
while (i < length && chrs(start + i) != ch) i += 1

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ object StdNames {
2121
val SUPER_PREFIX = "super$"
2222
val INITIALIZER_PREFIX = "initial$"
2323
val SHADOWED_PREFIX = "(shadowed)"
24+
val AVOID_CLASH_SUFFIX = "$_avoid_name_clash_$"
25+
val LOCAL_DUMMY_PREFIX = "<local>_" // owner of local blocks
2426
}
2527

2628
abstract class DefinedNames[N <: Name] {
@@ -117,7 +119,6 @@ object StdNames {
117119
val INTERPRETER_WRAPPER_SUFFIX: N = "$object"
118120
val LOCALDUMMY_PREFIX: N = "<local " // owner of local blocks
119121
val MODULE_SUFFIX: N = NameTransformer.MODULE_SUFFIX_STRING
120-
val AVOID_CLASH_SUFFIX: N = "$_avoid_name_clash_$"
121122
val MODULE_VAR_SUFFIX: N = "$module"
122123
val NAME_JOIN: N = NameTransformer.NAME_JOIN_STRING
123124
val USCORE_PARAM_PREFIX: N = "_$"
@@ -128,7 +129,6 @@ object StdNames {
128129
val PROTECTED_PREFIX: N = "protected$"
129130
val PROTECTED_SET_PREFIX: N = PROTECTED_PREFIX + "set"
130131
val ROOT: N = "<root>"
131-
val SHADOWED: N = "(shadowed)" // tag to be used until we have proper name kinds
132132
val SINGLETON_SUFFIX: N = ".type"
133133
val SPECIALIZED_SUFFIX: N = "$sp"
134134
val SUPER_PREFIX: N = "super$"

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,7 @@ object SymDenotations {
247247
*/
248248
def effectiveName(implicit ctx: Context) =
249249
if (this is ModuleClass) name.stripModuleClassSuffix
250-
else name.stripAvoidClashSuffix
250+
else name.exclude(AvoidClashName)
251251

252252
/** The privateWithin boundary, NoSymbol if no boundary is given.
253253
*/

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import Symbols._
77
import Flags._
88
import Names._
99
import StdNames._, NameOps._
10+
import NameExtractors.ShadowedName
1011
import Scopes._
1112
import Constants._
1213
import Contexts._
@@ -1584,7 +1585,7 @@ object Types {
15841585
}
15851586

15861587
protected def asMemberOf(prefix: Type, allowPrivate: Boolean)(implicit ctx: Context): Denotation =
1587-
if (name.isShadowedName) prefix.nonPrivateMember(name.revertShadowed)
1588+
if (name.is(ShadowedName)) prefix.nonPrivateMember(name.exclude(ShadowedName))
15881589
else if (!allowPrivate) prefix.nonPrivateMember(name)
15891590
else prefix.member(name)
15901591

@@ -1720,7 +1721,7 @@ object Types {
17201721
* the public name.
17211722
*/
17221723
def shadowed(implicit ctx: Context): NamedType =
1723-
NamedType(prefix, name.shadowedName)
1724+
NamedType(prefix, name.derived(ShadowedName))
17241725

17251726
override def equals(that: Any) = that match {
17261727
case that: NamedType =>
@@ -1794,7 +1795,7 @@ object Types {
17941795
fixDenot(TermRef.withSig(prefix, name, sig), prefix)
17951796

17961797
override def shadowed(implicit ctx: Context): NamedType =
1797-
fixDenot(TermRef.withSig(prefix, name.shadowedName, sig), prefix)
1798+
fixDenot(TermRef.withSig(prefix, name.derived(ShadowedName), sig), prefix)
17981799

17991800
override def equals(that: Any) = that match {
18001801
case that: TermRefWithSignature =>

compiler/src/dotty/tools/dotc/core/tasty/TastyFormat.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,8 @@ object TastyFormat {
229229
final val SUPERACCESSOR = 20
230230
final val INITIALIZER = 21
231231
final val SHADOWED = 22
232+
final val LOCALDUMMY = 23
233+
final val AVOIDCLASH = 27
232234
final val OBJECTCLASS = 29
233235

234236
final val SIGNED = 63

compiler/src/dotty/tools/dotc/core/tasty/TreePickler.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -352,7 +352,7 @@ class TreePickler(pickler: TastyPickler) {
352352
case Select(qual, name) =>
353353
writeByte(if (name.isTypeName) SELECTtpt else SELECT)
354354
val realName = tree.tpe match {
355-
case tp: NamedType if tp.name.isShadowedName => tp.name
355+
case tp: NamedType if tp.name.is(ShadowedName) => tp.name
356356
case _ => name
357357
}
358358
val sig = tree.tpe.signature

compiler/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -860,7 +860,7 @@ class TreeUnpickler(reader: TastyReader, nameAtRef: NameRef => TermName, posUnpi
860860
val localCtx =
861861
if (name == nme.CONSTRUCTOR) ctx.addMode(Mode.InSuperCall) else ctx
862862
val qual = readTerm()(localCtx)
863-
val unshadowed = if (name.isShadowedName) name.revertShadowed else name
863+
val unshadowed = name.exclude(ShadowedName)
864864
untpd.Select(qual, unshadowed).withType(tpf(qual.tpe.widenIfUnstable))
865865
}
866866

compiler/src/dotty/tools/dotc/transform/Erasure.scala

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import core.Types._
1111
import core.Names._
1212
import core.StdNames._
1313
import core.NameOps._
14+
import core.NameExtractors.ShadowedName
1415
import core.Decorators._
1516
import core.Constants._
1617
import core.Definitions._
@@ -363,7 +364,7 @@ object Erasure extends TypeTestsCasts{
363364

364365
def select(qual: Tree, sym: Symbol): Tree = {
365366
val name = tree.typeOpt match {
366-
case tp: NamedType if tp.name.isShadowedName => sym.name.shadowedName
367+
case tp: NamedType if tp.name.is(ShadowedName) => sym.name.derived(ShadowedName)
367368
case _ => sym.name
368369
}
369370
untpd.cpy.Select(tree)(qual, sym.name)
@@ -699,7 +700,7 @@ object Erasure extends TypeTestsCasts{
699700
fun.tpe.widen match {
700701
case mt: MethodType =>
701702
Apply(fun, (vparams, mt.paramTypes).zipped.map(adapt(_, _, untpd.EmptyTree)))
702-
case a =>
703+
case a =>
703704
error(s"can not resolve apply type $a")
704705
})
705706
adapt(rhs, resultType)

compiler/src/dotty/tools/dotc/transform/FirstTransform.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ import dotty.tools.dotc.core.Denotations.SingleDenotation
1919
import scala.collection.mutable
2020
import DenotTransformers._
2121
import typer.Checking
22-
import Names.Name
2322
import NameOps._
23+
import NameExtractors.AvoidClashName
2424
import StdNames._
2525

2626

@@ -129,7 +129,7 @@ class FirstTransform extends MiniPhaseTransform with InfoTransformer with Annota
129129
case _ =>
130130
false
131131
}
132-
val uniqueName = if (nameClash) objName.avoidClashName else objName
132+
val uniqueName = if (nameClash) AvoidClashName(objName) else objName
133133
Thicket(stat :: ModuleDef(registerCompanion(uniqueName, stat.symbol), Nil).trees)
134134
case stat => stat
135135
}

0 commit comments

Comments
 (0)