@@ -203,24 +203,33 @@ object QuoteMatcher {
203
203
// Matches an open term and wraps it into a lambda that provides the free variables
204
204
case Apply (TypeApply (Ident (_), List (TypeTree ())), SeqLiteral (args, _) :: Nil )
205
205
if pattern.symbol.eq(defn.QuotedRuntimePatterns_higherOrderHole ) =>
206
- val names : List [TermName ] = args.map {
207
- case Block (List (DefDef (nme.ANON_FUN , _, _, Apply (Ident (name), _))), _) => name.asTermName
208
- case arg => arg.symbol.name.asTermName
206
+ def hoasClosure = {
207
+ val names : List [TermName ] = args.map {
208
+ case Block (List (DefDef (nme.ANON_FUN , _, _, Apply (Ident (name), _))), _) => name.asTermName
209
+ case arg => arg.symbol.name.asTermName
210
+ }
211
+ val argTypes = args.map(x => x.tpe.widenTermRefExpr)
212
+ val methTpe = MethodType (names)(_ => argTypes, _ => pattern.tpe)
213
+ val meth = newAnonFun(ctx.owner, methTpe)
214
+ def bodyFn (lambdaArgss : List [List [Tree ]]): Tree = {
215
+ val argsMap = args.map(_.symbol).zip(lambdaArgss.head).toMap
216
+ val body = new TreeMap {
217
+ override def transform (tree : Tree )(using Context ): Tree =
218
+ tree match
219
+ case tree : Ident => summon[Env ].get(tree.symbol).flatMap(argsMap.get).getOrElse(tree)
220
+ case tree => super .transform(tree)
221
+ }.transform(scrutinee)
222
+ TreeOps (body).changeNonLocalOwners(meth)
223
+ }
224
+ Closure (meth, bodyFn)
209
225
}
210
- val argTypes = args.map(x => x.tpe.widenTermRefExpr)
211
- val methTpe = MethodType (names)(_ => argTypes, _ => pattern.tpe)
212
- val meth = newAnonFun(ctx.owner, methTpe)
213
- def bodyFn (lambdaArgss : List [List [Tree ]]): Tree = {
214
- val argsMap = args.map(_.symbol).zip(lambdaArgss.head).toMap
215
- val body = new TreeMap {
216
- override def transform (tree : Tree )(using Context ): Tree =
217
- tree match
218
- case tree : Ident => summon[Env ].get(tree.symbol).flatMap(argsMap.get).getOrElse(tree)
219
- case tree => super .transform(tree)
220
- }.transform(scrutinee)
221
- TreeOps (body).changeNonLocalOwners(meth)
226
+ val capturedArgs = args.map(_.symbol)
227
+ val captureEnv = summon[Env ].filter((k, v) => ! capturedArgs.contains(v))
228
+ withEnv(captureEnv) {
229
+ scrutinee match
230
+ case ClosedPatternTerm (scrutinee) => matched(hoasClosure)
231
+ case _ => notMatched
222
232
}
223
- matched(Closure (meth, bodyFn))
224
233
225
234
/* Match type ascription (b) */
226
235
case Typed (expr2, _) =>
0 commit comments