Skip to content

Commit d348877

Browse files
Merge pull request #10406 from dotty-staging/make-owners-explicit
Make owners explicit in reflection API
2 parents 375de66 + 0fc53a2 commit d348877

File tree

28 files changed

+255
-275
lines changed

28 files changed

+255
-275
lines changed

compiler/src/scala/quoted/internal/impl/Matcher.scala

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -199,19 +199,19 @@ object Matcher {
199199
def bodyFn(lambdaArgs: List[Tree]): Tree = {
200200
val argsMap = args.map(_.symbol).zip(lambdaArgs.asInstanceOf[List[Term]]).toMap
201201
new TreeMap {
202-
override def transformTerm(tree: Term)(using ctx: Context): Term =
202+
override def transformTerm(tree: Term)(owner: Symbol): Term =
203203
tree match
204204
case tree: Ident => summon[Env].get(tree.symbol).flatMap(argsMap.get).getOrElse(tree)
205-
case tree => super.transformTerm(tree)
206-
}.transformTree(scrutinee)
205+
case tree => super.transformTerm(tree)(owner)
206+
}.transformTree(scrutinee)(Symbol.spliceOwner)
207207
}
208208
val names = args.map {
209209
case Block(List(DefDef("$anonfun", _, _, _, Some(Apply(Ident(name), _)))), _) => name
210210
case arg => arg.symbol.name
211211
}
212212
val argTypes = args.map(x => x.tpe.widenTermRefExpr)
213213
val resType = pattern.tpe
214-
val res = Lambda(Symbol.currentOwner, MethodType(names)(_ => argTypes, _ => resType), (meth, x) => bodyFn(x).changeOwner(meth))
214+
val res = Lambda(Symbol.spliceOwner, MethodType(names)(_ => argTypes, _ => resType), (meth, x) => bodyFn(x).changeOwner(meth))
215215
matched(res.asExpr)
216216

217217
//
@@ -354,12 +354,12 @@ object Matcher {
354354
/** Return all free variables of the term defined in the pattern (i.e. defined in `Env`) */
355355
def freePatternVars(term: Term)(using ctx: Context, env: Env): Set[Symbol] =
356356
val accumulator = new TreeAccumulator[Set[Symbol]] {
357-
def foldTree(x: Set[Symbol], tree: Tree)(using ctx: Context): Set[Symbol] =
357+
def foldTree(x: Set[Symbol], tree: Tree)(owner: Symbol): Set[Symbol] =
358358
tree match
359-
case tree: Ident if env.contains(tree.symbol) => foldOverTree(x + tree.symbol, tree)
360-
case _ => foldOverTree(x, tree)
359+
case tree: Ident if env.contains(tree.symbol) => foldOverTree(x + tree.symbol, tree)(owner)
360+
case _ => foldOverTree(x, tree)(owner)
361361
}
362-
accumulator.foldTree(Set.empty, term)
362+
accumulator.foldTree(Set.empty, term)(Symbol.spliceOwner)
363363
}
364364

