Skip to content

Commit afd304a

Browse files
committed
Handle O.this.m() in type analysis
1 parent 25f0782 commit afd304a

File tree

1 file changed

+19
-13
lines changed

1 file changed

+19
-13
lines changed

compiler/src/dotty/tools/dotc/transform/init/CycleChecker.scala

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -179,9 +179,9 @@ class CycleChecker(cache: Cache) {
179179
def cacheConstructorDependencies(constr: Symbol, deps: List[Dependency])(using Context): Unit =
180180
Util.traceIndented("deps for " + constr.show + " = " + deps.map(_.show), init)
181181
summaryCache(constr) = deps
182-
val cls = constr.owner
182+
val cls = constr.owner.asClass
183183

184-
if cls.is(Flags.Module) && cls.isStatic then
184+
if isStaticObjectClass(cls) then
185185
objectsInCurrentRun += cls.sourceModule
186186

187187
private def instanceDependencies(sym: Symbol, instanceClass: ClassSymbol)(using Context): List[Dependency] =
@@ -236,6 +236,9 @@ class CycleChecker(cache: Cache) {
236236
def isStaticObjectRef(sym: Symbol)(using Context) =
237237
sym.isTerm && !sym.is(Flags.Package) && sym.is(Flags.Module) && sym.isStatic
238238

239+
def isStaticObjectClass(cls: ClassSymbol)(using Context) =
240+
cls.is(Flags.Module) && cls.isStatic
241+
239242
private def analyzeClass(cls: ClassSymbol, instanceClass: ClassSymbol)(using Context): List[Dependency] = {
240243
val cdef = cls.defTree.asInstanceOf[TypeDef]
241244
val tpl = cdef.rhs.asInstanceOf[Template]
@@ -263,13 +266,10 @@ class CycleChecker(cache: Cache) {
263266
deps += InstanceUsage(cls, cls)(Vector(tree))
264267
deps += StaticCall(cls, tree.symbol)(Vector(tree))
265268

266-
case tree @ Select(qual, name) if name.isTermName && isStaticObjectRef(qual.symbol) =>
267-
val cls = qual.symbol.moduleClass.asClass
268-
deps += ObjectAccess(qual.symbol)(Vector(tree))
269-
deps += StaticCall(cls, tree.symbol)(Vector(tree))
270-
deps += ProxyUsage(cls, tree.symbol)(Vector(tree))
269+
case tree @ Select(qual, name) if name.isTermName && qual.tpe.isStable =>
270+
deps ++= analyzeType(tree.tpe, tree, exclude = cls)
271271

272-
case tree: RefTree if tree.isTerm =>
272+
case tree: Ident if tree.isTerm =>
273273
deps ++= analyzeType(tree.tpe, tree, exclude = cls)
274274

275275
case tree: This =>
@@ -296,6 +296,12 @@ class CycleChecker(cache: Cache) {
296296
deps.toList
297297
}
298298

299+
private def useObjectMember(obj: Symbol, member: Symbol, source: Tree)(using Context): List[Dependency] =
300+
val cls = obj.moduleClass.asClass
301+
ObjectAccess(obj)(Vector(source)) ::
302+
StaticCall(cls, member)(Vector(source)) ::
303+
ProxyUsage(cls, member)(Vector(source)) :: Nil
304+
299305
private def analyzeType(tp: Type, source: Tree, exclude: Symbol)(using Context): List[Dependency] = tp match {
300306
case (_: ConstantType) | NoPrefix => Nil
301307

@@ -305,11 +311,11 @@ class CycleChecker(cache: Cache) {
305311
ObjectAccess(obj)(Vector(source)) :: InstanceUsage(cls, cls)(Vector(source)) :: Nil
306312

307313
case tmref @ TermRef(prefix: TermRef, _) if isStaticObjectRef(prefix.symbol) =>
308-
val obj = prefix.symbol
309-
val cls = obj.moduleClass.asClass
310-
ObjectAccess(obj)(Vector(source)) ::
311-
StaticCall(cls, tmref.symbol)(Vector(source)) ::
312-
ProxyUsage(cls, tmref.symbol)(Vector(source)) :: Nil
314+
useObjectMember(prefix.symbol, tmref.symbol, source)
315+
316+
case tmref @ TermRef(prefix: ThisType, _) if isStaticObjectClass(prefix.cls) && prefix.cls != exclude =>
317+
val obj = prefix.cls.sourceModule
318+
useObjectMember(obj, tmref.symbol, source)
313319

314320
case tmref: TermRef =>
315321
analyzeType(tmref.prefix, source, exclude)

0 commit comments

Comments
 (0)