X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=utils%2Fext-core%2FPrinter.hs;h=b3aa71e7a704a5949e843ab27a95489b91d4903c;hb=0cef3aef2b443ae02742d5543a403df66037c30f;hp=8ff4ba5ad2de3e05bbd33110c54e3a5e13c8ed7f;hpb=276585028d51a2516a31b91a91a1f4bba5c9f8ba;p=ghc-hetmet.git diff --git a/utils/ext-core/Printer.hs b/utils/ext-core/Printer.hs index 8ff4ba5..b3aa71e 100644 --- a/utils/ext-core/Printer.hs +++ b/utils/ext-core/Printer.hs @@ -5,6 +5,7 @@ import Numeric (fromRat) import Char import Core +import Encoding instance Show Module where showsPrec d m = shows (pmodule m) @@ -36,6 +37,8 @@ instance Show Kind where instance Show Lit where showsPrec d l = shows (plit l) +instance Show CoreLit where + showsPrec d l = shows (pclit l) indent = nest 2 @@ -45,30 +48,53 @@ pmodule (Module mname tdefs vdefgs) = (text "%module" <+> panmname mname) $$ indent ((vcat (map ((<> char ';') . ptdef) tdefs)) $$ (vcat (map ((<> char ';') . pvdefg) vdefgs))) + <> (if ((not.null) tdefs) || ((not.null) vdefgs) then char '\n' else empty) + -- add final newline; sigh. ptdef (Data qtcon tbinds cdefs) = (text "%data" <+> pqname qtcon <+> (hsep (map ptbind tbinds)) <+> char '=') $$ indent (braces ((vcat (punctuate (char ';') (map pcdef cdefs))))) -ptdef (Newtype qtcon tbinds tyopt ) = - text "%newtype" <+> pqname qtcon <+> (hsep (map ptbind tbinds)) <+> - (case tyopt of - Just ty -> char '=' <+> pty ty - Nothing -> empty) +ptdef (Newtype qtcon tbinds (coercion,k) tyopt) = + text "%newtype" <+> pqname qtcon <+> (hsep (map ptbind tbinds)) + $$ indent (axiomclause $$ repclause) + where axiomclause = char '^' <+> parens (pqname coercion <+> text "::" + <+> pkind k) + repclause = case tyopt of + Just ty -> char '=' <+> pty ty + Nothing -> empty pcdef (Constr qdcon tbinds tys) = (pqname qdcon) <+> (sep [hsep (map pattbind tbinds),sep (map paty tys)]) pname id = text id -pqname (m,id) = pmname m <> char '.' <> pname id +pqname (m,id) = pmname m <> pname id +-- be sure to print the '.' here so we don't print out +-- ".foo" for unqualified foo... pmname Nothing = empty -pmname (Just m) = panmname m - -panmname (pkgName, parents, name) = pname pkgName <> char ':' - <> (sep (punctuate (char '.') (map pname parents))) - <> char '.' <> pname name +-- Notice that we print the "^" here; this is so that +-- "%module foo" doesn't get printed as "%module ^foo" +pmname (Just m) = char '^' <> panmname m <> char '.' + +panmname p@(pkgName, parents, name) = + let parentStrs = map pname parents in + pname pkgName <> char ':' <> + -- This is to be sure to not print out: + -- main:.Main for when there's a single module name + -- with no parents. + (case parentStrs of + [] -> empty + _ -> hcat (punctuate hierModuleSeparator + (map pname parents)) + <> hierModuleSeparator) + <> pname name + +-- note that this is not a '.' but a Z-encoded '.': +-- GHCziIOBase.IO, not GHC.IOBase.IO. +-- What a pain. +hierModuleSeparator = text (zEncodeString ".") ptbind (t,Klifted) = pname t ptbind (t,k) = parens (pname t <> text "::" <> pkind k) @@ -81,6 +107,7 @@ pakind (Kopen) = char '?' pakind k = parens (pkind k) pkind (Karrow k1 k2) = parens (pakind k1 <> text "->" <> pkind k2) +pkind (Keq t1 t2) = parens (parens (pty t1) <+> text ":=:" <+> parens (pty t2)) pkind k = pakind k paty (Tvar n) = pname n @@ -131,12 +158,13 @@ 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 t alts) = sep [text "%case" <+> pty t <+> paexp e, +pexp (Case e vb t alts) = sep [text "%case" <+> paty t <+> paexp e, text "%of" <+> pvbind vb] $$ (indent (braces (vcat (punctuate (char ';') (map palt alts))))) -pexp (Cast e t) = (text "%cast" <+> paty t) $$ pexp e +pexp (Cast e t) = (text "%cast" <+> parens (pexp e)) $$ paty t pexp (Note s e) = (text "%note" <+> pstring s) $$ pexp e -pexp (External n t) = (text "%extcall" <+> pstring n) $$ paty t +-- TODO: ccall shouldn't really be there +pexp (External n t) = (text "%external ccall" <+> pstring n) $$ paty t pexp e = pfexp e @@ -154,19 +182,28 @@ palt (Adefault e) = (text "%_ ->") $$ indent (pexp e) -plit (Lint i t) = parens (integer i <> text "::" <> pty t) -plit (Lrational r t) = parens (text (show (fromRat 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) +plit (Literal cl t) = parens (pclit cl <> text "::" <> pty t) + +pclit (Lint i) = integer i +-- makes sure to print it out as n % d +pclit (Lrational r) = text (show r) +pclit (Lchar c) = text ("\'" ++ escape [c] ++ "\'") +pclit (Lstring s) = pstring s pstring s = doubleQuotes(text (escape s)) +escape :: String -> String escape s = foldr f [] (map ord s) where - f cv rest | (cv < 0x20 || cv > 0x7e || cv == 0x22 || cv == 0x27 || cv == 0x5c) = + f cv rest + | cv > 0xFF = '\\':'x':hs ++ rest + | (cv < 0x20 || cv > 0x7e || cv == 0x22 || cv == 0x27 || cv == 0x5c) = '\\':'x':h1:h0:rest where (q1,r1) = quotRem cv 16 h1 = intToDigit q1 h0 = intToDigit r1 + hs = dropWhile (=='0') $ reverse $ mkHex cv + mkHex 0 = "" + mkHex cv = intToDigit r : mkHex q + where (q,r) = quotRem cv 16 f cv rest = (chr cv):rest -