48c707b51f239b7720b24cbbe3440913161e983b
[ghc.git] / compiler / hsSyn / HsPat.lhs
1 %
2 % (c) The University of Glasgow 2006
3 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
4 %
5 \section[PatSyntax]{Abstract Haskell syntax---patterns}
6
7 \begin{code}
8 {-# LANGUAGE DeriveDataTypeable #-}
9 {-# LANGUAGE DeriveDataTypeable #-}
10 {-# LANGUAGE StandaloneDeriving #-}
11 {-# LANGUAGE FlexibleContexts #-}
12 {-# LANGUAGE UndecidableInstances #-} -- Note [Pass sensitive types]
13                                       -- in module PlaceHolder
14 {-# LANGUAGE ConstraintKinds #-}
15
16 module HsPat (
17         Pat(..), InPat, OutPat, LPat,
18
19         HsConDetails(..),
20         HsConPatDetails, hsConPatArgs,
21         HsRecFields(..), HsRecField(..), LHsRecField, hsRecFields,
22
23         mkPrefixConPat, mkCharLitPat, mkNilPat,
24
25         isStrictHsBind, looksLazyPatBind,
26         isStrictLPat, hsPatNeedsParens,
27         isIrrefutableHsPat,
28
29         pprParendLPat, pprConArgs
30     ) where
31
32 import {-# SOURCE #-} HsExpr            (SyntaxExpr, LHsExpr, HsSplice, pprLExpr, pprUntypedSplice)
33
34 -- friends:
35 import HsBinds
36 import HsLit
37 import PlaceHolder ( PostTc,DataId )
38 import HsTypes
39 import TcEvidence
40 import BasicTypes
41 -- others:
42 import PprCore          ( {- instance OutputableBndr TyVar -} )
43 import TysWiredIn
44 import Var
45 import ConLike
46 import DataCon
47 import TyCon
48 import Outputable
49 import Type
50 import SrcLoc
51 import FastString
52 -- libraries:
53 import Data.Data hiding (TyCon,Fixity)
54 import Data.Maybe
55 \end{code}
56
57
58 \begin{code}
59 type InPat id  = LPat id        -- No 'Out' constructors
60 type OutPat id = LPat id        -- No 'In' constructors
61
62 type LPat id = Located (Pat id)
63
64 -- | - 'ApiAnnotation.AnnKeywordId' : 'ApiAnnotation.AnnBang'
65 data Pat id
66   =     ------------ Simple patterns ---------------
67     WildPat     (PostTc id Type)        -- Wild card
68         -- The sole reason for a type on a WildPat is to
69         -- support hsPatType :: Pat Id -> Type
70
71   | VarPat      id                      -- Variable
72   | LazyPat     (LPat id)               -- Lazy pattern
73   | AsPat       (Located id) (LPat id)  -- As pattern
74   | ParPat      (LPat id)               -- Parenthesised pattern
75                                         -- See Note [Parens in HsSyn] in HsExpr
76   | BangPat     (LPat id)               -- Bang pattern
77
78         ------------ Lists, tuples, arrays ---------------
79   | ListPat     [LPat id]                            -- Syntactic list
80                 (PostTc id Type)                     -- The type of the elements
81                 (Maybe (PostTc id Type, SyntaxExpr id)) -- For rebindable syntax
82                    -- For OverloadedLists a Just (ty,fn) gives
83                    -- overall type of the pattern, and the toList
84                    -- function to convert the scrutinee to a list value
85
86   | TuplePat    [LPat id]        -- Tuple sub-patterns
87                 Boxity           -- UnitPat is TuplePat []
88                 [PostTc id Type] -- [] before typechecker, filled in afterwards
89                                  -- with the types of the tuple components
90         -- You might think that the PostTc id Type was redundant, because we can
91         -- get the pattern type by getting the types of the sub-patterns.
92         -- But it's essential
93         --      data T a where
94         --        T1 :: Int -> T Int
95         --      f :: (T a, a) -> Int
96         --      f (T1 x, z) = z
97         -- When desugaring, we must generate
98         --      f = /\a. \v::a.  case v of (t::T a, w::a) ->
99         --                       case t of (T1 (x::Int)) ->
100         -- Note the (w::a), NOT (w::Int), because we have not yet
101         -- refined 'a' to Int.  So we must know that the second component
102         -- of the tuple is of type 'a' not Int.  See selectMatchVar
103         -- (June 14: I'm not sure this comment is right; the sub-patterns
104         --           will be wrapped in CoPats, no?)
105
106   | PArrPat     [LPat id]               -- Syntactic parallel array
107                 (PostTc id Type)        -- The type of the elements
108
109         ------------ Constructor patterns ---------------
110   | ConPatIn    (Located id)
111                 (HsConPatDetails id)
112
113   | ConPatOut {
114         pat_con     :: Located ConLike,
115         pat_arg_tys :: [Type],          -- The univeral arg types, 1-1 with the universal
116                                         -- tyvars of the constructor/pattern synonym
117                                         --   Use (conLikeResTy pat_con pat_arg_tys) to get 
118                                         --   the type of the pattern
119
120         pat_tvs   :: [TyVar],           -- Existentially bound type variables (tyvars only)
121         pat_dicts :: [EvVar],           -- Ditto *coercion variables* and *dictionaries*
122                                         -- One reason for putting coercion variable here, I think,
123                                         --      is to ensure their kinds are zonked
124         pat_binds :: TcEvBinds,         -- Bindings involving those dictionaries
125         pat_args  :: HsConPatDetails id,
126         pat_wrap  :: HsWrapper          -- Extra wrapper to pass to the matcher
127     }
128
129         ------------ View patterns ---------------
130   | ViewPat       (LHsExpr id)
131                   (LPat id)
132                   (PostTc id Type)  -- The overall type of the pattern
133                                     -- (= the argument type of the view function)
134                                     -- for hsPatType.
135
136         ------------ Pattern splices ---------------
137   | SplicePat       (HsSplice id)
138
139         ------------ Quasiquoted patterns ---------------
140         -- See Note [Quasi-quote overview] in TcSplice
141   | QuasiQuotePat   (HsQuasiQuote id)
142
143         ------------ Literal and n+k patterns ---------------
144   | LitPat          HsLit               -- Used for *non-overloaded* literal patterns:
145                                         -- Int#, Char#, Int, Char, String, etc.
146
147   | NPat                -- Used for all overloaded literals,
148                         -- including overloaded strings with -XOverloadedStrings
149                     (HsOverLit id)              -- ALWAYS positive
150                     (Maybe (SyntaxExpr id))     -- Just (Name of 'negate') for negative
151                                                 -- patterns, Nothing otherwise
152                     (SyntaxExpr id)             -- Equality checker, of type t->t->Bool
153
154   | NPlusKPat       (Located id)        -- n+k pattern
155                     (HsOverLit id)      -- It'll always be an HsIntegral
156                     (SyntaxExpr id)     -- (>=) function, of type t->t->Bool
157                     (SyntaxExpr id)     -- Name of '-' (see RnEnv.lookupSyntaxName)
158
159         ------------ Pattern type signatures ---------------
160   | SigPatIn        (LPat id)                  -- Pattern with a type signature
161                     (HsWithBndrs id (LHsType id)) -- Signature can bind both
162                                                   -- kind and type vars
163
164   | SigPatOut       (LPat id)           -- Pattern with a type signature
165                     Type
166
167         ------------ Pattern coercions (translation only) ---------------
168   | CoPat       HsWrapper               -- If co :: t1 ~ t2, p :: t2,
169                                         -- then (CoPat co p) :: t1
170                 (Pat id)                -- Why not LPat?  Ans: existing locn will do
171                 Type                    -- Type of whole pattern, t1
172         -- During desugaring a (CoPat co pat) turns into a cast with 'co' on
173         -- the scrutinee, followed by a match on 'pat'
174   deriving (Typeable)
175 deriving instance (DataId id) => Data (Pat id)
176 \end{code}
177
178 HsConDetails is use for patterns/expressions *and* for data type declarations
179
180 \begin{code}
181 data HsConDetails arg rec
182   = PrefixCon [arg]             -- C p1 p2 p3
183   | RecCon    rec               -- C { x = p1, y = p2 }
184   | InfixCon  arg arg           -- p1 `C` p2
185   deriving (Data, Typeable)
186
187 type HsConPatDetails id = HsConDetails (LPat id) (HsRecFields id (LPat id))
188
189 hsConPatArgs :: HsConPatDetails id -> [LPat id]
190 hsConPatArgs (PrefixCon ps)   = ps
191 hsConPatArgs (RecCon fs)      = map (hsRecFieldArg . unLoc) (rec_flds fs)
192 hsConPatArgs (InfixCon p1 p2) = [p1,p2]
193 \end{code}
194
195 However HsRecFields is used only for patterns and expressions
196 (not data type declarations)
197
198 \begin{code}
199 data HsRecFields id arg         -- A bunch of record fields
200                                 --      { x = 3, y = True }
201         -- Used for both expressions and patterns
202   = HsRecFields { rec_flds   :: [LHsRecField id arg],
203                   rec_dotdot :: Maybe Int }  -- Note [DotDot fields]
204   deriving (Data, Typeable)
205
206 -- Note [DotDot fields]
207 -- ~~~~~~~~~~~~~~~~~~~~
208 -- The rec_dotdot field means this:
209 --   Nothing => the normal case
210 --   Just n  => the group uses ".." notation,
211 --
212 -- In the latter case:
213 --
214 --   *before* renamer: rec_flds are exactly the n user-written fields
215 --
216 --   *after* renamer:  rec_flds includes *all* fields, with
217 --                     the first 'n' being the user-written ones
218 --                     and the remainder being 'filled in' implicitly
219
220 type LHsRecField id arg = Located (HsRecField id arg)
221 -- |  - 'ApiAnnotation.AnnKeywordId' : 'ApiAnnotation.AnnEqual',
222 data HsRecField id arg = HsRecField {
223         hsRecFieldId  :: Located id,
224         hsRecFieldArg :: arg,           -- Filled in by renamer
225         hsRecPun      :: Bool           -- Note [Punning]
226   } deriving (Data, Typeable)
227
228 -- Note [Punning]
229 -- ~~~~~~~~~~~~~~
230 -- If you write T { x, y = v+1 }, the HsRecFields will be
231 --      HsRecField x x True ...
232 --      HsRecField y (v+1) False ...
233 -- That is, for "punned" field x is expanded (in the renamer)
234 -- to x=x; but with a punning flag so we can detect it later
235 -- (e.g. when pretty printing)
236 --
237 -- If the original field was qualified, we un-qualify it, thus
238 --    T { A.x } means T { A.x = x }
239
240 hsRecFields :: HsRecFields id arg -> [id]
241 hsRecFields rbinds = map (unLoc . hsRecFieldId . unLoc) (rec_flds rbinds)
242 \end{code}
243
244 %************************************************************************
245 %*                                                                      *
246 %*              Printing patterns
247 %*                                                                      *
248 %************************************************************************
249
250 \begin{code}
251 instance (OutputableBndr name) => Outputable (Pat name) where
252     ppr = pprPat
253
254 pprPatBndr :: OutputableBndr name => name -> SDoc
255 pprPatBndr var                  -- Print with type info if -dppr-debug is on
256   = getPprStyle $ \ sty ->
257     if debugStyle sty then
258         parens (pprBndr LambdaBind var)         -- Could pass the site to pprPat
259                                                 -- but is it worth it?
260     else
261         pprPrefixOcc var
262
263 pprParendLPat :: (OutputableBndr name) => LPat name -> SDoc
264 pprParendLPat (L _ p) = pprParendPat p
265
266 pprParendPat :: (OutputableBndr name) => Pat name -> SDoc
267 pprParendPat p | hsPatNeedsParens p = parens (pprPat p)
268                | otherwise          = pprPat p
269
270 pprPat :: (OutputableBndr name) => Pat name -> SDoc
271 pprPat (VarPat var)       = pprPatBndr var
272 pprPat (WildPat _)        = char '_'
273 pprPat (LazyPat pat)      = char '~' <> pprParendLPat pat
274 pprPat (BangPat pat)      = char '!' <> pprParendLPat pat
275 pprPat (AsPat name pat)   = hcat [pprPrefixOcc (unLoc name), char '@', pprParendLPat pat]
276 pprPat (ViewPat expr pat _) = hcat [pprLExpr expr, text " -> ", ppr pat]
277 pprPat (ParPat pat)         = parens (ppr pat)
278 pprPat (ListPat pats _ _)     = brackets (interpp'SP pats)
279 pprPat (PArrPat pats _)     = paBrackets (interpp'SP pats)
280 pprPat (TuplePat pats bx _) = tupleParens (boxityNormalTupleSort bx) (interpp'SP pats)
281
282 pprPat (ConPatIn con details) = pprUserCon (unLoc con) details
283 pprPat (ConPatOut { pat_con = con, pat_tvs = tvs, pat_dicts = dicts,
284                     pat_binds = binds, pat_args = details })
285   = getPprStyle $ \ sty ->      -- Tiresome; in TcBinds.tcRhs we print out a
286     if debugStyle sty then      -- typechecked Pat in an error message,
287                                 -- and we want to make sure it prints nicely
288         ppr con
289           <> braces (sep [ hsep (map pprPatBndr (tvs ++ dicts))
290                          , ppr binds])
291           <+> pprConArgs details
292     else pprUserCon (unLoc con) details
293
294 pprPat (LitPat s)           = ppr s
295 pprPat (NPat l Nothing  _)  = ppr l
296 pprPat (NPat l (Just _) _)  = char '-' <> ppr l
297 pprPat (NPlusKPat n k _ _)  = hcat [ppr n, char '+', ppr k]
298 pprPat (SplicePat splice)   = pprUntypedSplice splice
299 pprPat (QuasiQuotePat qq)   = ppr qq
300 pprPat (CoPat co pat _)     = pprHsWrapper (ppr pat) co
301 pprPat (SigPatIn pat ty)    = ppr pat <+> dcolon <+> ppr ty
302 pprPat (SigPatOut pat ty)   = ppr pat <+> dcolon <+> ppr ty
303
304 pprUserCon :: (OutputableBndr con, OutputableBndr id) => con -> HsConPatDetails id -> SDoc
305 pprUserCon c (InfixCon p1 p2) = ppr p1 <+> pprInfixOcc c <+> ppr p2
306 pprUserCon c details          = pprPrefixOcc c <+> pprConArgs details
307
308 pprConArgs ::  OutputableBndr id => HsConPatDetails id -> SDoc
309 pprConArgs (PrefixCon pats) = sep (map pprParendLPat pats)
310 pprConArgs (InfixCon p1 p2) = sep [pprParendLPat p1, pprParendLPat p2]
311 pprConArgs (RecCon rpats)   = ppr rpats
312
313 instance (OutputableBndr id, Outputable arg)
314       => Outputable (HsRecFields id arg) where
315   ppr (HsRecFields { rec_flds = flds, rec_dotdot = Nothing })
316         = braces (fsep (punctuate comma (map ppr flds)))
317   ppr (HsRecFields { rec_flds = flds, rec_dotdot = Just n })
318         = braces (fsep (punctuate comma (map ppr (take n flds) ++ [dotdot])))
319         where
320           dotdot = ptext (sLit "..") <+> ifPprDebug (ppr (drop n flds))
321
322 instance (OutputableBndr id, Outputable arg)
323       => Outputable (HsRecField id arg) where
324   ppr (HsRecField { hsRecFieldId = f, hsRecFieldArg = arg,
325                     hsRecPun = pun })
326     = ppr f <+> (ppUnless pun $ equals <+> ppr arg)
327 \end{code}
328
329
330 %************************************************************************
331 %*                                                                      *
332 %*              Building patterns
333 %*                                                                      *
334 %************************************************************************
335
336 \begin{code}
337 mkPrefixConPat :: DataCon -> [OutPat id] -> [Type] -> OutPat id
338 -- Make a vanilla Prefix constructor pattern
339 mkPrefixConPat dc pats tys
340   = noLoc $ ConPatOut { pat_con = noLoc (RealDataCon dc), pat_tvs = [], pat_dicts = [],
341                         pat_binds = emptyTcEvBinds, pat_args = PrefixCon pats,
342                         pat_arg_tys = tys, pat_wrap = idHsWrapper }
343
344 mkNilPat :: Type -> OutPat id
345 mkNilPat ty = mkPrefixConPat nilDataCon [] [ty]
346
347 mkCharLitPat :: String -> Char -> OutPat id
348 mkCharLitPat src c = mkPrefixConPat charDataCon
349                                     [noLoc $ LitPat (HsCharPrim src c)] []
350 \end{code}
351
352
353 %************************************************************************
354 %*                                                                      *
355 %* Predicates for checking things about pattern-lists in EquationInfo   *
356 %*                                                                      *
357 %************************************************************************
358
359 \subsection[Pat-list-predicates]{Look for interesting things in patterns}
360
361 Unlike in the Wadler chapter, where patterns are either ``variables''
362 or ``constructors,'' here we distinguish between:
363 \begin{description}
364 \item[unfailable:]
365 Patterns that cannot fail to match: variables, wildcards, and lazy
366 patterns.
367
368 These are the irrefutable patterns; the two other categories
369 are refutable patterns.
370
371 \item[constructor:]
372 A non-literal constructor pattern (see next category).
373
374 \item[literal patterns:]
375 At least the numeric ones may be overloaded.
376 \end{description}
377
378 A pattern is in {\em exactly one} of the above three categories; `as'
379 patterns are treated specially, of course.
380
381 The 1.3 report defines what ``irrefutable'' and ``failure-free'' patterns are.
382 \begin{code}
383 isStrictLPat :: LPat id -> Bool
384 isStrictLPat (L _ (ParPat p))             = isStrictLPat p
385 isStrictLPat (L _ (BangPat {}))           = True
386 isStrictLPat (L _ (TuplePat _ Unboxed _)) = True
387 isStrictLPat _                            = False
388
389 isStrictHsBind :: HsBind id -> Bool
390 -- A pattern binding with an outermost bang or unboxed tuple must be matched strictly
391 -- Defined in this module because HsPat is above HsBinds in the import graph
392 isStrictHsBind (PatBind { pat_lhs = p }) = isStrictLPat p
393 isStrictHsBind _                         = False
394
395 looksLazyPatBind :: HsBind id -> Bool
396 -- Returns True of anything *except*
397 --     a StrictHsBind (as above) or 
398 --     a VarPat
399 -- In particular, returns True of a pattern binding with a compound pattern, like (I# x)
400 looksLazyPatBind (PatBind { pat_lhs = p }) = looksLazyLPat p
401 looksLazyPatBind _                         = False
402
403 looksLazyLPat :: LPat id -> Bool
404 looksLazyLPat (L _ (ParPat p))             = looksLazyLPat p
405 looksLazyLPat (L _ (AsPat _ p))            = looksLazyLPat p
406 looksLazyLPat (L _ (BangPat {}))           = False
407 looksLazyLPat (L _ (TuplePat _ Unboxed _)) = False
408 looksLazyLPat (L _ (VarPat {}))            = False
409 looksLazyLPat (L _ (WildPat {}))           = False
410 looksLazyLPat _                            = True
411
412 isIrrefutableHsPat :: OutputableBndr id => LPat id -> Bool
413 -- (isIrrefutableHsPat p) is true if matching against p cannot fail,
414 -- in the sense of falling through to the next pattern.
415 --      (NB: this is not quite the same as the (silly) defn
416 --      in 3.17.2 of the Haskell 98 report.)
417 --
418 -- isIrrefutableHsPat returns False if it's in doubt; specifically
419 -- on a ConPatIn it doesn't know the size of the constructor family
420 -- But if it returns True, the pattern is definitely irrefutable
421 isIrrefutableHsPat pat
422   = go pat
423   where
424     go (L _ pat) = go1 pat
425
426     go1 (WildPat {})        = True
427     go1 (VarPat {})         = True
428     go1 (LazyPat {})        = True
429     go1 (BangPat pat)       = go pat
430     go1 (CoPat _ pat _)     = go1 pat
431     go1 (ParPat pat)        = go pat
432     go1 (AsPat _ pat)       = go pat
433     go1 (ViewPat _ pat _)   = go pat
434     go1 (SigPatIn pat _)    = go pat
435     go1 (SigPatOut pat _)   = go pat
436     go1 (TuplePat pats _ _) = all go pats
437     go1 (ListPat {}) = False
438     go1 (PArrPat {})        = False     -- ?
439
440     go1 (ConPatIn {})       = False     -- Conservative
441     go1 (ConPatOut{ pat_con = L _ (RealDataCon con), pat_args = details })
442         =  isJust (tyConSingleDataCon_maybe (dataConTyCon con))
443            -- NB: tyConSingleDataCon_maybe, *not* isProductTyCon, because
444            -- the latter is false of existentials. See Trac #4439
445         && all go (hsConPatArgs details)
446     go1 (ConPatOut{ pat_con = L _ (PatSynCon _pat) })
447         = False -- Conservative
448
449     go1 (LitPat {})    = False
450     go1 (NPat {})      = False
451     go1 (NPlusKPat {}) = False
452
453     -- Both should be gotten rid of by renamer before
454     -- isIrrefutablePat is called
455     go1 (SplicePat {})     = urk pat    
456     go1 (QuasiQuotePat {}) = urk pat
457
458     urk pat = pprPanic "isIrrefutableHsPat:" (ppr pat)
459
460 hsPatNeedsParens :: Pat a -> Bool
461 hsPatNeedsParens (NPlusKPat {})      = True
462 hsPatNeedsParens (SplicePat {})      = False
463 hsPatNeedsParens (QuasiQuotePat {})  = True
464 hsPatNeedsParens (ConPatIn _ ds)     = conPatNeedsParens ds
465 hsPatNeedsParens p@(ConPatOut {})    = conPatNeedsParens (pat_args p)
466 hsPatNeedsParens (SigPatIn {})       = True
467 hsPatNeedsParens (SigPatOut {})      = True
468 hsPatNeedsParens (ViewPat {})        = True
469 hsPatNeedsParens (CoPat {})          = True
470 hsPatNeedsParens (WildPat {})        = False
471 hsPatNeedsParens (VarPat {})         = False
472 hsPatNeedsParens (LazyPat {})        = False
473 hsPatNeedsParens (BangPat {})        = False
474 hsPatNeedsParens (ParPat {})         = False
475 hsPatNeedsParens (AsPat {})          = False
476 hsPatNeedsParens (TuplePat {})       = False
477 hsPatNeedsParens (ListPat {})        = False
478 hsPatNeedsParens (PArrPat {})        = False
479 hsPatNeedsParens (LitPat {})         = False
480 hsPatNeedsParens (NPat {})           = False
481
482 conPatNeedsParens :: HsConDetails a b -> Bool
483 conPatNeedsParens (PrefixCon args) = not (null args)
484 conPatNeedsParens (InfixCon {})    = True
485 conPatNeedsParens (RecCon {})      = True
486 \end{code}