@@ -37,6 +37,7 @@ import Control.Applicative ((<|>))
3737import System.IO.Temp
3838import System.IO.Error (isPermissionError )
3939import Data.List
40+ import Data.Maybe
4041import Data.Ord (Down (.. ))
4142
4243import System.PosixCompat.Files
@@ -50,11 +51,11 @@ import qualified Data.Conduit as C
5051import qualified Data.Conduit.Text as C
5152import qualified Data.Text as T
5253import qualified Data.Text.IO as T
53- import Data.Maybe (fromMaybe )
5454import GHC.Fingerprint (fingerprintString )
5555
5656import Hie.Cabal.Parser
5757import Hie.Yaml
58+ import Hie.Locate
5859----------------------------------------------------------------
5960
6061-- | Given root\/foo\/bar.hs, return root\/hie.yaml, or wherever the yaml file was found.
@@ -132,23 +133,22 @@ implicitConfig' fp = (\wdir ->
132133 (Bios (wdir </> " .hie-bios" ) Nothing , wdir)) <$> biosWorkDir fp
133134 -- <|> (Obelisk,) <$> obeliskWorkDir fp
134135 -- <|> (Bazel,) <$> rulesHaskellWorkDir fp
135- <|> (cabalExecutable >> cabalProjectDir fp >> cabalDistDir fp >> cabal)
136- <|> (stackExecutable >> stackYamlDir fp >> stackWorkDir fp >> stack)
137- <|> (cabalExecutable >> cabalProjectDir fp >> cabal)
138- <|> (stackExecutable >> stackYamlDir fp >> stack)
139- <|> (cabalExecutable >> cabal)
136+ <|> (cabalExecutable >> cabalProjectDir fp >> cabalDistDir fp >>= cabal)
137+ <|> (stackExecutable >> stackYamlDir fp >> stackWorkDir fp >>= stack)
138+ <|> (cabalExecutable >> cabalProjectDir fp >>= cabal)
139+ <|> (stackExecutable >> stackYamlDir fp >>= stack)
140+ <|> (cabalExecutable >> cabalFile fp >>= cabal)
140141 where
141- stack = pkg >>= mc StackMulti stackComponent
142- cabal = pkg >>= mc CabalMulti cabalComponent
143- mc c f (pkg', fp') = pure (c (components f pkg'), fp')
142+ readPkgs f p = do
143+ cfs <- nestedCabalFiles p
144+ pkgs <- catMaybes <$> mapM (nestedPkg p) cfs
145+ pure $ concatMap (components f) pkgs
146+ build cn cc p = do
147+ c <- liftIO $ cn <$> readPkgs cc p
148+ pure (c, p)
149+ cabal = build CabalMulti cabalComponent
150+ stack = build StackMulti stackComponent
144151 components f (Package n cs) = map (f n) cs
145- pkg = do
146- d <- cabalFile fp
147- f <- liftIO $ findCabalFiles d
148- t <- liftIO $ T. readFile $ d </> head f
149- case parsePackage' t of
150- Left _ -> fail " could not parse cabal file"
151- Right p -> pure (p, fp)
152152
153153yamlConfig :: FilePath -> MaybeT IO FilePath
154154yamlConfig fp = do
0 commit comments