365365
private object IdentArgs {

compiler/src/scala/quoted/internal/impl/QuoteContextImpl.scala

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2205,7 +2205,6 @@ class QuoteContextImpl private (ctx: Context) extends QuoteContext, QuoteUnpickl
22052205

22062206
object Symbol extends SymbolModule:
22072207
def spliceOwner: Symbol = ctx.owner
2208-
def currentOwner(using ctx: Context): Symbol = ctx.owner
22092208
def requiredPackage(path: String): Symbol = dotc.core.Symbols.requiredPackage(path)
22102209
def requiredClass(path: String): Symbol = dotc.core.Symbols.requiredClass(path)
22112210
def requiredModule(path: String): Symbol = dotc.core.Symbols.requiredModule(path)
@@ -2244,8 +2243,6 @@ class QuoteContextImpl private (ctx: Context) extends QuoteContext, QuoteUnpickl
22442243
def fullName: String = self.denot.fullName.toString
22452244
def pos: Position = self.sourcePos
22462245

2247-
def localContext: Context =
2248-
if self.exists then ctx.withOwner(self) else ctx
22492246
def documentation: Option[Documentation] =
22502247
import dotc.core.Comments.CommentsContext
22512248
val docCtx = ctx.docCtx.getOrElse {

library/src-bootstrapped/scala/quoted/ExprMap.scala

Lines changed: 50 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -10,142 +10,139 @@ trait ExprMap:
1010
import qctx.reflect._
1111
final class MapChildren() {
1212

13-
def transformStatement(tree: Statement)(using ctx: Context): Statement = {
14-
def localCtx(definition: Definition): Context = definition.symbol.localContext
13+
def transformStatement(tree: Statement)(owner: Symbol): Statement = {
1514
tree match {
1615
case tree: Term =>
17-
transformTerm(tree, TypeRepr.of[Any])
16+
transformTerm(tree, TypeRepr.of[Any])(owner)
1817
case tree: Definition =>
19-
transformDefinition(tree)
18+
transformDefinition(tree)(owner)
2019
case tree: Import =>
2120
tree
2221
}
2322
}
2423

25-
def transformDefinition(tree: Definition)(using ctx: Context): Definition = {
26-
def localCtx(definition: Definition): Context = definition.symbol.localContext
24+
def transformDefinition(tree: Definition)(owner: Symbol): Definition = {
2725
tree match {
2826
case tree: ValDef =>
29-
given Context = localCtx(tree)
30-
val rhs1 = tree.rhs.map(x => transformTerm(x, tree.tpt.tpe))
27+
val owner = tree.symbol
28+
val rhs1 = tree.rhs.map(x => transformTerm(x, tree.tpt.tpe)(owner))
3129
ValDef.copy(tree)(tree.name, tree.tpt, rhs1)
3230
case tree: DefDef =>
33-
given Context = localCtx(tree)
34-
DefDef.copy(tree)(tree.name, tree.typeParams, tree.paramss, tree.returnTpt, tree.rhs.map(x => transformTerm(x, tree.returnTpt.tpe)))
31+
val owner = tree.symbol
32+
DefDef.copy(tree)(tree.name, tree.typeParams, tree.paramss, tree.returnTpt, tree.rhs.map(x => transformTerm(x, tree.returnTpt.tpe)(owner)))
3533
case tree: TypeDef =>
3634
tree
3735
case tree: ClassDef =>
38-
val newBody = transformStats(tree.body)
36+
val newBody = transformStats(tree.body)(owner)
3937
ClassDef.copy(tree)(tree.name, tree.constructor, tree.parents, tree.derived, tree.self, newBody)
4038
}
4139
}
4240

43-
def transformTermChildren(tree: Term, tpe: TypeRepr)(using ctx: Context): Term = tree match {
41+
def transformTermChildren(tree: Term, tpe: TypeRepr)(owner: Symbol): Term = tree match {
4442
case Ident(name) =>
4543
tree
4644
case Select(qualifier, name) =>
47-
Select.copy(tree)(transformTerm(qualifier, qualifier.tpe), name)
45+
Select.copy(tree)(transformTerm(qualifier, qualifier.tpe)(owner), name)
4846
case This(qual) =>
4947
tree
5048
case Super(qual, mix) =>
5149
tree
5250
case tree as Apply(fun, args) =>
5351
val MethodType(_, tpes, _) = fun.tpe.widen
54-
Apply.copy(tree)(transformTerm(fun, TypeRepr.of[Any]), transformTerms(args, tpes))
52+
Apply.copy(tree)(transformTerm(fun, TypeRepr.of[Any])(owner), transformTerms(args, tpes)(owner))
5553
case TypeApply(fun, args) =>
56-
TypeApply.copy(tree)(transformTerm(fun, TypeRepr.of[Any]), args)
54+
TypeApply.copy(tree)(transformTerm(fun, TypeRepr.of[Any])(owner), args)
5755
case _: Literal =>
5856
tree
5957
case New(tpt) =>
60-
New.copy(tree)(transformTypeTree(tpt))
58+
New.copy(tree)(transformTypeTree(tpt)(owner))
6159
case Typed(expr, tpt) =>
6260
val tp = tpt.tpe match
6361
case AppliedType(TypeRef(ThisType(TypeRef(NoPrefix(), "scala")), "<repeated>"), List(tp0: TypeRepr)) =>
6462
TypeRepr.of[Seq].appliedTo(tp0)
6563
case tp => tp
66-
Typed.copy(tree)(transformTerm(expr, tp), transformTypeTree(tpt))
64+
Typed.copy(tree)(transformTerm(expr, tp)(owner), transformTypeTree(tpt)(owner))
6765
case tree: NamedArg =>
68-
NamedArg.copy(tree)(tree.name, transformTerm(tree.value, tpe))
66+
NamedArg.copy(tree)(tree.name, transformTerm(tree.value, tpe)(owner))
6967
case Assign(lhs, rhs) =>
70-
Assign.copy(tree)(lhs, transformTerm(rhs, lhs.tpe.widen))
68+
Assign.copy(tree)(lhs, transformTerm(rhs, lhs.tpe.widen)(owner))
7169
case Block(stats, expr) =>
72-
Block.copy(tree)(transformStats(stats), transformTerm(expr, tpe))
70+
Block.copy(tree)(transformStats(stats)(owner), transformTerm(expr, tpe)(owner))
7371
case If(cond, thenp, elsep) =>
7472
If.copy(tree)(
75-
transformTerm(cond, TypeRepr.of[Boolean]),
76-
transformTerm(thenp, tpe),
77-
transformTerm(elsep, tpe))
73+
transformTerm(cond, TypeRepr.of[Boolean])(owner),
74+
transformTerm(thenp, tpe)(owner),
75+
transformTerm(elsep, tpe)(owner))
7876
case _: Closure =>
7977
tree
8078
case Match(selector, cases) =>
81-
Match.copy(tree)(transformTerm(selector, selector.tpe), transformCaseDefs(cases, tpe))
79+
Match.copy(tree)(transformTerm(selector, selector.tpe)(owner), transformCaseDefs(cases, tpe)(owner))
8280
case Return(expr) =>
8381
// FIXME
8482
// ctx.owner seems to be set to the wrong symbol
8583
// Return.copy(tree)(transformTerm(expr, expr.tpe))
8684
tree
8785
case While(cond, body) =>
88-
While.copy(tree)(transformTerm(cond, TypeRepr.of[Boolean]), transformTerm(body, TypeRepr.of[Any]))
86+
While.copy(tree)(transformTerm(cond, TypeRepr.of[Boolean])(owner), transformTerm(body, TypeRepr.of[Any])(owner))
8987
case Try(block, cases, finalizer) =>
90-
Try.copy(tree)(transformTerm(block, tpe), transformCaseDefs(cases, TypeRepr.of[Any]), finalizer.map(x => transformTerm(x, TypeRepr.of[Any])))
88+
Try.copy(tree)(transformTerm(block, tpe)(owner), transformCaseDefs(cases, TypeRepr.of[Any])(owner), finalizer.map(x => transformTerm(x, TypeRepr.of[Any])(owner)))
9189
case Repeated(elems, elemtpt) =>
92-
Repeated.copy(tree)(transformTerms(elems, elemtpt.tpe), elemtpt)
90+
Repeated.copy(tree)(transformTerms(elems, elemtpt.tpe)(owner), elemtpt)
9391
case Inlined(call, bindings, expansion) =>
94-
Inlined.copy(tree)(call, transformDefinitions(bindings), transformTerm(expansion, tpe)/*()call.symbol.localContext)*/)
92+
Inlined.copy(tree)(call, transformDefinitions(bindings)(owner), transformTerm(expansion, tpe)(owner))
9593
}
9694

97-
def transformTerm(tree: Term, tpe: TypeRepr)(using ctx: Context): Term =
95+
def transformTerm(tree: Term, tpe: TypeRepr)(owner: Symbol): Term =
9896
tree match
9997
case _: Closure =>
10098
tree
10199
case _: Inlined =>
102-
transformTermChildren(tree, tpe)
100+
transformTermChildren(tree, tpe)(owner)
103101
case _ if tree.isExpr =>
104102
type X
105103
val expr = tree.asExpr.asInstanceOf[Expr[X]]
106104
val t = tpe.asType.asInstanceOf[Type[X]]
107105
val transformedExpr = transform(expr)(using qctx, t)
108106
Term.of(transformedExpr)
109107
case _ =>
110-
transformTermChildren(tree, tpe)
108+
transformTermChildren(tree, tpe)(owner)
111109

112-
def transformTypeTree(tree: TypeTree)(using ctx: Context): TypeTree = tree
110+
def transformTypeTree(tree: TypeTree)(owner: Symbol): TypeTree = tree
113111

114-
def transformCaseDef(tree: CaseDef, tpe: TypeRepr)(using ctx: Context): CaseDef =
115-
CaseDef.copy(tree)(tree.pattern, tree.guard.map(x => transformTerm(x, TypeRepr.of[Boolean])), transformTerm(tree.rhs, tpe))
112+
def transformCaseDef(tree: CaseDef, tpe: TypeRepr)(owner: Symbol): CaseDef =
113+
CaseDef.copy(tree)(tree.pattern, tree.guard.map(x => transformTerm(x, TypeRepr.of[Boolean])(owner)), transformTerm(tree.rhs, tpe)(owner))
116114

117-
def transformTypeCaseDef(tree: TypeCaseDef)(using ctx: Context): TypeCaseDef = {
118-
TypeCaseDef.copy(tree)(transformTypeTree(tree.pattern), transformTypeTree(tree.rhs))
119-
}
115+
def transformTypeCaseDef(tree: TypeCaseDef)(owner: Symbol): TypeCaseDef =
116+
TypeCaseDef.copy(tree)(transformTypeTree(tree.pattern)(owner), transformTypeTree(tree.rhs)(owner))
120117

121-
def transformStats(trees: List[Statement])(using ctx: Context): List[Statement] =
122-
trees mapConserve (transformStatement(_))
118+
def transformStats(trees: List[Statement])(owner: Symbol): List[Statement] =
119+
trees.mapConserve(x => transformStatement(x)(owner))
123120

124-
def transformDefinitions(trees: List[Definition])(using ctx: Context): List[Definition] =
125-
trees mapConserve (transformDefinition(_))
121+
def transformDefinitions(trees: List[Definition])(owner: Symbol): List[Definition] =
122+
trees.mapConserve(x => transformDefinition(x)(owner))
126123

127-
def transformTerms(trees: List[Term], tpes: List[TypeRepr])(using ctx: Context): List[Term] =
124+
def transformTerms(trees: List[Term], tpes: List[TypeRepr])(owner: Symbol): List[Term] =
128125
var tpes2 = tpes // TODO use proper zipConserve
129-
trees mapConserve { x =>
126+
trees.mapConserve{ x =>
130127
val tpe :: tail = tpes2
131128
tpes2 = tail
132-
transformTerm(x, tpe)
129+
transformTerm(x, tpe)(owner)
133130
}
134131

135-
def transformTerms(trees: List[Term], tpe: TypeRepr)(using ctx: Context): List[Term] =
136-
trees.mapConserve(x => transformTerm(x, tpe))
132+
def transformTerms(trees: List[Term], tpe: TypeRepr)(owner: Symbol): List[Term] =
133+
trees.mapConserve(x => transformTerm(x, tpe)(owner))
137134

138-
def transformTypeTrees(trees: List[TypeTree])(using ctx: Context): List[TypeTree] =
139-
trees mapConserve (transformTypeTree(_))
135+
def transformTypeTrees(trees: List[TypeTree])(owner: Symbol): List[TypeTree] =
136+
trees.mapConserve(x => transformTypeTree(x)(owner))
140137

141-
def transformCaseDefs(trees: List[CaseDef], tpe: TypeRepr)(using ctx: Context): List[CaseDef] =
142-
trees mapConserve (x => transformCaseDef(x, tpe))
138+
def transformCaseDefs(trees: List[CaseDef], tpe: TypeRepr)(owner: Symbol): List[CaseDef] =
139+
trees.mapConserve(x => transformCaseDef(x, tpe)(owner))
143140

144-
def transformTypeCaseDefs(trees: List[TypeCaseDef])(using ctx: Context): List[TypeCaseDef] =
145-
trees mapConserve (transformTypeCaseDef(_))
141+
def transformTypeCaseDefs(trees: List[TypeCaseDef])(owner: Symbol): List[TypeCaseDef] =
142+
trees.mapConserve(x => transformTypeCaseDef(x)(owner))
146143

147144
}
148-
new MapChildren().transformTermChildren(Term.of(e), TypeRepr.of[T]).asExprOf[T]
145+
new MapChildren().transformTermChildren(Term.of(e), TypeRepr.of[T])(Symbol.spliceOwner).asExprOf[T]
149146
}
150147

151148
end ExprMap

0 commit comments

Comments
 (0)