module Types where
import qualified Language.Haskell.Exts.Annotated as Haskell
data ImportLine = ImportLine {
importDecl :: ImportDecl
, importComments :: [Comment]
, importIsLocal :: Bool
} deriving (Show)
-- | A Comment is associated with a particular import line.
data Comment = Comment CmtPos String deriving (Show)
data CmtPos = CmtAbove | CmtRight deriving (Show)
type ImportDecl = Haskell.ImportDecl Haskell.SrcSpanInfo
type Module = Haskell.Module Haskell.SrcSpanInfo
-- | A Qualification is a qualified name minus the actual name. So it should
-- be the tail of a ModuleName.
newtype Qualification = Qualification String
deriving (Eq, Ord, Show)
newtype ModuleName = ModuleName String
deriving (Eq, Ord, Show)
moduleName :: ModuleName -> String
moduleName (ModuleName n) = n
-- | Get the qualified name from a qualified import, if it is a qualified
-- import.
importDeclQualification :: ImportDecl -> Maybe Qualification
importDeclQualification decl
| Haskell.importQualified decl = Just $ moduleToQualification $
maybe (Haskell.importModule decl) id (Haskell.importAs decl)
| otherwise = Nothing
-- | Extract the ModuleName from an ImportDecl.
importDeclModule :: ImportDecl -> ModuleName
importDeclModule imp = case Haskell.importModule imp of
Haskell.ModuleName _ s -> ModuleName s
importModule :: ImportLine -> ModuleName
importModule = importDeclModule . importDecl
-- | The parser represents the \'as\' part of an import as a ModuleName even
-- though it's actually a Qualification.
moduleToQualification :: Haskell.ModuleName Haskell.SrcSpanInfo
-> Types.Qualification
moduleToQualification (Haskell.ModuleName _ s) = Types.Qualification s