@@ -2,10 +2,7 @@ package dotty.tools.dotc
22package transform
33
44import core ._
5- import Contexts ._
6- import Types ._
7- import MegaPhase ._
8- import ast .Trees ._
5+ import Contexts ._ , Types ._ , MegaPhase ._ , ast .Trees ._ , Symbols ._ , Decorators ._ , Flags ._
96
107/** Transform references of the form
118 *
@@ -26,18 +23,28 @@ class ExplicitSelf extends MiniPhase {
2623
2724 override def phaseName : String = " explicitSelf"
2825
26+ private def needsCast (tree : RefTree , cls : ClassSymbol )(using Context ) =
27+ ! cls.is(Package ) && cls.givenSelfType.exists && ! cls.derivesFrom(tree.symbol.owner)
28+
29+ private def castQualifier (tree : RefTree , cls : ClassSymbol , thiz : Tree )(using Context ) =
30+ cpy.Select (tree)(thiz.cast(AndType (cls.classInfo.selfType, thiz.tpe)), tree.name)
31+
2932 override def transformIdent (tree : Ident )(using Context ): Tree = tree.tpe match {
3033 case tp : ThisType =>
3134 report.debuglog(s " owner = ${ctx.owner}, context = ${ctx}" )
3235 This (tp.cls).withSpan(tree.span)
33- case _ => tree
36+ case TermRef (thisTp : ThisType , _) =>
37+ val cls = thisTp.cls
38+ if needsCast(tree, cls) then castQualifier(tree, cls, This (cls))
39+ else tree
40+ case _ =>
41+ tree
3442 }
3543
3644 override def transformSelect (tree : Select )(using Context ): Tree = tree match {
3745 case Select (thiz : This , name) if name.isTermName =>
3846 val cls = thiz.symbol.asClass
39- if (cls.givenSelfType.exists && ! cls.derivesFrom(tree.symbol.owner))
40- cpy.Select (tree)(thiz.cast(AndType (cls.classInfo.selfType, thiz.tpe)), name)
47+ if needsCast(tree, cls) then castQualifier(tree, cls, thiz)
4148 else tree
4249 case _ => tree
4350 }
0 commit comments