From 5e6413e5ed0fa0266c8068a7177a1b8d7e498f2d Mon Sep 17 00:00:00 2001 From: Etienne Kneuss <colder@php.net> Date: Wed, 13 Nov 2013 17:20:00 +0100 Subject: [PATCH] Basic flattening for pattern match reconstruction --- src/main/scala/leon/purescala/TreeOps.scala | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/main/scala/leon/purescala/TreeOps.scala b/src/main/scala/leon/purescala/TreeOps.scala index d31c7a392..09f6a01c8 100644 --- a/src/main/scala/leon/purescala/TreeOps.scala +++ b/src/main/scala/leon/purescala/TreeOps.scala @@ -1040,7 +1040,7 @@ object TreeOps { // This transformation assumes IfExpr of the form generated by decomposeIfs def patternMatchReconstruction(e: Expr): Expr = { - def pre(e: Expr): Expr = e match { + def post(e: Expr): Expr = e match { case IfExpr(cond, thenn, elze) => val TopLevelAnds(cases) = cond @@ -1133,7 +1133,20 @@ object TreeOps { p } - MatchExpr(scrutinee, Seq(SimpleCase(simplifyPattern(pattern), newThen), SimpleCase(WildcardPattern(None), elze))).setType(e.getType) + elze match { + case MatchExpr(scrut, cases) if scrut == scrutinee => + MatchExpr(scrutinee, + SimpleCase(simplifyPattern(pattern), newThen) +: + cases + ).setType(e.getType) + + case _ => + MatchExpr(scrutinee, + Seq(SimpleCase(simplifyPattern(pattern), newThen), + SimpleCase(WildcardPattern(None), elze) + ) + ).setType(e.getType) + } } else { e } @@ -1141,7 +1154,7 @@ object TreeOps { e } - simplePreTransform(pre)(e) + simplePostTransform(post)(e) } def simplifyTautologies(sf: SolverFactory[Solver])(expr : Expr) : Expr = { -- GitLab