@@ -769,16 +769,31 @@ object PatternMatcher {
769
769
}
770
770
771
771
/** Emit cases of a switch */
772
- private def emitSwitchCases (cases : List [(List [Tree ], Plan )]): List [CaseDef ] = ( cases : @ unchecked) match {
773
- case (alts, ons) :: cases1 =>
774
- val pat = alts match {
775
- case alt :: Nil => alt
776
- case Nil => Underscore (defn. IntType ) // default case
777
- case _ => Alternative (alts)
772
+ private def emitSwitchCases (cases : List [(List [Tree ], Plan )]): List [CaseDef ] = cases.foldLeft( List [ CaseDef ]()) {
773
+ case (prev, ( alts, ons)) =>
774
+ val pat = simplifyCases( alts) match {
775
+ case Alternative (als) =>
776
+ simplifyCases(removeRedundantCases(prev.map(_.pat), als))
777
+ case t => t
778
778
}
779
- CaseDef (pat, EmptyTree , emit(ons)) :: emitSwitchCases(cases1)
780
- case nil =>
781
- Nil
779
+ CaseDef (pat, EmptyTree , emit(ons)) :: prev
780
+ }
781
+
782
+ /** Remove cases that already appear in the same pattern or in previous patterns */
783
+ private def removeRedundantCases (previousCases : List [Tree ], cases : List [Tree ]): List [Tree ] = cases.foldLeft(List [Tree ]()) {
784
+ case (cases, alt) =>
785
+ if (cases.exists(_ === alt) || previousCases.exists(_ === alt)) {
786
+ cases
787
+ } else {
788
+ alt :: cases
789
+ }
790
+ }
791
+
792
+ /** Flatten a list of patterns into a single tree */
793
+ private def simplifyCases (alts : List [Tree ]): Tree = alts match {
794
+ case alt :: Nil => alt
795
+ case Nil => Underscore (defn.IntType ) // default case
796
+ case _ => Alternative (alts)
782
797
}
783
798
784
799
/** If selfCheck is `true`, used to check whether a tree gets generated twice */
0 commit comments