Skip to content

Commit 84f85c2

Browse files
Merge pull request #11601 from dotty-staging/fix-11538
Make generation of local contexts uniform
2 parents 89217ca + aa86047 commit 84f85c2

File tree

6 files changed

+32
-32
lines changed

6 files changed

+32
-32
lines changed

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

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -85,8 +85,6 @@ class TreeMapWithImplicits extends tpd.TreeMap {
8585
}
8686

8787
override def transform(tree: Tree)(using Context): Tree = {
88-
def localCtx =
89-
if (tree.hasType && tree.symbol.exists) ctx.withOwner(tree.symbol) else ctx
9088
try tree match {
9189
case Block(stats, expr) =>
9290
inContext(nestedScopeCtx(stats)) {
@@ -97,19 +95,13 @@ class TreeMapWithImplicits extends tpd.TreeMap {
9795
else super.transform(tree)
9896
}
9997
case tree: DefDef =>
100-
inContext(localCtx) {
98+
inContext(localCtx(tree)) {
10199
cpy.DefDef(tree)(
102100
tree.name,
103101
transformParamss(tree.paramss),
104102
transform(tree.tpt),
105103
transform(tree.rhs)(using nestedScopeCtx(tree.paramss.flatten)))
106104
}
107-
case EmptyValDef =>
108-
tree
109-
case _: MemberDef =>
110-
super.transform(tree)(using localCtx)
111-
case _: PackageDef =>
112-
super.transform(tree)(using ctx.withOwner(tree.symbol.moduleClass))
113105
case impl @ Template(constr, parents, self, _) =>
114106
cpy.Template(tree)(
115107
transformSub(constr),

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

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1296,6 +1296,9 @@ object Trees {
12961296
*/
12971297
protected def inlineContext(call: Tree)(using Context): Context = ctx
12981298

1299+
/** The context to use when mapping or accumulating over a tree */
1300+
def localCtx(tree: Tree)(using Context): Context
1301+
12991302
abstract class TreeMap(val cpy: TreeCopier = inst.cpy) { self =>
13001303
def transform(tree: Tree)(using Context): Tree = {
13011304
inContext(
@@ -1304,9 +1307,6 @@ object Trees {
13041307
else ctx
13051308
){
13061309
Stats.record(s"TreeMap.transform/$getClass")
1307-
def localCtx =
1308-
if (tree.hasType && tree.symbol.exists) ctx.withOwner(tree.symbol) else ctx
1309-
13101310
if (skipTransform(tree)) tree
13111311
else tree match {
13121312
case Ident(name) =>
@@ -1362,11 +1362,11 @@ object Trees {
13621362
case AppliedTypeTree(tpt, args) =>
13631363
cpy.AppliedTypeTree(tree)(transform(tpt), transform(args))
13641364
case LambdaTypeTree(tparams, body) =>
1365-
inContext(localCtx) {
1365+
inContext(localCtx(tree)) {
13661366
cpy.LambdaTypeTree(tree)(transformSub(tparams), transform(body))
13671367
}
13681368
case TermLambdaTypeTree(params, body) =>
1369-
inContext(localCtx) {
1369+
inContext(localCtx(tree)) {
13701370
cpy.TermLambdaTypeTree(tree)(transformSub(params), transform(body))
13711371
}
13721372
case MatchTypeTree(bound, selector, cases) =>
@@ -1384,17 +1384,17 @@ object Trees {
13841384
case EmptyValDef =>
13851385
tree
13861386
case tree @ ValDef(name, tpt, _) =>
1387-
inContext(localCtx) {
1387+
inContext(localCtx(tree)) {
13881388
val tpt1 = transform(tpt)
13891389
val rhs1 = transform(tree.rhs)
13901390
cpy.ValDef(tree)(name, tpt1, rhs1)
13911391
}
13921392
case tree @ DefDef(name, paramss, tpt, _) =>
1393-
inContext(localCtx) {
1393+
inContext(localCtx(tree)) {
13941394
cpy.DefDef(tree)(name, transformParamss(paramss), transform(tpt), transform(tree.rhs))
13951395
}
13961396
case tree @ TypeDef(name, rhs) =>
1397-
inContext(localCtx) {
1397+
inContext(localCtx(tree)) {
13981398
cpy.TypeDef(tree)(name, transform(rhs))
13991399
}
14001400
case tree @ Template(constr, parents, self, _) if tree.derived.isEmpty =>
@@ -1404,7 +1404,10 @@ object Trees {
14041404
case Export(expr, selectors) =>
14051405
cpy.Export(tree)(transform(expr), selectors)
14061406
case PackageDef(pid, stats) =>
1407-
cpy.PackageDef(tree)(transformSub(pid), transformStats(stats, pid.symbol.moduleClass)(using localCtx))
1407+
val pid1 = transformSub(pid)
1408+
inContext(localCtx(tree)) {
1409+
cpy.PackageDef(tree)(pid1, transformStats(stats, ctx.owner))
1410+
}
14081411
case Annotated(arg, annot) =>
14091412
cpy.Annotated(tree)(transform(arg), transform(annot))
14101413
case Thicket(trees) =>
@@ -1450,8 +1453,6 @@ object Trees {
14501453
foldOver(x, tree)(using ctx.withSource(tree.source))
14511454
else {
14521455
Stats.record(s"TreeAccumulator.foldOver/$getClass")
1453-
def localCtx =
1454-
if (tree.hasType && tree.symbol.exists) ctx.withOwner(tree.symbol) else ctx
14551456
tree match {
14561457
case Ident(name) =>
14571458
x
@@ -1506,11 +1507,11 @@ object Trees {
15061507
case AppliedTypeTree(tpt, args) =>
15071508
this(this(x, tpt), args)
15081509
case LambdaTypeTree(tparams, body) =>
1509-
inContext(localCtx) {
1510+
inContext(localCtx(tree)) {
15101511
this(this(x, tparams), body)
15111512
}
15121513
case TermLambdaTypeTree(params, body) =>
1513-
inContext(localCtx) {
1514+
inContext(localCtx(tree)) {
15141515
this(this(x, params), body)
15151516
}
15161517
case MatchTypeTree(bound, selector, cases) =>
@@ -1526,15 +1527,15 @@ object Trees {
15261527
case UnApply(fun, implicits, patterns) =>
15271528
this(this(this(x, fun), implicits), patterns)
15281529
case tree @ ValDef(_, tpt, _) =>
1529-
inContext(localCtx) {
1530+
inContext(localCtx(tree)) {
15301531
this(this(x, tpt), tree.rhs)
15311532
}
15321533
case tree @ DefDef(_, paramss, tpt, _) =>
1533-
inContext(localCtx) {
1534+
inContext(localCtx(tree)) {
15341535
this(this(paramss.foldLeft(x)(apply), tpt), tree.rhs)
15351536
}
15361537
case TypeDef(_, rhs) =>
1537-
inContext(localCtx) {
1538+
inContext(localCtx(tree)) {
15381539
this(x, rhs)
15391540
}
15401541
case tree @ Template(constr, parents, self, _) if tree.derived.isEmpty =>
@@ -1544,7 +1545,7 @@ object Trees {
15441545
case Export(expr, _) =>
15451546
this(x, expr)
15461547
case PackageDef(pid, stats) =>
1547-
this(this(x, pid), stats)(using localCtx)
1548+
this(this(x, pid), stats)(using localCtx(tree))
15481549
case Annotated(arg, annot) =>
15491550
this(this(x, arg), annot)
15501551
case Thicket(ts) =>

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -565,6 +565,14 @@ object tpd extends Trees.Instance[Type] with TypedTreeInfo {
565565
else foldOver(sym, tree)
566566
}
567567

568+
/** The owner to be used in a local context when traversin a tree */
569+
def localOwner(tree: Tree)(using Context): Symbol =
570+
val sym = tree.symbol
571+
(if sym.is(PackageVal) then sym.moduleClass else sym).orElse(ctx.owner)
572+
573+
/** The local context to use when traversing trees */
574+
def localCtx(tree: Tree)(using Context): Context = ctx.withOwner(localOwner(tree))
575+
568576
override val cpy: TypedTreeCopier = // Type ascription needed to pick up any new members in TreeCopier (currently there are none)
569577
TypedTreeCopier()
570578

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -535,6 +535,8 @@ object untpd extends Trees.Instance[Untyped] with UntypedTreeInfo {
535535

536536
// --------- Copier/Transformer/Accumulator classes for untyped trees -----
537537

538+
def localCtx(tree: Tree)(using Context): Context = ctx
539+
538540
override val cpy: UntypedTreeCopier = UntypedTreeCopier()
539541

540542
class UntypedTreeCopier extends TreeCopier {

compiler/src/dotty/tools/dotc/core/Contexts.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -542,7 +542,7 @@ object Contexts {
542542
def iinfo(using Context) =
543543
if (ctx.importInfo == null) "" else i"${ctx.importInfo.selectors}%, %"
544544
def cinfo(using Context) =
545-
val core = s" owner = ${ctx.owner}, scope = ${ctx.scope}, import = ${iinfo(using ctx)}"
545+
val core = s" owner = ${ctx.owner}, scope = ${ctx.scope}, import = $iinfo"
546546
if (ctx ne NoContext) && (ctx.implicits ne ctx.outer.implicits) then
547547
s"$core, implicits = ${ctx.implicits}"
548548
else

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

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,8 @@ abstract class MacroTransform extends Phase {
3131

3232
class Transformer extends TreeMap(cpy = cpyBetweenPhases) {
3333

34-
protected def localCtx(tree: Tree)(using Context): FreshContext = {
35-
val sym = tree.symbol
36-
val owner = if (sym.is(PackageVal)) sym.moduleClass else sym
37-
ctx.fresh.setTree(tree).setOwner(owner)
38-
}
34+
protected def localCtx(tree: Tree)(using Context): FreshContext =
35+
ctx.fresh.setTree(tree).setOwner(localOwner(tree))
3936

4037
override def transformStats(trees: List[Tree], exprOwner: Symbol)(using Context): List[Tree] = {
4138
def transformStat(stat: Tree): Tree = stat match {

0 commit comments

Comments
 (0)