@@ -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) =>
0 commit comments