module Language.Haskell.Tools.Refactor.GetModules where
import Data.List (intersperse, find)
import Distribution.Verbosity (silent)
import Distribution.ModuleName (components)
import Distribution.PackageDescription
import Distribution.PackageDescription.Configuration
import Distribution.PackageDescription.Parse
import System.FilePath.Posix
import System.Directory
getModules :: FilePath -> IO [String]
getModules root
= do files <- listDirectory root
case find (\p -> takeExtension p == ".cabal") files of
Just cabalFile -> modulesFromCabalFile (root </> cabalFile)
Nothing -> modulesFromDirectory root root
modulesFromCabalFile :: FilePath -> IO [String]
modulesFromCabalFile cabal = getModules . flattenPackageDescription <$> readPackageDescription silent cabal
where getModules pkg = map (concat . intersperse "." . components)
$ maybe [] libModules (library pkg)
++ concatMap exeModules (executables pkg)
++ concatMap testModules (testSuites pkg)
++ concatMap benchmarkModules (benchmarks pkg)
modulesFromDirectory :: FilePath -> FilePath -> IO [String]
modulesFromDirectory root searchRoot = concat <$> (mapM goOn =<< listDirectory searchRoot)
where goOn fp = let path = searchRoot </> fp
in do isDir <- doesDirectoryExist path
if isDir
then modulesFromDirectory root path
else if takeExtension path == ".hs"
then return [concat $ intersperse "." $ splitDirectories $ dropExtension $ makeRelative root path]
else return []