haskell-tools-ast-0.4.1.2: Language/Haskell/Tools/AST/Representation/Modules.hs
-- | Representation of Haskell modules, imports and exports. Also contains file-level pragmas.
module Language.Haskell.Tools.AST.Representation.Modules where
import Language.Haskell.Tools.AST.Ann (Ann(..), AnnListG(..), AnnMaybeG(..))
import Language.Haskell.Tools.AST.Representation.Decls (UDecl(..))
import Language.Haskell.Tools.AST.Representation.Names (UStringNode(..), UName(..))
-- | The representation of a haskell module, that is a separate compilation unit.
-- It may or may not have a header.
data UModule dom stage
= UModule { _filePragmas :: AnnListG UFilePragma dom stage
, _modHead :: AnnMaybeG UModuleHead dom stage
, _modImports :: AnnListG UImportDecl dom stage
, _modDecl :: AnnListG UDecl dom stage
}
-- | Module declaration with name and (optional) exports
data UModuleHead dom stage
= UModuleHead { _mhName :: Ann UModuleName dom stage
, _mhExports :: AnnMaybeG UExportSpecs dom stage
, _mhPragma :: AnnMaybeG UModulePragma dom stage
}
-- | A list of export specifications surrounded by parentheses
data UExportSpecs dom stage
= UExportSpecs { _espExports :: AnnListG UExportSpec dom stage }
-- | Export specifier
data UExportSpec dom stage
= UDeclExport { _exportDecl :: Ann UIESpec dom stage
} -- ^ Export a name and related names
| UModuleExport { _exportModuleName :: Ann UModuleName dom stage
} -- ^ The export of an imported module (@ module A @)
-- | Marks a name to be imported or exported with related names (subspecifier)
data UIESpec dom stage
= UIESpec { _ieModifier :: AnnMaybeG UImportModifier dom stage
, _ieName :: Ann UName dom stage
, _ieSubspec :: AnnMaybeG USubSpec dom stage
}
-- | Specifies the imported element
data UImportModifier dom stage
= UImportPattern -- ^ @pattern@: modifier for importing pattern synonyms
-- | Marks how related names will be imported or exported with a given name
data USubSpec dom stage
= USubSpecAll -- ^ @(..)@: a class exported with all of its methods, or a datatype exported with all of its constructors.
| USubSpecList { _essList :: AnnListG UName dom stage
} -- ^ @(a,b,c)@: a class exported with some of its methods, or a datatype exported with some of its constructors.
-- | Pragmas that must be used before defining the module
data UFilePragma dom stage
= ULanguagePragma { _lpPragmas :: AnnListG ULanguageExtension dom stage
} -- ^ @LANGUAGE@ pragma, listing the enabled language extensions in that file
| UOptionsPragma { _opStr :: Ann UStringNode dom stage
} -- ^ @OPTIONS@ pragma, possibly qualified with a tool, e.g. OPTIONS_GHC
-- | Pragmas that must be used after the module head
data UModulePragma dom stage
= UModuleWarningPragma { _modWarningStr :: AnnListG UStringNode dom stage
} -- ^ A warning pragma attached to the module
| UModuleDeprecatedPragma { _modDeprecatedPragma :: AnnListG UStringNode dom stage
} -- ^ A deprecated pragma attached to the module
-- | The name of the enabled language extension, for example (@ LambdaCase @)
data ULanguageExtension dom stage = ULanguageExtension { _langExt :: String }
-- | An import declaration: @import Module.Name@
data UImportDecl dom stage
= UImportDecl { _importSource :: AnnMaybeG UImportSource dom stage
, _importQualified :: AnnMaybeG UImportQualified dom stage
, _importSafe :: AnnMaybeG UImportSafe dom stage
, _importPkg :: AnnMaybeG UStringNode dom stage
, _importModule :: Ann UModuleName dom stage
, _importAs :: AnnMaybeG UImportRenaming dom stage
, _importSpec :: AnnMaybeG UImportSpec dom stage
}
-- | Restriction on the imported names
data UImportSpec dom stage
= UImportSpecList { _importSpecList :: AnnListG UIESpec dom stage
} -- ^ Restrict the import definition to ONLY import the listed names
| UImportSpecHiding { _importSpecHiding :: AnnListG UIESpec dom stage
} -- ^ Restrict the import definition to DONT import the listed names
-- | Marks the import as qualified: @qualified@
data UImportQualified dom stage = UImportQualified
-- | Marks the import as source: @{-# SOURCE #-}@
data UImportSource dom stage = UImportSource
-- | Marks the import as safe: @safe@
data UImportSafe dom stage = UImportSafe
-- | Marks an imported name to belong to the type namespace: @type@
data UTypeNamespace dom stage = UTypeNamespace
-- | Renaming imports (@ as A @)
data UImportRenaming dom stage = UImportRenaming { _importRename :: Ann UModuleName dom stage }
-- | The name of a module
data UModuleName dom stage = UModuleName { _moduleNameString :: String }
-- | The @type@ keyword used to qualify that the type and not the constructor of the same name is referred
data TypeKeyword dom stage = TypeKeyword