@@ -1368,18 +1368,25 @@ object Trees {
1368
1368
def localCtx (tree : Tree )(using Context ): Context
1369
1369
1370
1370
/** 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.
1372
1373
* TODO: ensure transform is always called with the correct context as argument
1373
1374
* @see https://github.com/lampepfl/dotty/pull/13880#discussion_r836395977
1374
1375
*/
1375
1376
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
1379
1386
1380
1387
abstract class TreeMap (val cpy : TreeCopier = inst.cpy) { self =>
1381
1388
def transform (tree : Tree )(using Context ): Tree = {
1382
- inContext(transformCtx(tree)){
1389
+ inContext(transformCtx(tree)) {
1383
1390
Stats .record(s " TreeMap.transform/ $getClass" )
1384
1391
if (skipTransform(tree)) tree
1385
1392
else tree match {
@@ -1436,13 +1443,9 @@ object Trees {
1436
1443
case AppliedTypeTree (tpt, args) =>
1437
1444
cpy.AppliedTypeTree (tree)(transform(tpt), transform(args))
1438
1445
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))
1442
1447
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))
1446
1449
case MatchTypeTree (bound, selector, cases) =>
1447
1450
cpy.MatchTypeTree (tree)(transform(bound), transform(selector), transformSub(cases))
1448
1451
case ByNameTypeTree (result) =>
@@ -1458,30 +1461,21 @@ object Trees {
1458
1461
case EmptyValDef =>
1459
1462
tree
1460
1463
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)
1466
1467
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))
1470
1469
case tree @ TypeDef (name, rhs) =>
1471
- inContext(localCtx(tree)) {
1472
- cpy.TypeDef (tree)(name, transform(rhs))
1473
- }
1470
+ cpy.TypeDef (tree)(name, transform(rhs))
1474
1471
case tree @ Template (constr, parents, self, _) if tree.derived.isEmpty =>
1475
1472
cpy.Template (tree)(transformSub(constr), transform(tree.parents), Nil , transformSub(self), transformStats(tree.body, tree.symbol))
1476
1473
case Import (expr, selectors) =>
1477
1474
cpy.Import (tree)(transform(expr), selectors)
1478
1475
case Export (expr, selectors) =>
1479
1476
cpy.Export (tree)(transform(expr), selectors)
1480
1477
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))
1485
1479
case Annotated (arg, annot) =>
1486
1480
cpy.Annotated (tree)(transform(arg), transform(annot))
1487
1481
case Thicket (trees) =>
0 commit comments