@@ -122,7 +122,7 @@ class QuoteContextImpl private (ctx: Context) extends QuoteContext, QuoteUnpickl
122
122
end extension
123
123
124
124
extension [ThisTree <: Tree ](self : ThisTree ):
125
- def changeOwner ( newOwner : Symbol ): ThisTree =
125
+ def adaptOwner ( using newOwner : Symbol ): ThisTree =
126
126
tpd.TreeOps (self).changeNonLocalOwners(newOwner).asInstanceOf [ThisTree ]
127
127
end extension
128
128
@@ -365,15 +365,15 @@ class QuoteContextImpl private (ctx: Context) extends QuoteContext, QuoteUnpickl
365
365
def tpe : TypeRepr = self.tpe
366
366
def underlyingArgument : Term = new tpd.TreeOps (self).underlyingArgument
367
367
def underlying : Term = new tpd.TreeOps (self).underlying
368
- def etaExpand (owner : Symbol ): Term = self.tpe.widen match {
368
+ def etaExpand (using owner : Owner ): Term = self.tpe.widen match {
369
369
case mtpe : Types .MethodType if ! mtpe.isParamDependent =>
370
370
val closureResType = mtpe.resType match {
371
371
case t : Types .MethodType => t.toFunctionType()
372
372
case t => t
373
373
}
374
374
val closureTpe = Types .MethodType (mtpe.paramNames, mtpe.paramInfos, closureResType)
375
375
val closureMethod = dotc.core.Symbols .newSymbol(owner, nme.ANON_FUN , Synthetic | Method , closureTpe)
376
- tpd.Closure (closureMethod, tss => new tpd.TreeOps (self).appliedToArgs(tss.head).etaExpand(closureMethod))
376
+ tpd.Closure (closureMethod, tss => new tpd.TreeOps (self).appliedToArgs(tss.head).etaExpand(using closureMethod))
377
377
case _ => self
378
378
}
379
379
@@ -735,9 +735,9 @@ class QuoteContextImpl private (ctx: Context) extends QuoteContext, QuoteUnpickl
735
735
end ClosureMethodsImpl
736
736
737
737
object Lambda extends LambdaModule :
738
- def apply (owner : Symbol , tpe : MethodType , rhsFn : ( Symbol , List [Tree ]) => Tree ): Block =
738
+ def apply (tpe : MethodType , rhsFn : Owner ?=> List [Tree ] => Tree )( using owner : Owner ): Block =
739
739
val meth = dotc.core.Symbols .newSymbol(owner, nme.ANON_FUN , Synthetic | Method , tpe)
740
- tpd.Closure (meth, tss => yCheckedOwners(rhsFn(meth, tss.head), meth))
740
+ tpd.Closure (meth, tss => yCheckedOwners(rhsFn(using meth)( tss.head), meth))
741
741
742
742
def unapply (tree : Block ): Option [(List [ValDef ], Term )] = tree match {
743
743
case Block ((ddef @ DefDef (_, _, params :: Nil , _, Some (body))) :: Nil , Closure (meth, _))
@@ -2200,22 +2200,33 @@ class QuoteContextImpl private (ctx: Context) extends QuoteContext, QuoteUnpickl
2200
2200
case _ => None
2201
2201
end AmbiguousImplicitsTypeTest
2202
2202
2203
+ type Owner = dotc.core.Symbols .Symbol
2204
+
2205
+ object Owner extends OwnerModule :
2206
+ def apply (sym : Symbol ): Owner = sym
2207
+ def spliceOwner : Owner = ctx.owner
2208
+ end Owner
2209
+
2210
+ object OwnerMethodsImpl extends OwnerMethods :
2211
+ extension (self : Owner ):
2212
+ def symbol : Symbol = self
2213
+ end OwnerMethodsImpl
2214
+
2203
2215
type Symbol = dotc.core.Symbols .Symbol
2204
2216
2205
2217
object Symbol extends SymbolModule :
2206
- def currentOwner (using ctx : Context ): Symbol = ctx.owner
2207
2218
def requiredPackage (path : String ): Symbol = dotc.core.Symbols .requiredPackage(path)
2208
2219
def requiredClass (path : String ): Symbol = dotc.core.Symbols .requiredClass(path)
2209
2220
def requiredModule (path : String ): Symbol = dotc.core.Symbols .requiredModule(path)
2210
2221
def requiredMethod (path : String ): Symbol = dotc.core.Symbols .requiredMethod(path)
2211
2222
def classSymbol (fullName : String ): Symbol = dotc.core.Symbols .requiredClass(fullName)
2212
- def newMethod (owner : Symbol , name : String , tpe : TypeRepr ): Symbol =
2213
- newMethod(owner, name, tpe, Flags .EmptyFlags , noSymbol)
2214
- def newMethod (owner : Symbol , name : String , tpe : TypeRepr , flags : Flags , privateWithin : Symbol ): Symbol =
2223
+ def newMethod (name : String , tpe : TypeRepr )( using owner : Owner ): Symbol =
2224
+ newMethod(name, tpe, Flags .EmptyFlags , noSymbol)
2225
+ def newMethod (name : String , tpe : TypeRepr , flags : Flags , privateWithin : Symbol )( using owner : Owner ): Symbol =
2215
2226
dotc.core.Symbols .newSymbol(owner, name.toTermName, flags | dotc.core.Flags .Method , tpe, privateWithin)
2216
- def newVal (owner : Symbol , name : String , tpe : TypeRepr , flags : Flags , privateWithin : Symbol ): Symbol =
2227
+ def newVal (name : String , tpe : TypeRepr , flags : Flags , privateWithin : Symbol )( using owner : Owner ): Symbol =
2217
2228
dotc.core.Symbols .newSymbol(owner, name.toTermName, flags, tpe, privateWithin)
2218
- def newBind (owner : Symbol , name : String , flags : Flags , tpe : TypeRepr ): Symbol =
2229
+ def newBind (name : String , flags : Flags , tpe : TypeRepr )( using owner : Owner ): Symbol =
2219
2230
dotc.core.Symbols .newSymbol(owner, name.toTermName, flags | Case , tpe)
2220
2231
def noSymbol : Symbol = dotc.core.Symbols .NoSymbol
2221
2232
end Symbol
@@ -2224,6 +2235,9 @@ class QuoteContextImpl private (ctx: Context) extends QuoteContext, QuoteUnpickl
2224
2235
extension (self : Symbol ):
2225
2236
def owner : Symbol = self.denot.owner
2226
2237
def maybeOwner : Symbol = self.denot.maybeOwner
2238
+ def asOwner : Owner =
2239
+ assert(self.exists, " Cannot convert NoSymbol into an Owner" )
2240
+ self
2227
2241
def flags : Flags = self.denot.flags
2228
2242
2229
2243
def privateWithin : Option [TypeRepr ] =
@@ -2593,6 +2607,7 @@ class QuoteContextImpl private (ctx: Context) extends QuoteContext, QuoteUnpickl
2593
2607
|which has the AST representation
2594
2608
| ${TreeMethods .showExtractors(tree)}
2595
2609
|
2610
+ |Owners can be adapted using `Tree.adaptOwner`.
2596
2611
| """ .stripMargin)
2597
2612
case _ => traverseChildren(t)
2598
2613
}.traverse(tree)
0 commit comments