----------------------------------------------------------------------------- -- | -- Module : Windll -- Copyright : (c) Tamar Christina 2009 - 2010 -- License : BSD3 -- -- Maintainer : tamar@zhox.com -- Stability : experimental -- Portability : portable -- -- MShow instances for the CSharp datatypes -- ----------------------------------------------------------------------------- module WinDll.Structs.MShow.CSharp where import WinDll.Structs.MShow.MShow import WinDll.Structs.Folds.CSharp import WinDll.Structs.Folds.C import WinDll.Structs.CSharp import WinDll.Structs.C hiding (Normal) import WinDll.Structs.Structures import Data.Char import Data.List instance MShow CsInclude where mshow = foldInclude ((\a->"using "++a++";") ,(\a->"using WinDll."++a++";") ) . csUnpackInclude instance MShow CsDataEnum where mshow = foldDataEnum ((\a b->let fix = foldr1 (\a b->a++", "++b) . map (("c"++a)++) in "public enum List"++a++" {" ++ fix b ++ "};")) . csUnpackEnum instance MShow Attr where mshow = foldAttr (\p k v -> let pre = case p of Normal -> "" Param -> "param: " Return -> "return: " in pre ++ k ++ "(" ++ intercalate "," v ++ ")" ) instance MShow Argument where mshow = mshowM 1 mshowM 1 = foldArgument (\t ty nm -> let at = "public " ++ ty ++ " " ++ nm ++ ";" in if null t then at else unlines $ map (\x-> "[" ++ mshow x ++"]") t ++ [at]) mshowM 2 = foldArgument (\t ty nm -> let at = ty ++ " " ++ nm in if null t then at else concat $ ["[" ++ intercalate ", " (map mshow t) ++ "]", at]) instance MShow CsExport where mshow = foldCsExport (\c t n r a-> let comments_body = zipWith ($) (repeat ("/// "++)) c params_decl = map (\(Argument _ _ n) -> "/// ") a result_decl = if r == "void" then [] else ["/// "] comments = ("/// " : comments_body) ++ ("/// " : params_decl) ++ result_decl attributes = if null t then [] else map (\x-> "[" ++ mshow x ++"]") t arguments = "(" ++ intercalate ", " (map (mshowM 2) a) ++ ")" decl = if '*' `elem` arguments || '*' `elem` r then "public unsafe static extern " else "public static extern " in unlines $ comments ++ attributes ++ [decl ++ r ++ " " ++ n ++ arguments ++ ";",""]) instance MShow CsStruct where mshow cs = let attr = map (\x-> "[" ++ mshow x ++"]") (cssTopAttr cs) indent' x = " " ++ x args = concatMap (map indent'.lines.mshow) (cssElements cs) in unlines $ attr ++ ["public unsafe struct " ++ cssName cs ,"{" ] ++ args ++ ["};" ,"" ] instance MShow CsCallback where mshow cs = let attr = map (\x-> "[" ++ mshow x ++"]") (cscTopAttr cs) indent' x = " " ++ x args = intercalate "," (map (mshowM 2) (cscArguments cs)) ret = cscRetType cs unsafe = if '*' `elem` args || '*' `elem` ret then "unsafe " else "" in unlines $ attr ++ ["public " ++ unsafe ++ "delegate " ++ ret ++ " " ++ (cscName cs) ++ "(" ++ args ++ ");"] instance MShow CSharp where mshow cs = let nm = "namespace " ++ _namespace cs indent = (" " ++) csexp = concatMap (map indent.lines.mshow) $ _functions cs cspre = let cs' = _preserved cs val = (indent "/// Preserved export statements") : (concatMap (map indent.lines.mshow) cs') in if null cs' then [] else val csrts = let cs' = _rtscontrol cs val = (indent "/// Runtime control methods") : (concatMap (map indent.lines.mshow) cs') in if null cs' then [] else val csenum = let cs' = _enums cs val = (indent "/// Constructor Enumerations") : (concatMap (map indent.lines.mshow) cs') in if null cs' then [] else val csstrc = let cs' = _structs cs in concatMap (map indent.lines.mshow) cs' csback = let cs' = _callbacks cs val = (indent "/// Callback functions ") : (concatMap (map indent.lines.mshow) cs') in if null cs' then [] else val imports = map mshow (_includes cs) in unlines $ imports ++ ["" ,nm ,"{" ] ++ zipWith id (repeat (" /// "++)) (lines $ _header cs) ++ [" public unsafe class " ++ _class cs ," {" ] ++ [""] ++ csback ++ [""] ++ csexp ++ cspre ++ csrts ++ [" }" ,"}" ,nm ++ ".Types" ,"{" ] ++ zipWith id (repeat (" /// "++)) (lines $ _header cs) ++ csenum ++ [""] ++ csstrc ++ ["}" ]