Skip to content

Commit 0f88cbe

Browse files
TheElectronWillmichelou
authored andcommitted
Make Trees.transformCtx return the local context if needed
1 parent 396246e commit 0f88cbe

File tree

2 files changed

+27
-32
lines changed

2 files changed

+27
-32
lines changed

compiler/src/dotty/tools/dotc/ast/Trees.scala

Lines changed: 20 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1368,18 +1368,25 @@ object Trees {
13681368
def localCtx(tree: Tree)(using Context): Context
13691369

13701370
/** The context to use when transforming a tree.
1371-
* It ensures that the source information is correct.
1371+
* It ensures that the source is correct, and that the local context is used if
1372+
* that's necessary for transforming the whole tree.
13721373
* TODO: ensure transform is always called with the correct context as argument
13731374
* @see https://github.com/lampepfl/dotty/pull/13880#discussion_r836395977
13741375
*/
13751376
def transformCtx(tree: Tree)(using Context): Context =
1376-
if tree.source.exists && tree.source != ctx.source
1377-
then ctx.withSource(tree.source)
1378-
else ctx
1377+
val sourced =
1378+
if tree.source.exists && tree.source != ctx.source
1379+
then ctx.withSource(tree.source)
1380+
else ctx
1381+
tree match
1382+
case t: (MemberDef | PackageDef | LambdaTypeTree | TermLambdaTypeTree) =>
1383+
localCtx(t)(using sourced)
1384+
case _ =>
1385+
sourced
13791386

13801387
abstract class TreeMap(val cpy: TreeCopier = inst.cpy) { self =>
13811388
def transform(tree: Tree)(using Context): Tree = {
1382-
inContext(transformCtx(tree)){
1389+
inContext(transformCtx(tree)) {
13831390
Stats.record(s"TreeMap.transform/$getClass")
13841391
if (skipTransform(tree)) tree
13851392
else tree match {
@@ -1436,13 +1443,9 @@ object Trees {
14361443
case AppliedTypeTree(tpt, args) =>
14371444
cpy.AppliedTypeTree(tree)(transform(tpt), transform(args))
14381445
case LambdaTypeTree(tparams, body) =>
1439-
inContext(localCtx(tree)) {
1440-
cpy.LambdaTypeTree(tree)(transformSub(tparams), transform(body))
1441-
}
1446+
cpy.LambdaTypeTree(tree)(transformSub(tparams), transform(body))
14421447
case TermLambdaTypeTree(params, body) =>
1443-
inContext(localCtx(tree)) {
1444-
cpy.TermLambdaTypeTree(tree)(transformSub(params), transform(body))
1445-
}
1448+
cpy.TermLambdaTypeTree(tree)(transformSub(params), transform(body))
14461449
case MatchTypeTree(bound, selector, cases) =>
14471450
cpy.MatchTypeTree(tree)(transform(bound), transform(selector), transformSub(cases))
14481451
case ByNameTypeTree(result) =>
@@ -1458,30 +1461,21 @@ object Trees {
14581461
case EmptyValDef =>
14591462
tree
14601463
case tree @ ValDef(name, tpt, _) =>
1461-
inContext(localCtx(tree)) {
1462-
val tpt1 = transform(tpt)
1463-
val rhs1 = transform(tree.rhs)
1464-
cpy.ValDef(tree)(name, tpt1, rhs1)
1465-
}
1464+
val tpt1 = transform(tpt)
1465+
val rhs1 = transform(tree.rhs)
1466+
cpy.ValDef(tree)(name, tpt1, rhs1)
14661467
case tree @ DefDef(name, paramss, tpt, _) =>
1467-
inContext(localCtx(tree)) {
1468-
cpy.DefDef(tree)(name, transformParamss(paramss), transform(tpt), transform(tree.rhs))
1469-
}
1468+
cpy.DefDef(tree)(name, transformParamss(paramss), transform(tpt), transform(tree.rhs))
14701469
case tree @ TypeDef(name, rhs) =>
1471-
inContext(localCtx(tree)) {
1472-
cpy.TypeDef(tree)(name, transform(rhs))
1473-
}
1470+
cpy.TypeDef(tree)(name, transform(rhs))
14741471
case tree @ Template(constr, parents, self, _) if tree.derived.isEmpty =>
14751472
cpy.Template(tree)(transformSub(constr), transform(tree.parents), Nil, transformSub(self), transformStats(tree.body, tree.symbol))
14761473
case Import(expr, selectors) =>
14771474
cpy.Import(tree)(transform(expr), selectors)
14781475
case Export(expr, selectors) =>
14791476
cpy.Export(tree)(transform(expr), selectors)
14801477
case PackageDef(pid, stats) =>
1481-
val pid1 = transformSub(pid)
1482-
inContext(localCtx(tree)) {
1483-
cpy.PackageDef(tree)(pid1, transformStats(stats, ctx.owner))
1484-
}
1478+
cpy.PackageDef(tree)(transformSub(pid), transformStats(stats, ctx.owner))
14851479
case Annotated(arg, annot) =>
14861480
cpy.Annotated(tree)(transform(arg), transform(annot))
14871481
case Thicket(trees) =>

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

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -140,20 +140,21 @@ class InstrumentCoverage extends MacroTransform with IdentityDenotTransformer:
140140

141141
case tree: CaseDef => instrumentCaseDef(tree)
142142
case tree: ValDef =>
143-
// only transform the rhs, in the local context
144-
val rhs = transform(tree.rhs)(using localCtx(tree))
143+
// only transform the rhs
144+
val rhs = transform(tree.rhs)
145145
cpy.ValDef(tree)(rhs=rhs)
146146

147147
case tree: DefDef =>
148148
// only transform the params (for the default values) and the rhs
149-
val defCtx = localCtx(tree)
150-
val paramss = transformParamss(tree.paramss)(using defCtx)
151-
val rhs = transform(tree.rhs)(using defCtx)
149+
// force instrumentation of literals and other small trees in the rhs,
150+
// to ensure that the method call are recorded
151+
val paramss = transformParamss(tree.paramss)
152+
val rhs = transform(tree.rhs)
152153
cpy.DefDef(tree)(tree.name, paramss, tree.tpt, rhs)
153154

154155
case tree: PackageDef =>
155156
// only transform the statements of the package
156-
cpy.PackageDef(tree)(tree.pid, transform(tree.stats)(using localCtx(tree)))
157+
cpy.PackageDef(tree)(tree.pid, transform(tree.stats))
157158
case tree: Assign =>
158159
// only transform the rhs
159160
cpy.Assign(tree)(tree.lhs, transform(tree.rhs))

0 commit comments

Comments
 (0)