@@ -185,7 +185,7 @@ object QuoteMatcher {
185
185
186
186
/* Term hole */
187
187
// Match a scala.internal.Quoted.patternHole typed as a repeated argument and return the scrutinee tree
188
- case (scrutinee @ Typed (s, tpt1), Typed (TypeApply (patternHole, tpt :: Nil ), tpt2))
188
+ case (Typed (s, tpt1), Typed (TypeApply (patternHole, tpt :: Nil ), tpt2))
189
189
if patternHole.symbol.eq(defn.QuotedRuntimePatterns_patternHole ) &&
190
190
s.tpe <:< tpt.tpe &&
191
191
tpt2.tpe.derivesFrom(defn.RepeatedParamClass ) =>
@@ -200,7 +200,7 @@ object QuoteMatcher {
200
200
201
201
/* Higher order term hole */
202
202
// Matches an open term and wraps it into a lambda that provides the free variables
203
- case (scrutinee , pattern @ Apply (TypeApply (Ident (_), List (TypeTree ())), SeqLiteral (args, _) :: Nil ))
203
+ case (_ , pattern @ Apply (TypeApply (Ident (_), List (TypeTree ())), SeqLiteral (args, _) :: Nil ))
204
204
if pattern.symbol.eq(defn.QuotedRuntimePatterns_higherOrderHole ) =>
205
205
val names : List [TermName ] = args.map {
206
206
case Block (List (DefDef (nme.ANON_FUN , _, _, Apply (Ident (name), _))), _) => name.asTermName
@@ -225,154 +225,161 @@ object QuoteMatcher {
225
225
// Match two equivalent trees
226
226
//
227
227
228
- /* Match literal */
229
- case (Literal (constant1), Literal (constant2)) if constant1 == constant2 =>
230
- matched
231
-
232
- /* Match type ascription (a) */
233
- case (Typed (expr1, _), pattern) =>
234
- expr1 =?= pattern
235
-
236
228
/* Match type ascription (b) */
237
- case (scrutinee , Typed (expr2, _)) =>
229
+ case (_ , Typed (expr2, _)) =>
238
230
scrutinee =?= expr2
239
231
240
- /* Match selection */
241
- case (ref : RefTree , Select (qual2, _)) if symbolMatch(scrutinee, pattern) =>
242
- ref match
243
- case Select (qual1, _) => qual1 =?= qual2
244
- case ref : Ident =>
245
- ref.tpe match
246
- case TermRef (qual : TermRef , _) => tpd.ref(qual) =?= qual2
247
- case _ => matched
248
-
249
- /* Match reference */
250
- case (_ : RefTree , _ : Ident ) if symbolMatch(scrutinee, pattern) =>
251
- matched
252
-
253
- /* Match application */
254
- case (Apply (fn1, args1), _) =>
255
- pattern match
256
- case Apply (fn2, args2) =>
257
- fn1 =?= fn2 &&& args1 =?= args2
258
- case _ => notMatched
259
-
260
- /* Match type application */
261
- case (TypeApply (fn1, args1), _) =>
262
- pattern match
263
- case TypeApply (fn2, args2) =>
264
- fn1 =?= fn2 &&& args1 =?= args2
265
- case _ => notMatched
266
-
267
- /* Match block */
268
- case (Block (stat1 :: stats1, expr1), _) =>
269
- pattern match
270
- case Block (stat2 :: stats2, expr2) =>
271
- val newEnv = (stat1, stat2) match {
272
- case (stat1 : MemberDef , stat2 : MemberDef ) =>
273
- summon[Env ] + (stat1.symbol -> stat2.symbol)
274
- case _ =>
275
- summon[Env ]
276
- }
277
- withEnv(newEnv) {
278
- stat1 =?= stat2 &&& Block (stats1, expr1) =?= Block (stats2, expr2)
279
- }
280
- case _ => notMatched
281
-
282
- /* Match if */
283
- case (If (cond1, thenp1, elsep1), _) =>
284
- pattern match
285
- case If (cond2, thenp2, elsep2) =>
286
- cond1 =?= cond2 &&& thenp1 =?= thenp2 &&& elsep1 =?= elsep2
287
- case _ => notMatched
288
-
289
- /* Match while */
290
- case (WhileDo (cond1, body1), _) =>
291
- pattern match
292
- case WhileDo (cond2, body2) => cond1 =?= cond2 &&& body1 =?= body2
293
- case _ => notMatched
294
-
295
- /* Match assign */
296
- case (Assign (lhs1, rhs1), _) =>
297
- pattern match
298
- case Assign (lhs2, rhs2) => lhs1 =?= lhs2 &&& rhs1 =?= rhs2
299
- case _ => notMatched
300
-
301
- /* Match new */
302
- case (New (tpt1), _) =>
303
- pattern match
304
- case New (tpt2) if tpt1.tpe.typeSymbol == tpt2.tpe.typeSymbol => matched
305
- case _ => notMatched
306
-
307
- /* Match this */
308
- case (This (_), _) =>
309
- pattern match
310
- case This (_) if scrutinee.symbol == pattern.symbol => matched
311
- case _ => notMatched
312
-
313
- /* Match super */
314
- case (Super (qual1, mix1), _) =>
315
- pattern match
316
- case Super (qual2, mix2) if mix1 == mix2 => qual1 =?= qual2
317
- case _ => notMatched
318
-
319
- /* Match varargs */
320
- case (SeqLiteral (elems1, _), _) =>
321
- pattern match
322
- case SeqLiteral (elems2, _) if elems1.size == elems2.size => elems1 =?= elems2
323
- case _ => notMatched
324
-
325
- /* Match type */
326
- // TODO remove this?
327
- case (TypeTreeTypeTest (scrutinee), _) =>
328
- pattern match
329
- case TypeTreeTypeTest (pattern) if scrutinee.tpe <:< pattern.tpe => matched
330
- case _ => notMatched
331
-
332
- /* Match val */
333
- case (scrutinee @ ValDef (_, tpt1, _), _) =>
334
- pattern match
335
- case pattern @ ValDef (_, tpt2, _) if checkValFlags() =>
336
- def rhsEnv = summon[Env ] + (scrutinee.symbol -> pattern.symbol)
337
- tpt1 =?= tpt2 &&& withEnv(rhsEnv)(scrutinee.rhs =?= pattern.rhs)
338
- case _ => notMatched
339
-
340
- /* Match def */
341
- case (scrutinee @ DefDef (_, paramss1, tpt1, _), _) =>
342
- pattern match
343
- case pattern @ DefDef (_, paramss2, tpt2, _) =>
344
- def rhsEnv : Env =
345
- val paramSyms : List [(Symbol , Symbol )] =
346
- for
347
- (clause1, clause2) <- paramss1.zip(paramss2)
348
- (param1, param2) <- clause1.zip(clause2)
349
- yield
350
- param1.symbol -> param2.symbol
351
- val oldEnv : Env = summon[Env ]
352
- val newEnv : List [(Symbol , Symbol )] = (scrutinee.symbol -> pattern.symbol) :: paramSyms
353
- oldEnv ++ newEnv
354
- matchLists(paramss1, paramss2)(_ =?= _)
355
- &&& tpt1 =?= tpt2
356
- &&& withEnv(rhsEnv)(scrutinee.rhs =?= pattern.rhs)
357
- case _ => notMatched
358
-
359
- case (Closure (_, _, tpt1), _) =>
360
- pattern match
361
- case Closure (_, _, tpt2) => matched // TODO match tpt1 with tpt2?
362
- case _ => notMatched
363
-
364
- case (NamedArg (name1, arg1), _) =>
365
- pattern match
366
- case NamedArg (name2, arg2) if name1 == name2 => arg1 =?= arg2
367
- case _ => notMatched
368
-
369
- case (EmptyTree , _) =>
370
- if pattern.isEmpty then matched
371
- else notMatched
372
-
373
- // No Match
374
232
case _ =>
375
- notMatched
233
+ (scrutinee, pattern) match
234
+ /* Match type ascription (a) */
235
+ case (Typed (expr1, _), _) =>
236
+ expr1 =?= pattern
237
+
238
+ /* Match literal */
239
+ case (Literal (constant1), _) =>
240
+ pattern match
241
+ case Literal (constant2) if constant1 == constant2 => matched
242
+ case _ => notMatched
243
+
244
+ case (ref : RefTree , _) =>
245
+ pattern match
246
+ /* Match selection */
247
+ case Select (qual2, _) if symbolMatch(scrutinee, pattern) =>
248
+ ref match
249
+ case Select (qual1, _) => qual1 =?= qual2
250
+ case ref : Ident =>
251
+ ref.tpe match
252
+ case TermRef (qual : TermRef , _) => tpd.ref(qual) =?= qual2
253
+ case _ => matched
254
+ /* Match reference */
255
+ case _ : Ident if symbolMatch(scrutinee, pattern) => matched
256
+ /* Match type */
257
+ case TypeTreeTypeTest (pattern) if scrutinee.tpe <:< pattern.tpe => matched
258
+ case _ => notMatched
259
+
260
+ /* Match application */
261
+ case (Apply (fn1, args1), _) =>
262
+ pattern match
263
+ case Apply (fn2, args2) =>
264
+ fn1 =?= fn2 &&& args1 =?= args2
265
+ case _ => notMatched
266
+
267
+ /* Match type application */
268
+ case (TypeApply (fn1, args1), _) =>
269
+ pattern match
270
+ case TypeApply (fn2, args2) =>
271
+ fn1 =?= fn2 &&& args1 =?= args2
272
+ case _ => notMatched
273
+
274
+ /* Match block */
275
+ case (Block (stat1 :: stats1, expr1), _) =>
276
+ pattern match
277
+ case Block (stat2 :: stats2, expr2) =>
278
+ val newEnv = (stat1, stat2) match {
279
+ case (stat1 : MemberDef , stat2 : MemberDef ) =>
280
+ summon[Env ] + (stat1.symbol -> stat2.symbol)
281
+ case _ =>
282
+ summon[Env ]
283
+ }
284
+ withEnv(newEnv) {
285
+ stat1 =?= stat2 &&& Block (stats1, expr1) =?= Block (stats2, expr2)
286
+ }
287
+ case _ => notMatched
288
+
289
+ /* Match if */
290
+ case (If (cond1, thenp1, elsep1), _) =>
291
+ pattern match
292
+ case If (cond2, thenp2, elsep2) =>
293
+ cond1 =?= cond2 &&& thenp1 =?= thenp2 &&& elsep1 =?= elsep2
294
+ case _ => notMatched
295
+
296
+ /* Match while */
297
+ case (WhileDo (cond1, body1), _) =>
298
+ pattern match
299
+ case WhileDo (cond2, body2) => cond1 =?= cond2 &&& body1 =?= body2
300
+ case _ => notMatched
301
+
302
+ /* Match assign */
303
+ case (Assign (lhs1, rhs1), _) =>
304
+ pattern match
305
+ case Assign (lhs2, rhs2) => lhs1 =?= lhs2 &&& rhs1 =?= rhs2
306
+ case _ => notMatched
307
+
308
+ /* Match new */
309
+ case (New (tpt1), _) =>
310
+ pattern match
311
+ case New (tpt2) if tpt1.tpe.typeSymbol == tpt2.tpe.typeSymbol => matched
312
+ case _ => notMatched
313
+
314
+ /* Match this */
315
+ case (This (_), _) =>
316
+ pattern match
317
+ case This (_) if scrutinee.symbol == pattern.symbol => matched
318
+ case _ => notMatched
319
+
320
+ /* Match super */
321
+ case (Super (qual1, mix1), _) =>
322
+ pattern match
323
+ case Super (qual2, mix2) if mix1 == mix2 => qual1 =?= qual2
324
+ case _ => notMatched
325
+
326
+ /* Match varargs */
327
+ case (SeqLiteral (elems1, _), _) =>
328
+ pattern match
329
+ case SeqLiteral (elems2, _) if elems1.size == elems2.size => elems1 =?= elems2
330
+ case _ => notMatched
331
+
332
+ /* Match type */
333
+ // TODO remove this?
334
+ case (TypeTreeTypeTest (scrutinee), _) =>
335
+ pattern match
336
+ case TypeTreeTypeTest (pattern) if scrutinee.tpe <:< pattern.tpe => matched
337
+ case _ => notMatched
338
+
339
+ /* Match val */
340
+ case (scrutinee @ ValDef (_, tpt1, _), _) =>
341
+ pattern match
342
+ case pattern @ ValDef (_, tpt2, _) if checkValFlags() =>
343
+ def rhsEnv = summon[Env ] + (scrutinee.symbol -> pattern.symbol)
344
+ tpt1 =?= tpt2 &&& withEnv(rhsEnv)(scrutinee.rhs =?= pattern.rhs)
345
+ case _ => notMatched
346
+
347
+ /* Match def */
348
+ case (scrutinee @ DefDef (_, paramss1, tpt1, _), _) =>
349
+ pattern match
350
+ case pattern @ DefDef (_, paramss2, tpt2, _) =>
351
+ def rhsEnv : Env =
352
+ val paramSyms : List [(Symbol , Symbol )] =
353
+ for
354
+ (clause1, clause2) <- paramss1.zip(paramss2)
355
+ (param1, param2) <- clause1.zip(clause2)
356
+ yield
357
+ param1.symbol -> param2.symbol
358
+ val oldEnv : Env = summon[Env ]
359
+ val newEnv : List [(Symbol , Symbol )] = (scrutinee.symbol -> pattern.symbol) :: paramSyms
360
+ oldEnv ++ newEnv
361
+ matchLists(paramss1, paramss2)(_ =?= _)
362
+ &&& tpt1 =?= tpt2
363
+ &&& withEnv(rhsEnv)(scrutinee.rhs =?= pattern.rhs)
364
+ case _ => notMatched
365
+
366
+ case (Closure (_, _, tpt1), _) =>
367
+ pattern match
368
+ case Closure (_, _, tpt2) => matched // TODO match tpt1 with tpt2?
369
+ case _ => notMatched
370
+
371
+ case (NamedArg (name1, arg1), _) =>
372
+ pattern match
373
+ case NamedArg (name2, arg2) if name1 == name2 => arg1 =?= arg2
374
+ case _ => notMatched
375
+
376
+ case (EmptyTree , _) =>
377
+ if pattern.isEmpty then matched
378
+ else notMatched
379
+
380
+ // No Match
381
+ case _ =>
382
+ notMatched
376
383
377
384
if (debug && res == notMatched)
378
385
val quotes = QuotesImpl ()
0 commit comments