{-# LANGUAGE TypeFamilies #-} {-# LANGUAGE DeriveDataTypeable #-} module Language.Haskell.Syntax.ImpExp ( module Language.Haskell.Syntax.ImpExp, IsBootInterface(..) ) where import Language.Haskell.Syntax.Extension import Language.Haskell.Syntax.Module.Name import Language.Haskell.Syntax.ImpExp.IsBoot ( IsBootInterface(..) ) import Data.Eq (Eq) import Data.Data (Data) import Data.Bool (Bool) import Data.Maybe (Maybe) import Data.String (String) import Data.Int (Int) import Control.DeepSeq import {-# SOURCE #-} GHC.Hs.Doc (LHsDoc) -- ROMES:TODO Discuss in #21592 whether this is parsed AST or base AST {- ************************************************************************ * * Import and export declaration lists * * ************************************************************************ One per import declaration in a module. -} -- | Located Import Declaration type LImportDecl pass = XRec pass (ImportDecl pass) -- | If/how an import is 'qualified'. data ImportDeclQualifiedStyle = QualifiedPre -- ^ 'qualified' appears in prepositive position. | QualifiedPost -- ^ 'qualified' appears in postpositive position. | NotQualified -- ^ Not qualified. deriving (Eq, Data) data ImportDeclLevelStyle = LevelStylePre ImportDeclLevel -- ^ 'splice' or 'quote' appears in prepositive position. | LevelStylePost ImportDeclLevel -- ^ 'splice' or 'quote' appears in postpositive position. | NotLevelled -- ^ Not levelled. deriving (Eq, Data) data ImportDeclLevel = ImportDeclQuote | ImportDeclSplice deriving (Eq, Data) -- | Import Declaration -- -- A single Haskell @import@ declaration. data ImportDecl pass = ImportDecl { ideclExt :: XCImportDecl pass, -- ^ Locations of keywords like @import@, @qualified@, etc. are captured here. ideclName :: XRec pass ModuleName, -- ^ Module name. ideclPkgQual :: ImportDeclPkgQual pass, -- ^ Package qualifier. ideclSource :: IsBootInterface, -- ^ IsBoot \<=> {-\# SOURCE \#-} import ideclLevelSpec :: ImportDeclLevelStyle, ideclSafe :: Bool, -- ^ True => safe import ideclQualified :: ImportDeclQualifiedStyle, -- ^ If/how the import is qualified. ideclAs :: Maybe (XRec pass ModuleName), -- ^ as Module ideclImportList :: Maybe (ImportListInterpretation, XRec pass [LIE pass]) -- ^ Explicit import list (EverythingBut => hiding, names) } | XImportDecl !(XXImportDecl pass) -- | Whether the import list is exactly what to import, or whether @hiding@ was -- used, and therefore everything but what was listed should be imported data ImportListInterpretation = Exactly | EverythingBut deriving (Eq, Data) instance NFData ImportListInterpretation where rnf = rwhnf -- | Located Import or Export type LIE pass = XRec pass (IE pass) -- ^ When in a list this may have -- | A docstring attached to an export list item. type ExportDoc pass = LHsDoc pass -- | Imported or exported entity. data IE pass = IEVar (XIEVar pass) (LIEWrappedName pass) (Maybe (ExportDoc pass)) -- ^ Imported or exported variable -- -- @ -- module Mod ( test ) -- import Mod ( test ) -- @ | IEThingAbs (XIEThingAbs pass) (LIEWrappedName pass) (Maybe (ExportDoc pass)) -- ^ Imported or exported Thing with absent subordinate list -- -- The thing is a Class\/Type (can't tell) -- -- @ -- module Mod ( Test ) -- import Mod ( Test ) -- @ -- See Note [Located RdrNames] in GHC.Hs.Expr | IEThingAll (XIEThingAll pass) (LIEWrappedName pass) (Maybe (ExportDoc pass)) -- ^ Imported or exported thing with wildcard subordinate list (e.g. @(..)@) -- -- The thing is a Class\/Type and the All refers to methods\/constructors -- -- @ -- module Mod ( Test(..) ) -- import Mod ( Test(..) ) -- @ -- See Note [Located RdrNames] in GHC.Hs.Expr | IEThingWith (XIEThingWith pass) (LIEWrappedName pass) IEWildcard [LIEWrappedName pass] (Maybe (ExportDoc pass)) -- ^ Imported or exported thing with explicit subordinate list. -- -- The thing is a Class\/Type (can't tell) and the imported or exported things are -- its children. -- -- @ -- module Mod ( Test(f, g) ) -- import Mod ( Test(f, g) ) -- @ | IEModuleContents (XIEModuleContents pass) (XRec pass ModuleName) -- ^ Export of entire module. Can only occur in export list. -- -- @ -- module Mod ( module Mod2 ) -- @ | IEGroup (XIEGroup pass) Int (LHsDoc pass) -- ^ A Haddock section in an export list. -- -- @ -- module Mod -- ( -- * Section heading -- ... -- ) -- @ | IEDoc (XIEDoc pass) (LHsDoc pass) -- ^ A bit of unnamed documentation. -- -- @ -- module Mod -- ( -- | Documentation -- ... -- ) -- @ | IEDocNamed (XIEDocNamed pass) String -- ^ A reference to a named documentation chunk. -- -- @ -- module Mod -- ( -- $chunkName -- ... -- ) -- @ | XIE !(XXIE pass) -- | Wildcard in an import or export sublist, like the @..@ in -- @import Mod ( T(Mk1, Mk2, ..) )@. data IEWildcard = NoIEWildcard -- ^ no wildcard in this list | IEWildcard Int -- ^ wildcard after the given \# of items in this list -- The @Int@ is in the range [0..n], where n is the length -- of the list. deriving (Eq, Data) -- | A name in an import or export specification which may have -- adornments. Used primarily for accurate pretty printing of -- ParsedSource, and API Annotation placement. data IEWrappedName p = IEName (XIEName p) (LIdP p) -- ^ unadorned name, e.g @myFun@ | IEDefault (XIEDefault p) (LIdP p) -- ^ @default X ()@, see Note [Named default declarations] in GHC.Tc.Gen.Default | IEPattern (XIEPattern p) (LIdP p) -- ^ @pattern X@ | IEType (XIEType p) (LIdP p) -- ^ @type (:+:)@ | IEData (XIEData p) (LIdP p) -- ^ @data (:+:)@ | XIEWrappedName !(XXIEWrappedName p) -- | Located name with possible adornment type LIEWrappedName p = XRec p (IEWrappedName p)