src/Importify/Syntax/Module.hs
-- | Syntax utilities to work with modules and their names.
module Importify.Syntax.Module
( getModuleTitle
, isInsideExport
, modulePragmas
) where
import Universum
import Language.Haskell.Exts (ExportSpec (EModuleContents),
ExportSpecList (..), Module (..),
ModuleHead (..), ModuleName,
ModuleName (..), ModulePragma)
import Language.Haskell.Names.SyntaxUtils (dropAnn, getModuleName)
{- TODO: this function used earlier, it works, but is not used anymore
I'll keep it in case we need it again.
-- | Returns module name of the source file.
-- We can't parse the whole file to get it because default extensions are not available yet
-- so this method uses 'NonGreedy' parsing to parse only module head.
getSourceModuleName :: Text -> String
getSourceModuleName src =
let parseResult :: ParseResult (NonGreedy (PragmasAndModuleName SrcSpanInfo))
parseResult = parse $ toString src
NonGreedy (PragmasAndModuleName _ _pragmas maybeModuleName) =
fromParseResult parseResult
ModuleName _ modNameStr =
fromMaybe (error "File doesn't have `module' declaration") maybeModuleName
in modNameStr
-}
-- | Get name of module by dropping annonation.
getModuleNameId :: ModuleName l -> String
getModuleNameId (ModuleName _ id) = id
-- | Returns name of 'Module' as a 'String'.
getModuleTitle :: Module l -> String
getModuleTitle = getModuleNameId . getModuleName
-- | Returns 'True' iff given 'ModuleName' is inside export list.
isInsideExport :: Maybe (ModuleHead l) -> ModuleName () -> Bool
isInsideExport moduleHead moduleName = moduleName `elem` exportedModules moduleHead
-- | Extracts list of module names exported with @module A@ way.
exportedModules :: Maybe (ModuleHead l) -> [ModuleName ()]
exportedModules moduleHead = qualifiedModuleNames
where
exports = do
ModuleHead _ _ _ maybeExports <- moduleHead
maybeExports
qualifiedModuleNames :: [ModuleName ()]
qualifiedModuleNames = do
ExportSpecList _ specs <- maybe [] one exports
EModuleContents _ eModule <- specs
pure $ dropAnn eModule
-- | Extract all 'ModulePragma's from 'Module'.
modulePragmas :: Module l -> [ModulePragma l]
modulePragmas (Module _ _ pragmas _ _) = pragmas
modulePragmas (XmlPage _ _ pragmas _ _ _ _) = pragmas
modulePragmas (XmlHybrid _ _ pragmas _ _ _ _ _ _) = pragmas