[project @ 2000-03-15 11:15:19 by simonmar]
[ghc-hetmet.git] / ghc / compiler / deSugar / Match.lhs
index c71eb5c..fcc65af 100644 (file)
@@ -28,7 +28,7 @@ import MatchCon               ( matchConFamily )
 import MatchLit                ( matchLiterals )
 import PrelInfo                ( pAT_ERROR_ID )
 import Type            ( isUnLiftedType, splitAlgTyConApp,
-                         Type
+                         mkTyVarTys, Type
                        )
 import TysPrim         ( intPrimTy, charPrimTy, floatPrimTy, doublePrimTy,
                          addrPrimTy, wordPrimTy
@@ -78,8 +78,8 @@ matchExport vars qs@((EqnInfo _ ctx _ (MatchResult _ _)) : _)
        eqns_shadow   = map (\n -> qs!!(n - 1)) unused_eqns
 \end{code}
 
-This variable shows the maximun number of lines of output generated for warnings.
-It will limit the number of patterns/equations displayed to maximum_output.
+This variable shows the maximum number of lines of output generated for warnings.
+It will limit the number of patterns/equations displayed to@ maximum_output@.
 
 (ToDo: add command-line option?)
 
@@ -87,7 +87,7 @@ It will limit the number of patterns/equations displayed to maximum_output.
 maximum_output = 4
 \end{code}
 
-The next two functions creates the warning message.
+The next two functions create the warning message.
 
 \begin{code}
 dsShadowWarn :: DsMatchContext -> [EquationInfo] -> DsM ()
@@ -457,14 +457,21 @@ tidy1 v (LazyPat pat) match_result
 
 -- re-express <con-something> as (ConPat ...) [directly]
 
-tidy1 v (RecPat data_con pat_ty tvs dicts rpats) match_result
-  = returnDs (ConPat data_con pat_ty tvs dicts pats, match_result)
+tidy1 v (RecPat data_con pat_ty ex_tvs dicts rpats) match_result
+  | null rpats
+  =    -- Special case for C {}, which can be used for 
+       -- a constructor that isn't declared to have
+       -- fields at all
+    returnDs (ConPat data_con pat_ty ex_tvs dicts (map WildPat con_arg_tys'), match_result)
+
+  | otherwise
+  = returnDs (ConPat data_con pat_ty ex_tvs dicts pats, match_result)
   where
     pats            = map mk_pat tagged_arg_tys
 
        -- Boring stuff to find the arg-tys of the constructor
     (_, inst_tys, _) = splitAlgTyConApp pat_ty
-    con_arg_tys'     = dataConArgTys data_con inst_tys 
+    con_arg_tys'     = dataConArgTys data_con (inst_tys ++ mkTyVarTys ex_tvs)
     tagged_arg_tys   = con_arg_tys' `zip` (dataConFieldLabels data_con)
 
        -- mk_pat picks a WildPat of the appropriate type for absent fields,
@@ -518,56 +525,11 @@ tidy1 v (DictPat dicts methods) match_result
 -- LitPats: the desugarer only sees these at well-known types
 
 tidy1 v pat@(LitPat lit lit_ty) match_result
-  | isUnLiftedType lit_ty
-  = returnDs (pat, match_result)
-
-  | lit_ty == charTy
-  = returnDs (ConPat charDataCon charTy [] [] [LitPat (mk_char lit) charPrimTy],
-             match_result)
-
-  | otherwise = pprPanic "tidy1:LitPat:" (ppr pat)
-  where
-    mk_char (HsChar c)    = HsCharPrim c
+  = returnDs (tidyLitPat lit lit_ty pat, match_result)
 
 -- NPats: we *might* be able to replace these w/ a simpler form
-
-
 tidy1 v pat@(NPat lit lit_ty _) match_result
-  = returnDs (better_pat, match_result)
-  where
-    better_pat
-      | lit_ty == charTy   = ConPat charDataCon   lit_ty [] [] [LitPat (mk_char lit)   charPrimTy]
-      | lit_ty == intTy    = ConPat intDataCon    lit_ty [] [] [LitPat (mk_int lit)    intPrimTy]
-      | lit_ty == wordTy   = ConPat wordDataCon   lit_ty [] [] [LitPat (mk_word lit)   wordPrimTy]
-      | lit_ty == addrTy   = ConPat addrDataCon   lit_ty [] [] [LitPat (mk_addr lit)   addrPrimTy]
-      | lit_ty == floatTy  = ConPat floatDataCon  lit_ty [] [] [LitPat (mk_float lit)  floatPrimTy]
-      | lit_ty == doubleTy = ConPat doubleDataCon lit_ty [] [] [LitPat (mk_double lit) doublePrimTy]
-
-               -- Convert the literal pattern "" to the constructor pattern [].
-      | null_str_lit lit       = ConPat nilDataCon lit_ty [] [] [] 
-
-      | otherwise         = pat
-
-    mk_int    (HsInt i)      = HsIntPrim i
-    mk_int    l@(HsLitLit s) = l
-
-    mk_char   (HsChar c)     = HsCharPrim c
-    mk_char   l@(HsLitLit s) = l
-
-    mk_word   l@(HsLitLit s) = l
-
-    mk_addr   l@(HsLitLit s) = l
-
-    mk_float  (HsInt i)      = HsFloatPrim (fromInteger i)
-    mk_float  (HsFrac f)     = HsFloatPrim f
-    mk_float  l@(HsLitLit s) = l
-
-    mk_double (HsInt i)      = HsDoublePrim (fromInteger i)
-    mk_double (HsFrac f)     = HsDoublePrim f
-    mk_double l@(HsLitLit s) = l
-
-    null_str_lit (HsString s) = _NULL_ s
-    null_str_lit other_lit    = False
+  = returnDs (tidyLitPat lit lit_ty pat, match_result)
 
 -- and everything else goes through unchanged...
 
@@ -575,7 +537,8 @@ tidy1 v non_interesting_pat match_result
   = returnDs (non_interesting_pat, match_result)
 \end{code}
 
-PREVIOUS matchTwiddled STUFF:
+\noindent
+{\bf Previous @matchTwiddled@ stuff:}
 
 Now we get to the only interesting part; note: there are choices for
 translation [from Simon's notes]; translation~1:
@@ -734,23 +697,29 @@ matchWrapper :: DsMatchKind                       -- For shadowing warning messages
 
  There is one small problem with the Lambda Patterns, when somebody
  writes something similar to:
+\begin{verbatim}
     (\ (x:xs) -> ...)
+\end{verbatim}
  he/she don't want a warning about incomplete patterns, that is done with 
- the flag opt_WarnSimplePatterns.
- This problem also appears in the :
-   do patterns, but if the do can fail it creates another equation if the match can 
-                fail (see DsExpr.doDo function)
-   let patterns, are treated by matchSimply
-   List Comprension Patterns, are treated by matchSimply also
-
-We can't call matchSimply with Lambda patterns, due to lambda patterns can have more than
+ the flag @opt_WarnSimplePatterns@.
+ This problem also appears in the:
+\begin{itemize}
+\item @do@ patterns, but if the @do@ can fail
+      it creates another equation if the match can fail
+      (see @DsExpr.doDo@ function)
+\item @let@ patterns, are treated by @matchSimply@
+   List Comprension Patterns, are treated by @matchSimply@ also
+\end{itemize}
+
+We can't call @matchSimply@ with Lambda patterns,
+due to the fact that lambda patterns can have more than
 one pattern, and match simply only accepts one pattern.
 
 JJQC 30-Nov-1997
+
 \begin{code}
 matchWrapper kind matches error_string
-  = flattenMatches kind matches                                `thenDs` \ (result_ty, eqns_info) ->
+  = flattenMatches kind matches                        `thenDs` \ (result_ty, eqns_info) ->
     let
        EqnInfo _ _ arg_pats _ : _ = eqns_info
     in