static-ls-0.1.2: src/StaticLS/FilePath.hs
module StaticLS.FilePath (modToFilePath, subRootExtensionFilepath) where
import Control.Monad.IO.Class
import Control.Monad.Trans.Maybe
import qualified Data.List as List
import qualified Data.List.Extra as List
import qualified GHC.Plugins as GHC
import StaticLS.SrcFiles
import qualified System.Directory as Dir
import System.FilePath ((-<.>), (</>))
modToFilePath :: GHC.ModuleName -> String -> FilePath
modToFilePath modName ext =
GHC.moduleNameSlashes modName -<.> ext
-- | Substitute a filepath extension and parent directory starting from some root
subRootExtensionFilepath :: (MonadIO m) => FilePath -> FilePath -> String -> FilePath -> MaybeT m FilePath
subRootExtensionFilepath wsRoot parent extension srcPath =
do
absoluteRoot <- liftIO $ Dir.makeAbsolute wsRoot
let absoluteSrcDirs = (absoluteRoot </>) <$> srcDirs
absoluteSrcPath <- liftIO $ Dir.makeAbsolute srcPath
-- Normalize to absolute paths to drop the prefix
let noPrefixSrcPath =
List.foldl' (flip List.dropPrefix) absoluteSrcPath absoluteSrcDirs
-- Set the directory path and substitute the file extension
newPath = absoluteRoot </> parent </> noPrefixSrcPath -<.> extension
True <- liftIO $ Dir.doesFileExist newPath
pure newPath