@@ -8,7 +8,7 @@ Maintainer : The Idris Community.
88{-# LANGUAGE PatternGuards #-}
99{-# OPTIONS_GHC -fwarn-incomplete-patterns #-}
1010module Idris.Delaborate (
11− annName, bugaddr, delab, delab', delabMV, delabSugared
11+ annName, bugaddr, delab, delabDirect, delab', delabMV, delabSugared
1212 , delabTy, delabTy', fancifyAnnots, pprintDelab, pprintNoDelab
1313 , pprintDelabTy, pprintErr, resugar
1414 ) where
@@ -81,30 +81,50 @@ delabSugared ist tm = resugar ist $ delab ist tm
8181
8282-- | Delaborate a term without resugaring
8383delab :: IState -> Term -> PTerm
84−delab i tm = delab' i tm False False
84+delab i tm = delab' i tm False False
8585
8686delabMV :: IState -> Term -> PTerm
87−delabMV i tm = delab' i tm False True
87+delabMV i tm = delab' i tm False True
88+
89+-- | Delaborate a term directly, leaving case applications as they are.
90+-- We need this for interactive case splitting, where we need access to the
91+-- underlying function in a delaborated form, to generate the right patterns
92+delabDirect :: IState -> Term -> PTerm
93+delabDirect i tm = delabTy' i [] tm False False False
8894
8995delabTy :: IState -> Name -> PTerm
9096delabTy i n
9197 = case lookupTy n (tt_ctxt i) of
9298 (ty:_) -> case lookupCtxt n (idris_implicits i) of
93− (imps:_) -> delabTy' i imps ty False False
94− _ -> delabTy' i [] ty False False
99+ (imps:_) -> delabTy' i imps ty False False True
100+ _ -> delabTy' i [] ty False False True
95101 [] -> error "delabTy: got non-existing name"
96102
97103delab' :: IState -> Term -> Bool -> Bool -> PTerm
98−delab' i t f mvs = delabTy' i [] t f mvs
104+delab' i t f mvs = delabTy' i [] t f mvs True
99105
100106delabTy' :: IState -> [PArg] -- ^ implicit arguments to type, if any
101107 -> Term
102108 -> Bool -- ^ use full names
103109 -> Bool -- ^ Don't treat metavariables specially
110+ -> Bool -- ^ resugar cases
104111 -> PTerm
105−delabTy' ist imps tm fullname mvs = de [] imps tm
112+delabTy' ist imps tm fullname mvs docases = de [] imps tm
106113 where
107114 un = fileFC "(val)"
115+
116+ -- Special case for spotting applications of case functions
117+ -- (Normally the scrutinee is let-bound, but hole types get normalised,
118+ -- so they could appear in this form. The scrutinee is always added as
119+ -- the last argument,
120+ -- although that's not always the thing that gets pattern matched
121+ -- in the elaborated block)
122+ de env imps sc
123+ | docases
124+ , isCaseApp sc
125+ , (P _ cOp _, args@(_:_)) <- unApply sc
126+ , Just caseblock <- delabCase env imps (last args) cOp args
127+ = caseblock
108128
109129 de env _ (App _ f a) = deFn env f [a]
110130 de env _ (V i) | i < length env = PRef un [] (snd (env!!i))
@@ -141,9 +161,10 @@ delabTy' ist imps tm fullname mvs = de [] imps tm
141161 = PPi expl n NoFC (de env [] ty) (de ((n,n):env) [] sc)
142162
143163 de env imps (Bind n (Let ty val) sc)
144− | isCaseApp sc
164+ | docases
165+ , isCaseApp sc
145166 , (P _ cOp _, args) <- unApply sc
146− , Just caseblock <- delabCase env imps n val cOp args = caseblock
167+ , Just caseblock <- delabCase env imps val cOp args = caseblock
147168 | otherwise =
148169 PLet un n NoFC (de env [] ty) (de env [] val) (de ((n,n):env) [] sc)
149170 de env _ (Bind n (Hole ty) sc) = de ((n, sUN "[__]"):env) [] sc
@@ -206,8 +227,8 @@ delabTy' ist imps tm fullname mvs = de [] imps tm
206227 isCN (SN (CaseN _ _)) = True
207228 isCN _ = False
208229
209− delabCase :: [(Name, Name)] -> [PArg] -> Name -> Term -> Name -> [Term] -> Maybe PTerm
210− delabCase env imps scvar scrutinee caseName caseArgs =
230+ delabCase :: [(Name, Name)] -> [PArg] -> Term -> Name -> [Term] -> Maybe PTerm
231+ delabCase env imps scrutinee caseName caseArgs =
211232 do cases <- case lookupCtxt caseName (idris_patdefs ist) of
212233 [(cases, _)] -> return cases
213234 _ -> Nothing
@@ -247,8 +268,8 @@ pprintDelabTy i n
247268 = case lookupTy n (tt_ctxt i) of
248269 (ty:_) -> annotate (AnnTerm [] ty) . prettyIst i $
249270 case lookupCtxt n (idris_implicits i) of
250− (imps:_) -> resugar i $ delabTy' i imps ty False False
251− _ -> resugar i $ delabTy' i [] ty False False
271+ (imps:_) -> resugar i $ delabTy' i imps ty False False True
272+ _ -> resugar i $ delabTy' i [] ty False False True
252273 [] -> error "pprintDelabTy got a name that doesn't exist"
253274
254275pprintTerm :: IState -> PTerm -> Doc OutputAnnotation