@@ -187,12 +187,6 @@ object Matcher {
187
187
case _ => None
188
188
end TypeTreeTypeTest
189
189
190
- object Lambda :
191
- def apply (owner : Symbol , tpe : MethodType , rhsFn : (Symbol , List [Tree ]) => Tree ): Block =
192
- val meth = newSymbol(owner, nme.ANON_FUN , Synthetic | Method , tpe)
193
- Closure (meth, tss => rhsFn(meth, tss.head))
194
- end Lambda
195
-
196
190
(scrutinee, pattern) match
197
191
198
192
/* Term hole */
@@ -214,29 +208,24 @@ object Matcher {
214
208
// Matches an open term and wraps it into a lambda that provides the free variables
215
209
case (scrutinee, pattern @ Apply (TypeApply (Ident (_), List (TypeTree ())), SeqLiteral (args, _) :: Nil ))
216
210
if pattern.symbol.eq(defn.QuotedRuntimePatterns_higherOrderHole ) =>
217
-
218
- def bodyFn (lambdaArgs : List [Tree ]): Tree = {
219
- val argsMap = args.map(_.symbol).zip(lambdaArgs).toMap
220
- new TreeMap {
211
+ val names : List [TermName ] = args.map {
212
+ case Block (List (DefDef (nme.ANON_FUN , _, _, Apply (Ident (name), _))), _) => name.asTermName
213
+ case arg => arg.symbol.name.asTermName
214
+ }
215
+ val argTypes = args.map(x => x.tpe.widenTermRefExpr)
216
+ val methTpe = MethodType (names)(_ => argTypes, _ => pattern.tpe)
217
+ val meth = newSymbol(ctx.owner, nme.ANON_FUN , Synthetic | Method , methTpe)
218
+ def bodyFn (lambdaArgss : List [List [Tree ]]): Tree = {
219
+ val argsMap = args.map(_.symbol).zip(lambdaArgss.head).toMap
220
+ val body = new TreeMap {
221
221
override def transform (tree : Tree )(using Context ): Tree =
222
222
tree match
223
223
case tree : Ident => summon[Env ].get(tree.symbol).flatMap(argsMap.get).getOrElse(tree)
224
224
case tree => super .transform(tree)
225
225
}.transform(scrutinee)
226
+ TreeOps (body).changeNonLocalOwners(meth)
226
227
}
227
- val names : List [TermName ] = args.map {
228
- case Block (List (DefDef (nme.ANON_FUN , _, _, Apply (Ident (name), _))), _) => name.asTermName
229
- case arg => arg.symbol.name.asTermName
230
- }
231
- val argTypes = args.map(x => x.tpe.widenTermRefExpr)
232
- val resType = pattern.tpe
233
- val res =
234
- Lambda (
235
- ctx.owner,
236
- MethodType (names)(
237
- _ => argTypes, _ => resType),
238
- (meth, x) => TreeOps (bodyFn(x)).changeNonLocalOwners(meth))
239
- matched(res)
228
+ matched(Closure (meth, bodyFn))
240
229
241
230
//
242
231
// Match two equivalent trees
0 commit comments