X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=compiler%2FcoreSyn%2FPprExternalCore.lhs;h=dd75b62629d29410f940f606931465167e469fa2;hp=680814418294bab6d0556887c4b3a2c56b342f2a;hb=0a9b1362c9103c17a9f662287fd65c8779bcf4ef;hpb=7434f457d2280cef5da0e641ab7290e510681b7d diff --git a/compiler/coreSyn/PprExternalCore.lhs b/compiler/coreSyn/PprExternalCore.lhs index 6808144..dd75b62 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,11 +54,20 @@ 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 - where repclause = case rep of - Just ty -> char '=' <+> pty ty - Nothing -> empty +ptdef (Newtype tcon tbinds (coercion,k) rep) = +-- Here we take apart the newtype tycon in order to get the newtype coercion, +-- which needs to be represented in the External Core file because it's not +-- straightforward to derive its definition from the newtype declaration alone. +-- At the same time, we need the newtype decl to declare the tycon itself. +-- Sigh. + text "%newtype" <+> pqname tcon <+> (hsep (map ptbind tbinds)) + <+> axiomclause <+> repclause + where axiomclause = char '^' <+> parens (pqname coercion <+> text "::" + <+> pkind k) + repclause = case rep of + Just ty -> char '=' <+> pty ty + Nothing -> empty + pcdef :: Cdef -> Doc pcdef (Constr dcon tbinds tys) = @@ -69,7 +80,10 @@ pname id = text (zEncodeString id) pqname :: Qual Id -> Doc pqname ("",id) = pname id -pqname (m,id) = text m <> char '.' <> pname id +-- We print out a special character before a qualified name so as to +-- disambiguate unqualified names like "m" from qualified names like +-- "m:Foo.Bar.y". This makes the ext-core parser easier. +pqname (m,id) = char '^' <> text m <> char '.' <> pname id ptbind, pattbind :: Tbind -> Doc ptbind (t,Klifted) = pname t @@ -84,7 +98,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 @@ -113,13 +128,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 '=', +-- note: at one point every vdef was getting printed out as "local". +-- I think that's manifestly wrong. Right now, the "%local" keyword +-- is never used. +pvdef (_l,v,t,e) = sep [pname 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 @@ -176,7 +190,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)