@@ -4,6 +4,7 @@ import scala.annotation.internal.sharable
44import scala .annotation .{Annotation , compileTimeOnly }
55
66import scala .quoted ._
7+ import scala .internal .tasty .CompilerInterface .quoteContextWithCompilerInterface
78
89/** Matches a quoted tree against a quoted pattern tree.
910 * A quoted pattern tree may have type and term holes in addition to normal terms.
@@ -122,7 +123,9 @@ object Matcher {
122123 @ compileTimeOnly(" Illegal reference to `scala.internal.quoted.CompileTime.fromAbove`" )
123124 class fromAbove extends Annotation
124125
125- class QuoteMatcher [QCtx <: QuoteContext & Singleton ](using val qctx : QCtx ) {
126+ class QuoteMatcher [QCtx <: QuoteContext & Singleton ](val qctx0 : QCtx ) {
127+ val qctx = quoteContextWithCompilerInterface(qctx0)
128+
126129 // TODO improve performance
127130
128131 // TODO use flag from qctx.tasty.rootContext. Maybe -debug or add -debug-macros
@@ -147,14 +150,14 @@ object Matcher {
147150 def termMatch (scrutineeTerm : Term , patternTerm : Term , hasTypeSplices : Boolean ): Option [Tuple ] = {
148151 given Env = Map .empty
149152 if (hasTypeSplices) {
150- val ctx : Context = internal .Constraints_init (rootContext)
153+ val ctx : Context = qctx.tasty .Constraints_init (rootContext)
151154 given Context = ctx
152155 val matchings = scrutineeTerm =?= patternTerm
153156 // After matching and doing all subtype checks, we have to approximate all the type bindings
154157 // that we have found and seal them in a quoted.Type
155158 matchings.asOptionOfTuple.map { tup =>
156159 Tuple .fromArray(tup.toArray.map { // TODO improve performance
157- case x : SymBinding => internal .Constraints_approximation (summon[Context ])(x.sym, ! x.fromAbove).seal
160+ case x : SymBinding => qctx.tasty .Constraints_approximation (summon[Context ])(x.sym, ! x.fromAbove).seal
158161 case x => x
159162 })
160163 }
@@ -168,14 +171,14 @@ object Matcher {
168171 def typeTreeMatch (scrutineeTypeTree : TypeTree , patternTypeTree : TypeTree , hasTypeSplices : Boolean ): Option [Tuple ] = {
169172 given Env = Map .empty
170173 if (hasTypeSplices) {
171- val ctx : Context = internal .Constraints_init (rootContext)
174+ val ctx : Context = qctx.tasty .Constraints_init (rootContext)
172175 given Context = ctx
173176 val matchings = scrutineeTypeTree =?= patternTypeTree
174177 // After matching and doing all subtype checks, we have to approximate all the type bindings
175178 // that we have found and seal them in a quoted.Type
176179 matchings.asOptionOfTuple.map { tup =>
177180 Tuple .fromArray(tup.toArray.map { // TODO improve performance
178- case x : SymBinding => internal .Constraints_approximation (summon[Context ])(x.sym, ! x.fromAbove).seal
181+ case x : SymBinding => qctx.tasty .Constraints_approximation (summon[Context ])(x.sym, ! x.fromAbove).seal
179182 case x => x
180183 })
181184 }
@@ -190,13 +193,13 @@ object Matcher {
190193 private def hasFromAboveAnnotation (sym : Symbol ) = sym.annots.exists(isFromAboveAnnotation)
191194
192195 private def isPatternTypeAnnotation (tree : Tree ): Boolean = tree match {
193- case New (tpt) => tpt.symbol == internal .Definitions_InternalQuotedMatcher_patternTypeAnnot
194- case annot => annot.symbol.owner == internal .Definitions_InternalQuotedMatcher_patternTypeAnnot
196+ case New (tpt) => tpt.symbol == qctx.tasty .Definitions_InternalQuotedMatcher_patternTypeAnnot
197+ case annot => annot.symbol.owner == qctx.tasty .Definitions_InternalQuotedMatcher_patternTypeAnnot
195198 }
196199
197200 private def isFromAboveAnnotation (tree : Tree ): Boolean = tree match {
198- case New (tpt) => tpt.symbol == internal .Definitions_InternalQuotedMatcher_fromAboveAnnot
199- case annot => annot.symbol.owner == internal .Definitions_InternalQuotedMatcher_fromAboveAnnot
201+ case New (tpt) => tpt.symbol == qctx.tasty .Definitions_InternalQuotedMatcher_fromAboveAnnot
202+ case annot => annot.symbol.owner == qctx.tasty .Definitions_InternalQuotedMatcher_fromAboveAnnot
200203 }
201204
202205 /** Check that all trees match with `mtch` and concatenate the results with &&& */
@@ -250,22 +253,22 @@ object Matcher {
250253 /* Term hole */
251254 // Match a scala.internal.Quoted.patternHole typed as a repeated argument and return the scrutinee tree
252255 case (scrutinee @ Typed (s, tpt1), Typed (TypeApply (patternHole, tpt :: Nil ), tpt2))
253- if patternHole.symbol == internal .Definitions_InternalQuotedMatcher_patternHole &&
256+ if patternHole.symbol == qctx.tasty .Definitions_InternalQuotedMatcher_patternHole &&
254257 s.tpe <:< tpt.tpe &&
255258 tpt2.tpe.derivesFrom(defn.RepeatedParamClass ) =>
256259 matched(scrutinee.seal)
257260
258261 /* Term hole */
259262 // Match a scala.internal.Quoted.patternHole and return the scrutinee tree
260263 case (ClosedPatternTerm (scrutinee), TypeApply (patternHole, tpt :: Nil ))
261- if patternHole.symbol == internal .Definitions_InternalQuotedMatcher_patternHole &&
264+ if patternHole.symbol == qctx.tasty .Definitions_InternalQuotedMatcher_patternHole &&
262265 scrutinee.tpe <:< tpt.tpe =>
263266 matched(scrutinee.seal)
264267
265268 /* Higher order term hole */
266269 // Matches an open term and wraps it into a lambda that provides the free variables
267270 case (scrutinee, pattern @ Apply (TypeApply (Ident (" higherOrderHole" ), List (Inferred ())), Repeated (args, _) :: Nil ))
268- if pattern.symbol == internal .Definitions_InternalQuotedMatcher_higherOrderHole =>
271+ if pattern.symbol == qctx.tasty .Definitions_InternalQuotedMatcher_higherOrderHole =>
269272
270273 def bodyFn (lambdaArgs : List [Tree ]): Tree = {
271274 val argsMap = args.map(_.symbol).zip(lambdaArgs.asInstanceOf [List [Term ]]).toMap
@@ -323,7 +326,7 @@ object Matcher {
323326 fn1 =?= fn2 &&& args1 =?= args2
324327
325328 case (Block (stats1, expr1), Block (binding :: stats2, expr2)) if isTypeBinding(binding) =>
326- qctx.tasty.internal. Constraints_add (summon[Context ])(binding.symbol :: Nil )
329+ qctx.tasty.Constraints_add (summon[Context ])(binding.symbol :: Nil )
327330 matched(new SymBinding (binding.symbol, hasFromAboveAnnotation(binding.symbol))) &&& Block (stats1, expr1) =?= Block (stats2, expr2)
328331
329332 /* Match block */
@@ -340,7 +343,7 @@ object Matcher {
340343
341344 case (scrutinee, Block (typeBindings, expr2)) if typeBindings.forall(isTypeBinding) =>
342345 val bindingSymbols = typeBindings.map(_.symbol)
343- qctx.tasty.internal. Constraints_add (summon[Context ])(bindingSymbols)
346+ qctx.tasty.Constraints_add (summon[Context ])(bindingSymbols)
344347 bindingSymbols.foldRight(scrutinee =?= expr2)((x, acc) => matched(new SymBinding (x, hasFromAboveAnnotation(x))) &&& acc)
345348
346349 /* Match if */
0 commit comments