@@ -8,7 +8,7 @@ Maintainer : The Idris Community.
8{-# LANGUAGE PatternGuards #-}
8{-# LANGUAGE PatternGuards #-}
9{-# OPTIONS_GHC -fwarn-incomplete-patterns #-}
9{-# OPTIONS_GHC -fwarn-incomplete-patterns #-}
10module Idris.Delaborate (
10module Idris.Delaborate (
11− annName, bugaddr, delab, delab', delabMV, delabSugared
11+ annName, bugaddr, delab, delabDirect, delab', delabMV, delabSugared
12 , delabTy, delabTy', fancifyAnnots, pprintDelab, pprintNoDelab
12 , delabTy, delabTy', fancifyAnnots, pprintDelab, pprintNoDelab
13 , pprintDelabTy, pprintErr, resugar
13 , pprintDelabTy, pprintErr, resugar
@@ -81,30 +81,50 @@ delabSugared ist tm = resugar ist $ delab ist tm
82-- | Delaborate a term without resugaring
82-- | Delaborate a term without resugaring
83delab :: IState -> Term -> PTerm
83delab :: IState -> Term -> PTerm
84−delab i tm = delab' i tm False False
84+delab i tm = delab' i tm False False
86delabMV :: IState -> Term -> PTerm
86delabMV :: IState -> Term -> PTerm
87−delabMV i tm = delab' i tm False True
87+delabMV i tm = delab' i tm False True
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
89delabTy :: IState -> Name -> PTerm
95delabTy :: IState -> Name -> PTerm
90delabTy i n
96delabTy i n
91 = case lookupTy n (tt_ctxt i) of
97 = case lookupTy n (tt_ctxt i) of
92 (ty:_) -> case lookupCtxt n (idris_implicits i) of
98 (ty:_) -> case lookupCtxt n (idris_implicits i) of
93− (imps:_) -> delabTy' i imps ty False False
99+ (imps:_) -> delabTy' i imps ty False False True
94− _ -> delabTy' i [] ty False False
100+ _ -> delabTy' i [] ty False False True
95 [] -> error "delabTy: got non-existing name"
101 [] -> error "delabTy: got non-existing name"
97delab' :: IState -> Term -> Bool -> Bool -> PTerm
103delab' :: 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
100delabTy' :: IState -> [PArg] -- ^ implicit arguments to type, if any
106delabTy' :: IState -> [PArg] -- ^ implicit arguments to type, if any
102 -> Bool -- ^ use full names
108 -> Bool -- ^ use full names
103 -> Bool -- ^ Don't treat metavariables specially
109 -> Bool -- ^ Don't treat metavariables specially
110+ -> Bool -- ^ resugar cases
105−delabTy' ist imps tm fullname mvs = de [] imps tm
112+delabTy' ist imps tm fullname mvs docases = de [] imps tm
107 un = fileFC "(val)"
114 un = fileFC "(val)"
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)
125+ , (P _ cOp _, args@(_:_)) <- unApply sc
126+ , Just caseblock <- delabCase env imps (last args) cOp args
109 de env _ (App _ f a) = deFn env f [a]
129 de env _ (App _ f a) = deFn env f [a]
110 de env _ (V i) | i < length env = PRef un [] (snd (env!!i))
130 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
141 = PPi expl n NoFC (de env [] ty) (de ((n,n):env) [] sc)
161 = PPi expl n NoFC (de env [] ty) (de ((n,n):env) [] sc)
143 de env imps (Bind n (Let ty val) sc)
163 de env imps (Bind n (Let ty val) sc)
144− | isCaseApp sc
165+ , isCaseApp sc
145 , (P _ cOp _, args) <- unApply sc
166 , (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
147 | otherwise =
168 | otherwise =
148 PLet un n NoFC (de env [] ty) (de env [] val) (de ((n,n):env) [] sc)
169 PLet un n NoFC (de env [] ty) (de env [] val) (de ((n,n):env) [] sc)
149 de env _ (Bind n (Hole ty) sc) = de ((n, sUN "[__]"):env) [] sc
170 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
206 isCN (SN (CaseN _ _)) = True
227 isCN (SN (CaseN _ _)) = True
207 isCN _ = False
228 isCN _ = False
209− delabCase :: [(Name, Name)] -> [PArg] -> Name -> Term -> Name -> [Term] -> Maybe PTerm
230+ delabCase :: [(Name, Name)] -> [PArg] -> Term -> Name -> [Term] -> Maybe PTerm
210− delabCase env imps scvar scrutinee caseName caseArgs =
231+ delabCase env imps scrutinee caseName caseArgs =
211 do cases <- case lookupCtxt caseName (idris_patdefs ist) of
232 do cases <- case lookupCtxt caseName (idris_patdefs ist) of
212 [(cases, _)] -> return cases
233 [(cases, _)] -> return cases
213 _ -> Nothing
234 _ -> Nothing
@@ -247,8 +268,8 @@ pprintDelabTy i n
247 = case lookupTy n (tt_ctxt i) of
268 = case lookupTy n (tt_ctxt i) of
248 (ty:_) -> annotate (AnnTerm [] ty) . prettyIst i $
269 (ty:_) -> annotate (AnnTerm [] ty) . prettyIst i $
249 case lookupCtxt n (idris_implicits i) of
270 case lookupCtxt n (idris_implicits i) of
250− (imps:_) -> resugar i $ delabTy' i imps ty False False
271+ (imps:_) -> resugar i $ delabTy' i imps ty False False True
251− _ -> resugar i $ delabTy' i [] ty False False
272+ _ -> resugar i $ delabTy' i [] ty False False True
252 [] -> error "pprintDelabTy got a name that doesn't exist"
273 [] -> error "pprintDelabTy got a name that doesn't exist"
254pprintTerm :: IState -> PTerm -> Doc OutputAnnotation
275pprintTerm :: IState -> PTerm -> Doc OutputAnnotation