@@ -87,13 +87,6 @@ import scala.quoted._
87
87
* /* Match def */
88
88
* '{ def x0(x1: T1, ..., xn: Tn): T0 = e1; e2 } =?= '{ def y0(y1: P1, ..., yn: Pn): P0 = p1; p2 } ===> withEnv(x0 -> y0, ..., xn -> yn)('[T0] =?= '[P0] &&& ... &&& '[Tn] =?= '[Pn] &&& '{e1} =?= '{p1} &&& '{e2} =?= '{p2})
89
89
*
90
- * /* Match match */
91
- * '{ e0 match { case u1 => e1; ...; case un => en } } =?= '{ p0 match { case q1 => p1; ...; case qn => pn } } ===>
92
- * '{e0} =?= '{p0} &&& ... &&& '{en} =?= '{pn} &&& '⟨u1⟩ =?= '⟨q1⟩ &&& ... &&& '⟨un⟩ =?= '⟨qn⟩
93
- *
94
- * /* Match try */
95
- * '{ try e0 catch { case u1 => e1; ...; case un => en } finally ef } =?= '{ try p0 catch { case q1 => p1; ...; case qn => pn } finally pf } ===> '{e0} =?= '{p0} &&& ... &&& '{en} =?= '{pn} &&& '⟨u1⟩ =?= '⟨q1⟩ &&& ... &&& '⟨un⟩ =?= '⟨qn⟩ &&& '{ef} =?= '{pf}
96
- *
97
90
* // Types
98
91
*
99
92
* /* Match type */
@@ -107,30 +100,6 @@ import scala.quoted._
107
100
*
108
101
* /* Match annot (b) */
109
102
* '[T] =?= '[P @annot] ===> '[T] =?= '[P]
110
- *
111
- * // Patterns
112
- *
113
- * /* Match pattern whildcard */
114
- * '⟨ _ ⟩ =?= '⟨ _ ⟩ ===> matched
115
- *
116
- * /* Match pattern bind */
117
- * '⟨ x @ e ⟩ =?= '⟨ y @ p ⟩ ===> withEnv(x -> y)('⟨e⟩ =?= '⟨p⟩)
118
- *
119
- * /* Match pattern unapply */
120
- * '⟨ e0(e1, ..., en)(using i1, ..., im ) ⟩ =?= '⟨ p0(p1, ..., pn)(using q1, ..., 1m) ⟩ ===> '⟨e0⟩ =?= '⟨p0⟩ &&& ... &&& '⟨en⟩ =?= '⟨pn⟩ &&& '{i1} =?= '{q1} &&& ... &&& '{im} =?= '{qm}
121
- *
122
- * /* Match pattern alternatives */
123
- * '⟨ e1 | ... | en ⟩ =?= '⟨ p1 | ... | pn ⟩ ===> '⟨e1⟩ =?= '⟨p1⟩ &&& ... &&& '⟨en⟩ =?= '⟨pn⟩
124
- *
125
- * /* Match pattern type test */
126
- * '⟨ e: T ⟩ =?= '⟨ p: U ⟩ ===> '⟨e⟩ =?= '⟨p⟩ &&& '[T] =?= [U]
127
- *
128
- * /* Match pattern ref */
129
- * '⟨ `x` ⟩ =?= '⟨ `x` ⟩ ===> matched
130
- *
131
- * /* Match pattern ref splice */
132
- * '⟨ `x` ⟩ =?= '⟨ hole ⟩ ===> matched('{`x`})
133
- *
134
103
* ```
135
104
*/
136
105
private [quoted] object Matcher {
@@ -409,14 +378,6 @@ private[quoted] object Matcher {
409
378
// TODO match tpt1 with tpt2?
410
379
matched
411
380
412
- /* Match match */
413
- case (Match (scru1, cases1), Match (scru2, cases2)) =>
414
- scru1 =?= scru2 &&& matchLists(cases1, cases2)(caseMatches)
415
-
416
- /* Match try */
417
- case (Try (body1, cases1, finalizer1), Try (body2, cases2, finalizer2)) =>
418
- body1 =?= body2 &&& matchLists(cases1, cases2)(caseMatches) &&& treeOptMatches(finalizer1, finalizer2)
419
-
420
381
// Ignore type annotations
421
382
// TODO remove this
422
383
/* Match annot (a) */
@@ -488,86 +449,6 @@ private[quoted] object Matcher {
488
449
}
489
450
}
490
451
491
- private def caseMatches (scrutinee : CaseDef , pattern : CaseDef )(using Context , Env ): Matching = {
492
- val (caseEnv, patternMatch) = patternsMatches(scrutinee.pattern, pattern.pattern)
493
- withEnv(caseEnv) {
494
- patternMatch
495
- &&& treeOptMatches(scrutinee.guard, pattern.guard)
496
- &&& scrutinee.rhs =?= pattern.rhs
497
- }
498
- }
499
-
500
-
501
- /** Check that the pattern trees match and return the contents from the pattern holes.
502
- * Return a tuple with the new environment containing the bindings defined in this pattern and a matching.
503
- * The matching is None if the pattern trees do not match otherwise return Some of a tuple containing all the contents in the holes.
504
- *
505
- * @param scrutinee The pattern tree beeing matched
506
- * @param pattern The pattern tree that the scrutinee should match. Contains `patternHole` holes.
507
- * @param `summon[Env]` Set of tuples containing pairs of symbols (s, p) where s defines a symbol in `scrutinee` which corresponds to symbol p in `pattern`.
508
- * @return The new environment containing the bindings defined in this pattern tuppled with
509
- * `None` if it did not match or `Some(tup: Tuple)` if it matched where `tup` contains the contents of the holes.
510
- */
511
- private def patternsMatches (scrutinee : Tree , pattern : Tree )(using Context , Env ): (Env , Matching ) = (scrutinee, pattern) match {
512
- /* Match pattern ref splice */
513
- case (v1 : Term , Unapply (TypeApply (Select (patternHole @ Ident (" patternHole" ), " unapply" ), List (tpt)), Nil , Nil ))
514
- if patternHole.symbol.owner == summon[Context ].requiredModule(" scala.runtime.quoted.Matcher" ) =>
515
- (summon[Env ], matched(v1.seal))
516
-
517
- /* Match pattern whildcard */
518
- case (Ident (" _" ), Ident (" _" )) =>
519
- (summon[Env ], matched)
520
-
521
- /* Match pattern bind */
522
- case (Bind (name1, body1), Bind (name2, body2)) =>
523
- val bindEnv = summon[Env ] + (scrutinee.symbol -> pattern.symbol)
524
- patternsMatches(body1, body2)(using summon[Context ], bindEnv)
525
-
526
- /* Match pattern unapply */
527
- case (Unapply (fun1, implicits1, patterns1), Unapply (fun2, implicits2, patterns2)) =>
528
- val (patEnv, patternsMatch) = foldPatterns(patterns1, patterns2)
529
- (patEnv, patternsMatches(fun1, fun2)._2 &&& implicits1 =?= implicits2 &&& patternsMatch)
530
-
531
- /* Match pattern alternatives */
532
- case (Alternatives (patterns1), Alternatives (patterns2)) =>
533
- foldPatterns(patterns1, patterns2)
534
-
535
- /* Match pattern type test */
536
- case (Typed (Ident (" _" ), tpt1), Typed (Ident (" _" ), tpt2)) =>
537
- (summon[Env ], tpt1 =?= tpt2)
538
-
539
- case (v1 : Term , v2 : Term ) =>
540
- (summon[Env ], v1 =?= v2)
541
-
542
- case _ =>
543
- if (debug)
544
- println(
545
- s """ >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
546
- |Scrutinee
547
- | ${scrutinee.show}
548
- |
549
- | ${scrutinee.showExtractors}
550
- |
551
- |did not match pattern
552
- | ${pattern.show}
553
- |
554
- | ${pattern.showExtractors}
555
- |
556
- |with environment: ${summon[Env ]}
557
- |
558
- |
559
- | """ .stripMargin)
560
- (summon[Env ], notMatched)
561
- }
562
-
563
- private def foldPatterns (patterns1 : List [Tree ], patterns2 : List [Tree ])(using Context , Env ): (Env , Matching ) = {
564
- if (patterns1.size != patterns2.size) (summon[Env ], notMatched)
565
- else patterns1.zip(patterns2).foldLeft((summon[Env ], matched)) { (acc, x) =>
566
- val (env, res) = patternsMatches(x._1, x._2)(using summon[Context ], acc._1)
567
- (env, acc._2 &&& res)
568
- }
569
- }
570
-
571
452
private def isTypeBinding (tree : Tree ): Boolean = tree match {
572
453
case tree : TypeDef => hasPatternTypeAnnotation(tree.symbol)
573
454
case _ => false
0 commit comments