Remove the unused HsExpr constructor DictPat
[ghc-hetmet.git] / compiler / deSugar / Check.lhs
1 %
2 % (c) The University of Glasgow 2006
3 % (c) The GRASP/AQUA Project, Glasgow University, 1997-1998
4 %
5 % Author: Juan J. Quintela    <quintela@krilin.dc.fi.udc.es>
6
7 \begin{code}
8 module Check ( check , ExhaustivePat ) where
9
10 #include "HsVersions.h"
11
12 import HsSyn            
13 import TcHsSyn
14 import DsUtils
15 import MatchLit
16 import Id
17 import DataCon
18 import Name
19 import TysWiredIn
20 import PrelNames
21 import TyCon
22 import BasicTypes
23 import SrcLoc
24 import UniqSet
25 import Util
26 import Outputable
27 import FastString
28 \end{code}
29
30 This module performs checks about if one list of equations are:
31 \begin{itemize}
32 \item Overlapped
33 \item Non exhaustive
34 \end{itemize}
35 To discover that we go through the list of equations in a tree-like fashion.
36
37 If you like theory, a similar algorithm is described in:
38 \begin{quotation}
39         {\em Two Techniques for Compiling Lazy Pattern Matching},
40         Luc Maranguet,
41         INRIA Rocquencourt (RR-2385, 1994)
42 \end{quotation}
43 The algorithm is based on the first technique, but there are some differences:
44 \begin{itemize}
45 \item We don't generate code
46 \item We have constructors and literals (not only literals as in the 
47           article)
48 \item We don't use directions, we must select the columns from 
49           left-to-right
50 \end{itemize}
51 (By the way the second technique is really similar to the one used in 
52  @Match.lhs@ to generate code)
53
54 This function takes the equations of a pattern and returns:
55 \begin{itemize}
56 \item The patterns that are not recognized
57 \item The equations that are not overlapped
58 \end{itemize}
59 It simplify the patterns and then call @check'@ (the same semantics), and it 
60 needs to reconstruct the patterns again ....
61
62 The problem appear with things like:
63 \begin{verbatim}
64   f [x,y]   = ....
65   f (x:xs)  = .....
66 \end{verbatim}
67 We want to put the two patterns with the same syntax, (prefix form) and 
68 then all the constructors are equal:
69 \begin{verbatim}
70   f (: x (: y []))   = ....
71   f (: x xs)         = .....
72 \end{verbatim}
73 (more about that in @simplify_eqns@)
74
75 We would prefer to have a @WarningPat@ of type @String@, but Strings and the 
76 Pretty Printer are not friends.
77
78 We use @InPat@ in @WarningPat@ instead of @OutPat@
79 because we need to print the 
80 warning messages in the same way they are introduced, i.e. if the user 
81 wrote:
82 \begin{verbatim}
83         f [x,y] = ..
84 \end{verbatim}
85 He don't want a warning message written:
86 \begin{verbatim}
87         f (: x (: y [])) ........
88 \end{verbatim}
89 Then we need to use InPats.
90 \begin{quotation}
91      Juan Quintela 5 JUL 1998\\
92           User-friendliness and compiler writers are no friends.
93 \end{quotation}
94
95 \begin{code}
96 type WarningPat = InPat Name
97 type ExhaustivePat = ([WarningPat], [(Name, [HsLit])])
98 type EqnNo  = Int
99 type EqnSet = UniqSet EqnNo
100
101
102 check :: [EquationInfo] -> ([ExhaustivePat], [EquationInfo])
103         -- Second result is the shadowed equations
104 check qs = (untidy_warns, shadowed_eqns)
105       where
106         (warns, used_nos) = check' ([1..] `zip` map simplify_eqn qs)
107         untidy_warns = map untidy_exhaustive warns 
108         shadowed_eqns = [eqn | (eqn,i) <- qs `zip` [1..], 
109                                 not (i `elementOfUniqSet` used_nos)]
110
111 untidy_exhaustive :: ExhaustivePat -> ExhaustivePat
112 untidy_exhaustive ([pat], messages) = 
113                   ([untidy_no_pars pat], map untidy_message messages)
114 untidy_exhaustive (pats, messages) = 
115                   (map untidy_pars pats, map untidy_message messages)
116
117 untidy_message :: (Name, [HsLit]) -> (Name, [HsLit])
118 untidy_message (string, lits) = (string, map untidy_lit lits)
119 \end{code}
120
121 The function @untidy@ does the reverse work of the @simplify_pat@ funcion.
122
123 \begin{code}
124
125 type NeedPars = Bool 
126
127 untidy_no_pars :: WarningPat -> WarningPat
128 untidy_no_pars p = untidy False p
129
130 untidy_pars :: WarningPat -> WarningPat
131 untidy_pars p = untidy True p
132
133 untidy :: NeedPars -> WarningPat -> WarningPat
134 untidy b (L loc p) = L loc (untidy' b p)
135   where
136     untidy' _ p@(WildPat _)   = p
137     untidy' _ p@(VarPat name) = p
138     untidy' _ (LitPat lit)    = LitPat (untidy_lit lit)
139     untidy' _ p@(ConPatIn name (PrefixCon [])) = p
140     untidy' b (ConPatIn name ps)     = pars b (L loc (ConPatIn name (untidy_con ps)))
141     untidy' _ (ListPat pats ty)      = ListPat (map untidy_no_pars pats) ty
142     untidy' _ (TuplePat pats box ty) = TuplePat (map untidy_no_pars pats) box ty
143     untidy' _ (PArrPat _ _)          = panic "Check.untidy: Shouldn't get a parallel array here!"
144     untidy' _ (SigPatIn _ _)         = panic "Check.untidy: SigPat"
145
146 untidy_con (PrefixCon pats) = PrefixCon (map untidy_pars pats) 
147 untidy_con (InfixCon p1 p2) = InfixCon  (untidy_pars p1) (untidy_pars p2)
148 untidy_con (RecCon bs)      = RecCon    [ HsRecField f (untidy_pars p) d | HsRecField f p d <- bs ]
149
150 pars :: NeedPars -> WarningPat -> Pat Name
151 pars True p = ParPat p
152 pars _    p = unLoc p
153
154 untidy_lit :: HsLit -> HsLit
155 untidy_lit (HsCharPrim c) = HsChar c
156 untidy_lit lit            = lit
157 \end{code}
158
159 This equation is the same that check, the only difference is that the
160 boring work is done, that work needs to be done only once, this is
161 the reason top have two functions, check is the external interface,
162 @check'@ is called recursively.
163
164 There are several cases:
165
166 \begin{itemize} 
167 \item There are no equations: Everything is OK. 
168 \item There are only one equation, that can fail, and all the patterns are
169       variables. Then that equation is used and the same equation is 
170       non-exhaustive.
171 \item All the patterns are variables, and the match can fail, there are 
172       more equations then the results is the result of the rest of equations 
173       and this equation is used also.
174
175 \item The general case, if all the patterns are variables (here the match 
176       can't fail) then the result is that this equation is used and this 
177       equation doesn't generate non-exhaustive cases.
178
179 \item In the general case, there can exist literals ,constructors or only 
180       vars in the first column, we actuate in consequence.
181
182 \end{itemize}
183
184
185 \begin{code}
186
187 check' :: [(EqnNo, EquationInfo)] 
188         -> ([ExhaustivePat],    -- Pattern scheme that might not be matched at all
189             EqnSet)             -- Eqns that are used (others are overlapped)
190
191 check' [] = ([([],[])],emptyUniqSet)
192
193 check' ((n, EqnInfo { eqn_pats = ps, eqn_rhs = MatchResult can_fail _ }) : rs) 
194    | first_eqn_all_vars && case can_fail of { CantFail -> True; CanFail -> False }
195    = ([], unitUniqSet n)        -- One eqn, which can't fail
196
197    | first_eqn_all_vars && null rs      -- One eqn, but it can fail
198    = ([(takeList ps (repeat nlWildPat),[])], unitUniqSet n)
199
200    | first_eqn_all_vars         -- Several eqns, first can fail
201    = (pats, addOneToUniqSet indexs n)
202   where
203     first_eqn_all_vars = all_vars ps
204     (pats,indexs) = check' rs
205
206 check' qs
207    | literals     = split_by_literals qs
208    | constructors = split_by_constructor qs
209    | only_vars    = first_column_only_vars qs
210    | otherwise    = pprPanic "Check.check': Not implemented :-(" (ppr first_pats)
211   where
212      -- Note: RecPats will have been simplified to ConPats
213      --       at this stage.
214     first_pats   = ASSERT2( okGroup qs, pprGroup qs ) map firstPatN qs
215     constructors = any is_con first_pats
216     literals     = any is_lit first_pats
217     only_vars    = all is_var first_pats
218 \end{code}
219
220 Here begins the code to deal with literals, we need to split the matrix
221 in different matrix beginning by each literal and a last matrix with the 
222 rest of values.
223
224 \begin{code}
225 split_by_literals :: [(EqnNo, EquationInfo)] -> ([ExhaustivePat], EqnSet)
226 split_by_literals qs = process_literals used_lits qs
227            where
228              used_lits = get_used_lits qs
229 \end{code}
230
231 @process_explicit_literals@ is a function that process each literal that appears 
232 in the column of the matrix. 
233
234 \begin{code}
235 process_explicit_literals :: [HsLit] -> [(EqnNo, EquationInfo)] -> ([ExhaustivePat],EqnSet)
236 process_explicit_literals lits qs = (concat pats, unionManyUniqSets indexs)
237     where                  
238       pats_indexs   = map (\x -> construct_literal_matrix x qs) lits
239       (pats,indexs) = unzip pats_indexs 
240 \end{code}
241
242
243 @process_literals@ calls @process_explicit_literals@ to deal with the literals 
244 that appears in the matrix and deal also with the rest of the cases. It 
245 must be one Variable to be complete.
246
247 \begin{code}
248
249 process_literals :: [HsLit] -> [(EqnNo, EquationInfo)] -> ([ExhaustivePat],EqnSet)
250 process_literals used_lits qs 
251   | null default_eqns  = ASSERT( not (null qs) ) ([make_row_vars used_lits (head qs)] ++ pats,indexs)
252   | otherwise          = (pats_default,indexs_default)
253      where
254        (pats,indexs)   = process_explicit_literals used_lits qs
255        default_eqns    = ASSERT2( okGroup qs, pprGroup qs ) 
256                          [remove_var q | q <- qs, is_var (firstPatN q)]
257        (pats',indexs') = check' default_eqns 
258        pats_default    = [(nlWildPat:ps,constraints) | (ps,constraints) <- (pats')] ++ pats 
259        indexs_default  = unionUniqSets indexs' indexs
260 \end{code}
261
262 Here we have selected the literal and we will select all the equations that 
263 begins for that literal and create a new matrix.
264
265 \begin{code}
266 construct_literal_matrix :: HsLit -> [(EqnNo, EquationInfo)] -> ([ExhaustivePat],EqnSet)
267 construct_literal_matrix lit qs =
268     (map (\ (xs,ys) -> (new_lit:xs,ys)) pats,indexs) 
269   where
270     (pats,indexs) = (check' (remove_first_column_lit lit qs)) 
271     new_lit = nlLitPat lit
272
273 remove_first_column_lit :: HsLit
274                         -> [(EqnNo, EquationInfo)] 
275                         -> [(EqnNo, EquationInfo)]
276 remove_first_column_lit lit qs
277   = ASSERT2( okGroup qs, pprGroup qs ) 
278     [(n, shift_pat eqn) | q@(n,eqn) <- qs, is_var_lit lit (firstPatN q)]
279   where
280      shift_pat eqn@(EqnInfo { eqn_pats = _:ps}) = eqn { eqn_pats = ps }
281      shift_pat eqn@(EqnInfo { eqn_pats = []})   = panic "Check.shift_var: no patterns"
282 \end{code}
283
284 This function splits the equations @qs@ in groups that deal with the 
285 same constructor.
286
287 \begin{code}
288 split_by_constructor :: [(EqnNo, EquationInfo)] -> ([ExhaustivePat], EqnSet)
289 split_by_constructor qs 
290   | notNull unused_cons = need_default_case used_cons unused_cons qs 
291   | otherwise           = no_need_default_case used_cons qs 
292                        where 
293                           used_cons   = get_used_cons qs 
294                           unused_cons = get_unused_cons used_cons 
295 \end{code}
296
297 The first column of the patterns matrix only have vars, then there is 
298 nothing to do.
299
300 \begin{code}
301 first_column_only_vars :: [(EqnNo, EquationInfo)] -> ([ExhaustivePat],EqnSet)
302 first_column_only_vars qs = (map (\ (xs,ys) -> (nlWildPat:xs,ys)) pats,indexs)
303                           where
304                             (pats, indexs) = check' (map remove_var qs)
305 \end{code}
306
307 This equation takes a matrix of patterns and split the equations by 
308 constructor, using all the constructors that appears in the first column 
309 of the pattern matching.
310
311 We can need a default clause or not ...., it depends if we used all the 
312 constructors or not explicitly. The reasoning is similar to @process_literals@,
313 the difference is that here the default case is not always needed.
314
315 \begin{code}
316 no_need_default_case :: [Pat Id] -> [(EqnNo, EquationInfo)] -> ([ExhaustivePat],EqnSet)
317 no_need_default_case cons qs = (concat pats, unionManyUniqSets indexs)
318     where                  
319       pats_indexs   = map (\x -> construct_matrix x qs) cons
320       (pats,indexs) = unzip pats_indexs 
321
322 need_default_case :: [Pat Id] -> [DataCon] -> [(EqnNo, EquationInfo)] -> ([ExhaustivePat],EqnSet)
323 need_default_case used_cons unused_cons qs 
324   | null default_eqns  = (pats_default_no_eqns,indexs)
325   | otherwise          = (pats_default,indexs_default)
326      where
327        (pats,indexs)   = no_need_default_case used_cons qs
328        default_eqns    = ASSERT2( okGroup qs, pprGroup qs ) 
329                          [remove_var q | q <- qs, is_var (firstPatN q)]
330        (pats',indexs') = check' default_eqns 
331        pats_default    = [(make_whole_con c:ps,constraints) | 
332                           c <- unused_cons, (ps,constraints) <- pats'] ++ pats
333        new_wilds       = ASSERT( not (null qs) ) make_row_vars_for_constructor (head qs)
334        pats_default_no_eqns =  [(make_whole_con c:new_wilds,[]) | c <- unused_cons] ++ pats
335        indexs_default  = unionUniqSets indexs' indexs
336
337 construct_matrix :: Pat Id -> [(EqnNo, EquationInfo)] -> ([ExhaustivePat],EqnSet)
338 construct_matrix con qs =
339     (map (make_con con) pats,indexs) 
340   where
341     (pats,indexs) = (check' (remove_first_column con qs)) 
342 \end{code}
343
344 Here remove first column is more difficult that with literals due to the fact 
345 that constructors can have arguments.
346
347 For instance, the matrix
348 \begin{verbatim}
349  (: x xs) y
350  z        y
351 \end{verbatim}
352 is transformed in:
353 \begin{verbatim}
354  x xs y
355  _ _  y
356 \end{verbatim}
357
358 \begin{code}
359 remove_first_column :: Pat Id                -- Constructor 
360                     -> [(EqnNo, EquationInfo)] 
361                     -> [(EqnNo, EquationInfo)]
362 remove_first_column (ConPatOut{ pat_con = L _ con, pat_args = PrefixCon con_pats }) qs
363   = ASSERT2( okGroup qs, pprGroup qs ) 
364     [(n, shift_var eqn) | q@(n, eqn) <- qs, is_var_con con (firstPatN q)]
365   where
366      new_wilds = [WildPat (hsLPatType arg_pat) | arg_pat <- con_pats]
367      shift_var eqn@(EqnInfo { eqn_pats = ConPatOut{ pat_args = PrefixCon ps' } : ps}) 
368         = eqn { eqn_pats = map unLoc ps' ++ ps }
369      shift_var eqn@(EqnInfo { eqn_pats = WildPat _ : ps })
370         = eqn { eqn_pats = new_wilds ++ ps }
371      shift_var _ = panic "Check.Shift_var:No done"
372
373 make_row_vars :: [HsLit] -> (EqnNo, EquationInfo) -> ExhaustivePat
374 make_row_vars used_lits (_, EqnInfo { eqn_pats = pats})
375    = (nlVarPat new_var:takeList (tail pats) (repeat nlWildPat),[(new_var,used_lits)])
376   where 
377      new_var = hash_x
378
379 hash_x = mkInternalName unboundKey {- doesn't matter much -}
380                      (mkVarOccFS FSLIT("#x"))
381                      noSrcSpan
382
383 make_row_vars_for_constructor :: (EqnNo, EquationInfo) -> [WarningPat]
384 make_row_vars_for_constructor (_, EqnInfo { eqn_pats = pats}) 
385   = takeList (tail pats) (repeat nlWildPat)
386
387 compare_cons :: Pat Id -> Pat Id -> Bool
388 compare_cons (ConPatOut{ pat_con = L _ id1 }) (ConPatOut { pat_con = L _ id2 }) = id1 == id2  
389
390 remove_dups :: [Pat Id] -> [Pat Id]
391 remove_dups []     = []
392 remove_dups (x:xs) | or (map (\y -> compare_cons x y) xs) = remove_dups  xs
393                    | otherwise                            = x : remove_dups xs
394
395 get_used_cons :: [(EqnNo, EquationInfo)] -> [Pat Id]
396 get_used_cons qs = remove_dups [pat | q <- qs, let pat = firstPatN q, 
397                                       isConPatOut pat]
398
399 isConPatOut (ConPatOut {}) = True
400 isConPatOut other          = False
401
402 remove_dups' :: [HsLit] -> [HsLit] 
403 remove_dups' []                   = []
404 remove_dups' (x:xs) | x `elem` xs = remove_dups' xs
405                     | otherwise   = x : remove_dups' xs 
406
407
408 get_used_lits :: [(EqnNo, EquationInfo)] -> [HsLit]
409 get_used_lits qs = remove_dups' all_literals
410                  where
411                    all_literals = get_used_lits' qs
412
413 get_used_lits' :: [(EqnNo, EquationInfo)] -> [HsLit]
414 get_used_lits' [] = []
415 get_used_lits' (q:qs) 
416   | Just lit <- get_lit (firstPatN q) = lit : get_used_lits' qs
417   | otherwise                         = get_used_lits qs
418
419 get_lit :: Pat id -> Maybe HsLit 
420 -- Get a representative HsLit to stand for the OverLit
421 -- It doesn't matter which one, because they will only be compared
422 -- with other HsLits gotten in the same way
423 get_lit (LitPat lit)                     = Just lit
424 get_lit (NPat (HsIntegral i   _) mb _ _) = Just (HsIntPrim   (mb_neg mb i))
425 get_lit (NPat (HsFractional f _) mb _ _) = Just (HsFloatPrim (mb_neg mb f))
426 get_lit (NPat (HsIsString s   _)  _ _ _) = Just (HsStringPrim s)
427 get_lit other_pat                        = Nothing
428
429 mb_neg :: Num a => Maybe b -> a -> a
430 mb_neg Nothing  v = v
431 mb_neg (Just _) v = -v
432
433 get_unused_cons :: [Pat Id] -> [DataCon]
434 get_unused_cons used_cons = ASSERT( not (null used_cons) ) unused_cons
435      where
436        (ConPatOut { pat_con = l_con, pat_ty = ty }) = head used_cons
437        ty_con          = dataConTyCon (unLoc l_con)     -- Newtype observable
438        all_cons        = tyConDataCons ty_con
439        used_cons_as_id = map (\ (ConPatOut{ pat_con = L _ d}) -> d) used_cons
440        unused_cons     = uniqSetToList
441                          (mkUniqSet all_cons `minusUniqSet` mkUniqSet used_cons_as_id) 
442
443 all_vars :: [Pat Id] -> Bool
444 all_vars []             = True
445 all_vars (WildPat _:ps) = all_vars ps
446 all_vars _              = False
447
448 remove_var :: (EqnNo, EquationInfo) -> (EqnNo, EquationInfo)
449 remove_var (n, eqn@(EqnInfo { eqn_pats = WildPat _ : ps})) = (n, eqn { eqn_pats = ps })
450 remove_var _  = panic "Check.remove_var: equation does not begin with a variable"
451
452 -----------------------
453 eqnPats :: (EqnNo, EquationInfo) -> [Pat Id]
454 eqnPats (_, eqn) = eqn_pats eqn
455
456 okGroup :: [(EqnNo, EquationInfo)] -> Bool
457 -- True if all equations have at least one pattern, and
458 -- all have the same number of patterns
459 okGroup [] = True
460 okGroup (e:es) = n_pats > 0 && and [length (eqnPats e) == n_pats | e <- es]
461                where
462                  n_pats = length (eqnPats e)
463
464 -- Half-baked print
465 pprGroup es = vcat (map pprEqnInfo es)
466 pprEqnInfo e = ppr (eqnPats e)
467
468
469 firstPatN :: (EqnNo, EquationInfo) -> Pat Id
470 firstPatN (_, eqn) = firstPat eqn
471
472 is_con :: Pat Id -> Bool
473 is_con (ConPatOut {}) = True
474 is_con _              = False
475
476 is_lit :: Pat Id -> Bool
477 is_lit (LitPat _)      = True
478 is_lit (NPat _ _ _ _)  = True
479 is_lit _               = False
480
481 is_var :: Pat Id -> Bool
482 is_var (WildPat _) = True
483 is_var _           = False
484
485 is_var_con :: DataCon -> Pat Id -> Bool
486 is_var_con con (WildPat _)                                 = True
487 is_var_con con (ConPatOut{ pat_con = L _ id }) | id == con = True
488 is_var_con con _                                           = False
489
490 is_var_lit :: HsLit -> Pat Id -> Bool
491 is_var_lit lit (WildPat _)   = True
492 is_var_lit lit pat 
493   | Just lit' <- get_lit pat = lit == lit'
494   | otherwise                = False
495 \end{code}
496
497 The difference beteewn @make_con@ and @make_whole_con@ is that
498 @make_wole_con@ creates a new constructor with all their arguments, and
499 @make_con@ takes a list of argumntes, creates the contructor getting their
500 arguments from the list. See where \fbox{\ ???\ } are used for details.
501
502 We need to reconstruct the patterns (make the constructors infix and
503 similar) at the same time that we create the constructors.
504
505 You can tell tuple constructors using
506 \begin{verbatim}
507         Id.isTupleCon
508 \end{verbatim}
509 You can see if one constructor is infix with this clearer code :-))))))))))
510 \begin{verbatim}
511         Lex.isLexConSym (Name.occNameString (Name.getOccName con))
512 \end{verbatim}
513
514        Rather clumsy but it works. (Simon Peyton Jones)
515
516
517 We don't mind the @nilDataCon@ because it doesn't change the way to
518 print the messsage, we are searching only for things like: @[1,2,3]@,
519 not @x:xs@ ....
520
521 In @reconstruct_pat@ we want to ``undo'' the work
522 that we have done in @simplify_pat@.
523 In particular:
524 \begin{tabular}{lll}
525         @((,) x y)@   & returns to be & @(x, y)@
526 \\      @((:) x xs)@  & returns to be & @(x:xs)@
527 \\      @(x:(...:[])@ & returns to be & @[x,...]@
528 \end{tabular}
529 %
530 The difficult case is the third one becouse we need to follow all the
531 contructors until the @[]@ to know that we need to use the second case,
532 not the second. \fbox{\ ???\ }
533 %
534 \begin{code}
535 isInfixCon con = isDataSymOcc (getOccName con)
536
537 is_nil (ConPatIn con (PrefixCon [])) = unLoc con == getName nilDataCon
538 is_nil _                             = False
539
540 is_list (ListPat _ _) = True
541 is_list _             = False
542
543 return_list id q = id == consDataCon && (is_nil q || is_list q) 
544
545 make_list p q | is_nil q    = ListPat [p] placeHolderType
546 make_list p (ListPat ps ty) = ListPat (p:ps) ty
547 make_list _ _               = panic "Check.make_list: Invalid argument"
548
549 make_con :: Pat Id -> ExhaustivePat -> ExhaustivePat           
550 make_con (ConPatOut{ pat_con = L _ id }) (lp:lq:ps, constraints) 
551      | return_list id q = (noLoc (make_list lp q) : ps, constraints)
552      | isInfixCon id    = (nlInfixConPat (getName id) lp lq : ps, constraints) 
553    where q  = unLoc lq  
554
555 make_con (ConPatOut{ pat_con = L _ id, pat_args = PrefixCon pats, pat_ty = ty }) (ps, constraints) 
556       | isTupleTyCon tc  = (noLoc (TuplePat pats_con (tupleTyConBoxity tc) ty) : rest_pats, constraints) 
557       | isPArrFakeCon id = (noLoc (PArrPat pats_con placeHolderType)           : rest_pats, constraints) 
558       | otherwise        = (nlConPat name pats_con      : rest_pats, constraints)
559     where 
560         name                  = getName id
561         (pats_con, rest_pats) = splitAtList pats ps
562         tc                    = dataConTyCon id
563
564 -- reconstruct parallel array pattern
565 --
566 --  * don't check for the type only; we need to make sure that we are really
567 --   dealing with one of the fake constructors and not with the real
568 --   representation 
569
570 make_whole_con :: DataCon -> WarningPat
571 make_whole_con con | isInfixCon con = nlInfixConPat name nlWildPat nlWildPat
572                    | otherwise      = nlConPat name pats
573                 where 
574                   name   = getName con
575                   pats   = [nlWildPat | t <- dataConOrigArgTys con]
576 \end{code}
577
578 This equation makes the same thing as @tidy@ in @Match.lhs@, the
579 difference is that here we can do all the tidy in one place and in the
580 @Match@ tidy it must be done one column each time due to bookkeeping 
581 constraints.
582
583 \begin{code}
584
585 simplify_eqn :: EquationInfo -> EquationInfo
586 simplify_eqn eqn = eqn { eqn_pats = map simplify_pat (eqn_pats eqn), 
587                          eqn_rhs  = simplify_rhs (eqn_rhs eqn) }
588   where
589         -- Horrible hack.  The simplify_pat stuff converts NPlusK pats to WildPats
590         -- which of course loses the info that they can fail to match.  So we 
591         -- stick in a CanFail as if it were a guard.
592         -- The Right Thing to do is for the whole system to treat NPlusK pats properly
593     simplify_rhs (MatchResult can_fail body)
594         | any has_nplusk_pat (eqn_pats eqn) = MatchResult CanFail body
595         | otherwise                         = MatchResult can_fail body
596
597 has_nplusk_lpat :: LPat Id -> Bool
598 has_nplusk_lpat (L _ p) = has_nplusk_pat p
599
600 has_nplusk_pat :: Pat Id -> Bool
601 has_nplusk_pat (NPlusKPat _ _ _ _)           = True
602 has_nplusk_pat (ParPat p)                    = has_nplusk_lpat p
603 has_nplusk_pat (AsPat _ p)                   = has_nplusk_lpat p
604 has_nplusk_pat (SigPatOut p _ )              = has_nplusk_lpat p
605 has_nplusk_pat (ListPat ps _)                = any has_nplusk_lpat ps
606 has_nplusk_pat (TuplePat ps _ _)             = any has_nplusk_lpat ps
607 has_nplusk_pat (PArrPat ps _)                = any has_nplusk_lpat ps
608 has_nplusk_pat (LazyPat p)                   = False    -- Why?
609 has_nplusk_pat (BangPat p)                   = has_nplusk_lpat p        -- I think
610 has_nplusk_pat (ConPatOut { pat_args = ps }) = any has_nplusk_lpat (hsConArgs ps)
611 has_nplusk_pat p = False        -- VarPat, VarPatOut, WildPat, LitPat, NPat, TypePat
612
613 simplify_lpat :: LPat Id -> LPat Id  
614 simplify_lpat p = fmap simplify_pat p
615
616 simplify_pat :: Pat Id -> Pat Id
617 simplify_pat pat@(WildPat gt) = pat
618 simplify_pat (VarPat id)      = WildPat (idType id) 
619 simplify_pat (VarPatOut id _) = WildPat (idType id)     -- Ignore the bindings
620 simplify_pat (ParPat p)       = unLoc (simplify_lpat p)
621 simplify_pat (LazyPat p)      = WildPat (hsLPatType p)  -- For overlap and exhaustiveness checking
622                                                         -- purposes, a ~pat is like a wildcard
623 simplify_pat (BangPat p)      = unLoc (simplify_lpat p)
624 simplify_pat (AsPat id p)     = unLoc (simplify_lpat p)
625 simplify_pat (SigPatOut p _)  = unLoc (simplify_lpat p) -- I'm not sure this is right
626
627 simplify_pat pat@(ConPatOut { pat_con = L loc id, pat_args = ps })
628   = pat { pat_args = simplify_con id ps }
629
630 simplify_pat (ListPat ps ty) = 
631   unLoc $ foldr (\ x y -> mkPrefixConPat consDataCon [x,y] list_ty)
632                                   (mkNilPat list_ty)
633                                   (map simplify_lpat ps)
634          where list_ty = mkListTy ty
635
636 -- introduce fake parallel array constructors to be able to handle parallel
637 -- arrays with the existing machinery for constructor pattern
638 --
639 simplify_pat (PArrPat ps ty)
640   = unLoc $ mkPrefixConPat (parrFakeCon (length ps))
641                            (map simplify_lpat ps) 
642                            (mkPArrTy ty)
643
644 simplify_pat (TuplePat ps boxity ty)
645   = unLoc $ mkPrefixConPat (tupleCon boxity arity)
646                            (map simplify_lpat ps) ty
647   where
648     arity = length ps
649
650 -- unpack string patterns fully, so we can see when they overlap with
651 -- each other, or even explicit lists of Chars.
652 simplify_pat pat@(LitPat (HsString s)) = 
653    unLoc $ foldr (\c pat -> mkPrefixConPat consDataCon [mk_char_lit c, pat] stringTy)
654                  (mkPrefixConPat nilDataCon [] stringTy) (unpackFS s)
655   where
656     mk_char_lit c = mkPrefixConPat charDataCon [nlLitPat (HsCharPrim c)] charTy
657
658 simplify_pat (LitPat lit)                = tidyLitPat lit 
659 simplify_pat (NPat lit mb_neg eq lit_ty) = tidyNPat lit mb_neg eq lit_ty
660
661 simplify_pat (NPlusKPat id hslit hsexpr1 hsexpr2)
662    = WildPat (idType (unLoc id))
663
664 simplify_pat (CoPat co pat ty) = simplify_pat pat 
665
666 -----------------
667 simplify_con con (PrefixCon ps)   = PrefixCon (map simplify_lpat ps)
668 simplify_con con (InfixCon p1 p2) = PrefixCon [simplify_lpat p1, simplify_lpat p2]
669 simplify_con con (RecCon fs)      
670   | null fs   = PrefixCon [nlWildPat | t <- dataConOrigArgTys con]
671                 -- Special case for null patterns; maybe not a record at all
672   | otherwise = PrefixCon (map (simplify_lpat.snd) all_pats)
673   where
674      -- pad out all the missing fields with WildPats.
675     field_pats = map (\ f -> (f, nlWildPat)) (dataConFieldLabels con)
676     all_pats = foldr (\(HsRecField id p _) acc -> insertNm (getName (unLoc id)) p acc)
677                      field_pats fs
678        
679     insertNm nm p [] = [(nm,p)]
680     insertNm nm p (x@(n,_):xs)
681       | nm == n    = (nm,p):xs
682       | otherwise  = x : insertNm nm p xs
683 \end{code}