@@ -45,17 +45,17 @@ import scala.collection.mutable
45
45
*/
46
46
trait Dependency {
47
47
def symbol : Symbol
48
- def source : Tree
48
+ def source : Vector [ Tree ]
49
49
def show (using Context ): String
50
50
}
51
51
52
52
/** Depend on the initialization of another object */
53
- case class ObjectAccess (symbol : Symbol )(val source : Tree ) extends Dependency {
53
+ case class ObjectAccess (symbol : Symbol )(val source : Vector [ Tree ] ) extends Dependency {
54
54
def show (using Context ): String = " ObjectAccess(" + symbol.show + " )"
55
55
}
56
56
57
57
/** Depend on usage of an instance, which can be either a class instance or object */
58
- case class InstanceUsage (symbol : ClassSymbol , instanceClass : ClassSymbol )(val source : Tree ) extends Dependency {
58
+ case class InstanceUsage (symbol : ClassSymbol , instanceClass : ClassSymbol )(val source : Vector [ Tree ] ) extends Dependency {
59
59
def show (using Context ): String = " InstanceUsage(" + symbol.show + " )"
60
60
}
61
61
@@ -67,15 +67,15 @@ case class InstanceUsage(symbol: ClassSymbol, instanceClass: ClassSymbol)(val so
67
67
* Note: Virtual method resolution should have been performed for the target.
68
68
*
69
69
*/
70
- case class StaticCall (cls : ClassSymbol , symbol : Symbol )(val source : Tree ) extends Dependency {
70
+ case class StaticCall (cls : ClassSymbol , symbol : Symbol )(val source : Vector [ Tree ] ) extends Dependency {
71
71
def show (using Context ): String = " StaticCall(" + cls.show + " , " + symbol.show + " )"
72
72
}
73
73
74
74
/** A static method call result is used
75
75
*
76
76
* Note: Virtual method resolution should have been performed for the target.
77
77
*/
78
- case class ProxyUsage (cls : ClassSymbol , symbol : Symbol )(val source : Tree ) extends Dependency {
78
+ case class ProxyUsage (cls : ClassSymbol , symbol : Symbol )(val source : Vector [ Tree ] ) extends Dependency {
79
79
def show (using Context ): String = " ProxyUsage(" + cls.show + " , " + symbol.show + " )"
80
80
}
81
81
@@ -107,7 +107,7 @@ class CycleChecker(cache: Cache) {
107
107
def checkCyclic ()(using Context ): Unit = {
108
108
val state = State (visited = mutable.Set .empty, path = Vector .empty, trace = Vector .empty)
109
109
objectsInCurrentRun.foreach { obj =>
110
- val dep = ObjectAccess (obj)(obj.defTree)
110
+ val dep = ObjectAccess (obj)(Vector ( obj.defTree) )
111
111
val errors = check(dep)(using ctx, state)
112
112
errors.foreach(_.issue)
113
113
}
@@ -136,15 +136,15 @@ class CycleChecker(cache: Cache) {
136
136
val obj = dep.symbol
137
137
if state.path.contains(obj) then
138
138
val cycle = state.path.dropWhile(_ != obj)
139
- val trace = state.trace.dropWhile(_.symbol != obj).map (_.source) : + dep.source
139
+ val trace = state.trace.dropWhile(_.symbol != obj).flatMap (_.source) + + dep.source
140
140
if cycle.size > 1 then
141
141
CyclicObjectInit (cycle, trace) :: Nil
142
142
else
143
143
ObjectLeakDuringInit (obj, trace) :: Nil
144
144
else
145
145
val constr = obj.moduleClass.primaryConstructor
146
146
state.visitObject(dep) {
147
- check(StaticCall (constr.owner.asClass, constr)(obj.moduleClass.defTree))
147
+ check(StaticCall (constr.owner.asClass, constr)(Vector ( obj.moduleClass.defTree) ))
148
148
}
149
149
}
150
150
@@ -218,8 +218,8 @@ class CycleChecker(cache: Cache) {
218
218
init = true
219
219
)
220
220
221
- val pot = Hot (dep.cls)(dep.source)
222
- val effs = pot.potentialsOf(dep.symbol)(using env).promote(dep .source)
221
+ val pot = Hot (dep.cls)(dep.source.last )
222
+ val effs = pot.potentialsOf(dep.symbol)(using env).map(pot => Promote (pot)(pot .source) )
223
223
224
224
val errs = effs.flatMap(Checking .check(_)(using state))
225
225
errs.foreach(_.issue)
@@ -250,15 +250,15 @@ class CycleChecker(cache: Cache) {
250
250
if vdef.symbol.is(Flags .Lazy ) then
251
251
traverse(vdef)
252
252
else
253
- deps += ProxyUsage (instanceClass, vdef.symbol)(vdef)
253
+ deps += ProxyUsage (instanceClass, vdef.symbol)(Vector ( vdef) )
254
254
case stat =>
255
255
256
256
}
257
257
258
258
case tree @ Select (inst : New , _) if tree.symbol.isConstructor =>
259
259
val cls = inst.tpe.classSymbol.asClass
260
- deps += InstanceUsage (cls, cls)(tree)
261
- deps += StaticCall (cls, tree.symbol)(tree)
260
+ deps += InstanceUsage (cls, cls)(Vector ( tree) )
261
+ deps += StaticCall (cls, tree.symbol)(Vector ( tree) )
262
262
263
263
case tree : RefTree if tree.isTerm =>
264
264
deps ++= analyzeType(tree.tpe, tree, exclude = cls)
@@ -280,7 +280,7 @@ class CycleChecker(cache: Cache) {
280
280
// TODO: the traverser might create duplicate entries for parents
281
281
tpl.parents.foreach { tree =>
282
282
val tp = tree.tpe
283
- deps += InstanceUsage (tp.classSymbol.asClass, instanceClass)(tree)
283
+ deps += InstanceUsage (tp.classSymbol.asClass, instanceClass)(Vector ( tree) )
284
284
}
285
285
286
286
traverser.traverse(tpl)
@@ -293,7 +293,7 @@ class CycleChecker(cache: Cache) {
293
293
case tmref : TermRef if isStaticObjectRef(tmref.symbol) =>
294
294
val obj = tmref.symbol
295
295
val cls = obj.moduleClass.asClass
296
- ObjectAccess (obj)(source) :: InstanceUsage (cls, cls)(source) :: Nil
296
+ ObjectAccess (obj)(Vector ( source)) :: InstanceUsage (cls, cls)(Vector ( source) ) :: Nil
297
297
298
298
case tmref : TermRef =>
299
299
analyzeType(tmref.prefix, source, exclude)
@@ -303,7 +303,7 @@ class CycleChecker(cache: Cache) {
303
303
then
304
304
val cls = tref.symbol.asClass
305
305
val obj = cls.sourceModule
306
- ObjectAccess (obj)(source) :: InstanceUsage (cls, cls)(source) :: Nil
306
+ ObjectAccess (obj)(Vector ( source)) :: InstanceUsage (cls, cls)(Vector ( source) ) :: Nil
307
307
else
308
308
Nil
309
309
@@ -335,7 +335,7 @@ class CycleChecker(cache: Cache) {
335
335
init = true
336
336
)
337
337
338
- val pot = Hot (dep.cls)(dep.source)
338
+ val pot = Hot (dep.cls)(dep.source.last )
339
339
val effs = pot.effectsOf(dep.symbol)(using env)
340
340
341
341
val errs = effs.flatMap(Checking .check(_)(using state))
0 commit comments