@@ -150,7 +150,7 @@ object Summarization {
150
150
(Potentials .empty, effs ++ pots.promote(expr))
151
151
152
152
case WhileDo (cond, body) =>
153
- // for lazy fields, the translation may result im `while (<empty>)`
153
+ // for lazy fields, the translation may result in `while (<empty>)`
154
154
val (_, effs1) = if (cond.isEmpty) Summary .empty else analyze(cond)
155
155
val (_, effs2) = analyze(body)
156
156
(Potentials .empty, effs1 ++ effs2)
@@ -178,7 +178,7 @@ object Summarization {
178
178
analyze(expansion).withEffs(effs)
179
179
180
180
case vdef : ValDef =>
181
- val (pots, effs) = analyze(vdef.rhs)
181
+ lazy val (pots, effs) = analyze(vdef.rhs)
182
182
183
183
if (vdef.symbol.owner.isClass)
184
184
(Potentials .empty, if (vdef.symbol.is(Flags .Lazy )) Effects .empty else effs)
@@ -190,7 +190,7 @@ object Summarization {
190
190
Summary .empty
191
191
192
192
case ddef : DefDef =>
193
- val (pots, effs) = analyze(ddef.rhs)
193
+ lazy val (pots, effs) = analyze(ddef.rhs)
194
194
195
195
if (ddef.symbol.owner.isClass) Summary .empty
196
196
else (Potentials .empty, pots.promote(ddef) ++ effs)
@@ -265,8 +265,9 @@ object Summarization {
265
265
val tpl = ctor.owner.defTree.asInstanceOf [TypeDef ].rhs.asInstanceOf [Template ]
266
266
val effs = analyze(Block (tpl.body, unitLiteral))._2
267
267
268
- def parentArgEffs (stats : List [Tree ]): Effects =
269
- stats.foldLeft(Effects .empty) { (acc, stat) =>
268
+ def parentArgEffsWithInit (stats : List [Tree ], ctor : Symbol , source : Tree ): Effects =
269
+ val initCall = MethodCall (ThisRef (cls)(source), ctor)(source)
270
+ stats.foldLeft(Set (initCall)) { (acc, stat) =>
270
271
val (_, effs) = Summarization .analyze(stat)
271
272
acc ++ effs
272
273
}
@@ -275,18 +276,15 @@ object Summarization {
275
276
effs ++ (parent match {
276
277
case tree @ Block (stats, parent) =>
277
278
val (ctor @ Select (qual, _), _, argss) = decomposeCall(parent)
278
- parentArgEffs(qual :: stats ++ argss.flatten) +
279
- MethodCall (ThisRef (cls)(tree), ctor.symbol)(tree)
279
+ parentArgEffsWithInit(qual :: stats ++ argss.flatten, ctor.symbol, tree)
280
280
281
281
case tree @ Apply (Block (stats, parent), args) =>
282
282
val (ctor @ Select (qual, _), _, argss) = decomposeCall(parent)
283
- parentArgEffs(qual :: stats ++ args ++ argss.flatten) +
284
- MethodCall (ThisRef (cls)(tree), ctor.symbol)(tree)
283
+ parentArgEffsWithInit(qual :: stats ++ args ++ argss.flatten, ctor.symbol, tree)
285
284
286
285
case parent : Apply =>
287
286
val (ctor @ Select (qual, _), _, argss) = decomposeCall(parent)
288
- parentArgEffs(qual :: argss.flatten) +
289
- MethodCall (ThisRef (cls)(parent), ctor.symbol)(parent)
287
+ parentArgEffsWithInit(qual :: argss.flatten, ctor.symbol, parent)
290
288
291
289
case ref =>
292
290
val tref : TypeRef = ref.tpe.typeConstructor.asInstanceOf
@@ -305,38 +303,31 @@ object Summarization {
305
303
}
306
304
307
305
def classSummary (cls : ClassSymbol )(implicit env : Env ): ClassSummary =
306
+ def extractParentOuters (parent : Type , source : Tree ): (ClassSymbol , Potentials ) = {
307
+ val tref = parent.typeConstructor.asInstanceOf [TypeRef ]
308
+ val parentCls = tref.classSymbol.asClass
309
+ if (tref.prefix != NoPrefix )
310
+ parentCls -> analyze(tref.prefix, source)._1
311
+ else
312
+ parentCls -> analyze(cls.enclosingClass.thisType, source)._1
313
+ }
314
+
308
315
if (cls.defTree.isEmpty)
309
316
cls.info match {
310
317
case cinfo : ClassInfo =>
311
- val parentOuter : List [(ClassSymbol , Potentials )] = cinfo.classParents.map {
312
- case parentTp : TypeRef =>
313
- val source = {
314
- implicit val ctx2 : Context = theCtx.withSource(cls.source(theCtx))
315
- TypeTree (parentTp).withSpan(cls.span)
316
- }
317
- val parentCls = parentTp.classSymbol.asClass
318
- if (parentTp.prefix != NoPrefix )
319
- parentCls -> analyze(parentTp.prefix, source)._1
320
- else
321
- parentCls -> analyze(cls.enclosingClass.thisType, source)._1
318
+ val source = {
319
+ implicit val ctx2 : Context = theCtx.withSource(cls.source(theCtx))
320
+ TypeTree (cls.typeRef).withSpan(cls.span)
322
321
}
323
322
324
- ClassSummary (cls, parentOuter.toMap)
323
+ val parentOuter = cinfo.classParents.map { extractParentOuters(_, source) }.toMap
324
+ ClassSummary (cls, parentOuter)
325
325
}
326
326
else {
327
327
val tpl = cls.defTree.asInstanceOf [TypeDef ]
328
328
val parents = tpl.rhs.asInstanceOf [Template ].parents
329
329
330
- val parentOuter : List [(ClassSymbol , Potentials )] = parents.map { parent =>
331
- val tref = parent.tpe.typeConstructor.asInstanceOf [TypeRef ]
332
- val parentCls = tref.classSymbol.asClass
333
- if (tref.prefix != NoPrefix )
334
- parentCls -> analyze(tref.prefix, parent)._1
335
- else
336
- parentCls -> analyze(cls.enclosingClass.thisType, parent)._1
337
-
338
- }
339
-
330
+ val parentOuter = parents.map { parent => extractParentOuters(parent.tpe, parent) }
340
331
ClassSummary (cls, parentOuter.toMap)
341
332
}
342
333
0 commit comments