X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=compiler%2FcoreSyn%2FPprExternalCore.lhs;h=c34f7b842a45140ab8df52fd97e657b0dfdfbc4c;hp=680814418294bab6d0556887c4b3a2c56b342f2a;hb=e4417dcd4679da9c6b18c02ff667199c572bed89;hpb=7434f457d2280cef5da0e641ab7290e510681b7d diff --git a/compiler/coreSyn/PprExternalCore.lhs b/compiler/coreSyn/PprExternalCore.lhs index 6808144..c34f7b8 100644 --- a/compiler/coreSyn/PprExternalCore.lhs +++ b/compiler/coreSyn/PprExternalCore.lhs @@ -5,11 +5,13 @@ \begin{code} module PprExternalCore () where -import Pretty import ExternalCore -import Char import Encoding +import Pretty +import Char + + instance Show Module where showsPrec _ m = shows (pmodule m) @@ -52,17 +54,19 @@ ptdef (Data tcon tbinds cdefs) = (text "%data" <+> pqname tcon <+> (hsep (map ptbind tbinds)) <+> char '=') $$ indent (braces ((vcat (punctuate (char ';') (map pcdef cdefs))))) -ptdef (Newtype tcon tbinds rep ) = - text "%newtype" <+> pqname tcon <+> (hsep (map ptbind tbinds)) <+> repclause +ptdef (Newtype tcon coercion tbinds rep) = + text "%newtype" <+> pqname tcon <+> pqname coercion + <+> (hsep (map ptbind tbinds)) $$ indent repclause where repclause = case rep of Just ty -> char '=' <+> pty ty Nothing -> empty + pcdef :: Cdef -> Doc pcdef (Constr dcon tbinds tys) = - (pname dcon) <+> (sep [hsep (map pattbind tbinds),sep (map paty tys)]) + (pqname dcon) <+> (sep [hsep (map pattbind tbinds),sep (map paty tys)]) pcdef (GadtConstr dcon ty) = - (pname dcon) <+> text "::" <+> pty ty + (pqname dcon) <+> text "::" <+> pty ty pname :: Id -> Doc pname id = text (zEncodeString id) @@ -84,7 +88,8 @@ pakind (Kopen) = char '?' pakind k = parens (pkind k) pkind (Karrow k1 k2) = parens (pakind k1 <> text "->" <> pkind k2) -pkind (Keq t1 t2) = parens (pty t1 <> text ":=:" <> pty t2) +pkind (Keq t1 t2) = parens (parens (pty t1) <+> text ":=:" <+> + parens (pty t2)) pkind k = pakind k paty, pbty, pty :: Ty -> Doc @@ -93,7 +98,7 @@ paty (Tcon c) = pqname c paty t = parens (pty t) pbty (Tapp(Tapp(Tcon tc) t1) t2) | tc == tcArrow = parens(fsep [pbty t1, text "->",pty t2]) -pbty (Tapp t1 t2) = pappty t1 [t2] +pbty (Tapp t1 t2) = parens $ pappty t1 [t2] pbty t = paty t pty (Tapp(Tapp(Tcon tc) t1) t2) | tc == tcArrow = fsep [pbty t1, text "->",pty t2] @@ -113,13 +118,12 @@ pvdefg (Rec vdefs) = text "%rec" $$ braces (indent (vcat (punctuate (char ';') ( pvdefg (Nonrec vdef) = pvdef vdef pvdef :: Vdef -> Doc -pvdef (l,v,t,e) = sep [plocal l <+> pname v <+> text "::" <+> pty t <+> char '=', +-- TODO: Think about whether %local annotations are actually needed. +-- Right now, the local flag is never used, because the Core doc doesn't +-- explain the meaning of %local. +pvdef (_l,v,t,e) = sep [(pqname v <+> text "::" <+> pty t <+> char '='), indent (pexp e)] -plocal :: Bool -> Doc -plocal True = text "%local" -plocal False = empty - paexp, pfexp, pexp :: Exp -> Doc paexp (Var x) = pqname x paexp (Dcon x) = pqname x @@ -148,7 +152,7 @@ pappexp e as = fsep (paexp e : map pa as) pexp (Lam b e) = char '\\' <+> plamexp [b] e pexp (Let vd e) = (text "%let" <+> pvdefg vd) $$ (text "%in" <+> pexp e) -pexp (Case e vb ty alts) = sep [text "%case" <+> parens (paty ty) <+> paexp e, +pexp (Case e vb ty alts) = sep [text "%case" <+> paty ty <+> paexp e, text "%of" <+> pvbind vb] $$ (indent (braces (vcat (punctuate (char ';') (map palt alts))))) pexp (Cast e co) = (text "%cast" <+> parens (pexp e)) $$ paty co @@ -176,7 +180,9 @@ palt (Adefault e) = plit :: Lit -> Doc plit (Lint i t) = parens (integer i <> text "::" <> pty t) -plit (Lrational r t) = parens (rational r <> text "::" <> pty t) -- might be better to print as two integers +-- we use (text (show r)) because "(rational r)" was printing out things +-- like "2.0e-2" (which isn't External Core) +plit (Lrational r t) = parens (text (show r) <> text "::" <> pty t) plit (Lchar c t) = parens (text ("\'" ++ escape [c] ++ "\'") <> text "::" <> pty t) plit (Lstring s t) = parens (pstring s <> text "::" <> pty t)