module Language.Haskell.Tools.AST.Gen.Modules where
import Data.String (IsString(..), String(..))
import Language.Haskell.Tools.AST
import Language.Haskell.Tools.AST.ElementTypes
import Language.Haskell.Tools.AST.Gen.Names (mkStringNode)
import Language.Haskell.Tools.AST.Gen.Utils
import Language.Haskell.Tools.Transform
mkModule :: [FilePragma dom] -> Maybe (ModuleHead dom) -> [ImportDecl dom] -> [Decl dom] -> Module dom
mkModule filePrags head imps decls
= mkAnn (child <> child <> child <> child)
$ UModule (mkAnnList (followedBy "\n" $ separatedBy "\n" list) filePrags) (mkAnnMaybe opt head)
(mkAnnList (after "\n" $ indented list) imps) (mkAnnList (after "\n" $ indented list) decls)
mkModuleHead :: ModuleName dom -> Maybe (ExportSpecs dom) -> Maybe (ModulePragma dom) -> ModuleHead dom
mkModuleHead n es pr = mkAnn ("module " <> child <> child <> child <> " where")
$ UModuleHead n (mkAnnMaybe opt es) (mkAnnMaybe (after "\n" opt) pr)
mkExportSpecs :: [ExportSpec dom] -> ExportSpecs dom
mkExportSpecs = mkAnn ("(" <> child <> ")") . UExportSpecs . mkAnnList (separatedBy ", " list)
mkExportSpec :: IESpec dom -> ExportSpec dom
mkExportSpec = mkAnn child . UDeclExport
mkModuleExport :: ModuleName dom -> ExportSpec dom
mkModuleExport = mkAnn ("module " <> child) . UModuleExport
mkIESpec :: Name dom -> Maybe (SubSpec dom) -> IESpec dom
mkIESpec name ss = mkAnn (child <> child <> child) (UIESpec noth name (mkAnnMaybe (after "(" $ followedBy ")" opt) ss))
mkPatternIESpec :: Name dom -> IESpec dom
mkPatternIESpec name = mkAnn (child <> child) (UIESpec (justVal $ mkAnn child UImportPattern) name noth)
mkSubList :: [Name dom] -> SubSpec dom
mkSubList = mkAnn child . USubSpecList . mkAnnList (separatedBy ", " list)
mkSubAll :: SubSpec dom
mkSubAll = mkAnn ".." USubSpecAll
mkImportDecl :: Bool -> Bool -> Bool -> Maybe String -> ModuleName dom -> Maybe (ModuleName dom) -> Maybe (ImportSpec dom)
-> ImportDecl dom
mkImportDecl source qualified safe pkg name rename spec
= mkAnn ("import " <> child <> child <> child <> child <> child <> child <> child) $
UImportDecl (if source then justVal (mkAnn "{-# SOURCE #-} " UImportSource) else noth)
(if qualified then justVal (mkAnn "qualified " UImportQualified) else noth)
(if safe then justVal (mkAnn "safe " UImportSafe) else noth)
(case pkg of Just str -> justVal (mkStringNode str); _ -> noth)
name (mkAnnMaybe opt (fmap (mkAnn (" as " <> child) . UImportRenaming) rename)) (mkAnnMaybe opt spec)
mkImportSpecList :: [IESpec dom] -> ImportSpec dom
mkImportSpecList = mkAnn ("(" <> child <> ")") . UImportSpecList . mkAnnList (separatedBy ", " list)
mkImportHidingList :: [IESpec dom] -> ImportSpec dom
mkImportHidingList = mkAnn (" hiding (" <> child <> ")") . UImportSpecHiding . mkAnnList (separatedBy ", " list)
mkModuleName :: String -> ModuleName dom
mkModuleName s = mkAnn (fromString s) (UModuleName s)
mkLanguagePragma :: [String] -> FilePragma dom
mkLanguagePragma extensions
= mkAnn ("{-# LANGUAGE " <> child <> " #-}") $ ULanguagePragma
$ mkAnnList (separatedBy ", " list) (map (\ext -> mkAnn (fromString ext) (ULanguageExtension ext)) extensions)
mkOptionsGHC :: String -> FilePragma dom
mkOptionsGHC opts
= mkAnn ("{-# OPTIONS_GHC " <> child <> " #-}") $ UOptionsPragma
$ mkStringNode opts
mkModuleWarningPragma :: [String] -> ModulePragma dom
mkModuleWarningPragma msg
= mkAnn ("{-# WARNING " <> child <> " #-}") $ UModuleWarningPragma
$ mkAnnList (separatedBy " " list) $ map mkStringNode msg
mkModuleDeprecatedPragma :: [String] -> ModulePragma dom
mkModuleDeprecatedPragma msg
= mkAnn ("{-# DEPRECATED " <> child <> " #-}") $ UModuleDeprecatedPragma
$ mkAnnList (separatedBy " " list) $ map mkStringNode msg