@@ -203,24 +203,33 @@ object QuoteMatcher {
203203 // Matches an open term and wraps it into a lambda that provides the free variables
204204 case Apply (TypeApply (Ident (_), List (TypeTree ())), SeqLiteral (args, _) :: Nil )
205205 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)
209225 }
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
222232 }
223- matched(Closure (meth, bodyFn))
224233
225234 /* Match type ascription (b) */
226235 case Typed (expr2, _) =>
0 commit comments