@@ -5,16 +5,21 @@ module Language.Haskell.Stylish.Config.Cabal
5
5
6
6
7
7
--------------------------------------------------------------------------------
8
+ import Control.Monad (unless )
9
+ import qualified Data.ByteString.Char8 as BS
8
10
import Data.Either (isRight )
11
+ import Data.Foldable (traverse_ )
9
12
import Data.List (nub )
10
13
import Data.Maybe (maybeToList )
11
14
import qualified Distribution.PackageDescription as Cabal
12
15
import qualified Distribution.PackageDescription.Parsec as Cabal
16
+ import qualified Distribution.Parsec as Cabal
13
17
import qualified Distribution.Simple.Utils as Cabal
14
18
import qualified Distribution.Verbosity as Cabal
15
19
import qualified Language.Haskell.Extension as Language
16
20
import Language.Haskell.Stylish.Verbose
17
- import System.Directory (getCurrentDirectory )
21
+ import System.Directory (doesFileExist ,
22
+ getCurrentDirectory )
18
23
19
24
20
25
--------------------------------------------------------------------------------
@@ -49,7 +54,7 @@ findCabalFile verbose = do
49
54
readDefaultLanguageExtensions :: Verbose -> FilePath -> IO [Language. KnownExtension ]
50
55
readDefaultLanguageExtensions verbose cabalFile = do
51
56
verbose $ " Parsing " <> cabalFile <> " ..."
52
- packageDescription <- Cabal. readGenericPackageDescription Cabal. silent cabalFile
57
+ packageDescription <- readGenericPackageDescription Cabal. silent cabalFile
53
58
let library :: [Cabal. Library ]
54
59
library = maybeToList $ fst . Cabal. ignoreConditions <$>
55
60
Cabal. condLibrary packageDescription
@@ -89,3 +94,23 @@ readDefaultLanguageExtensions verbose cabalFile = do
89
94
" invalid LANGUAGE pragma: " <> show x
90
95
verbose $ " Gathered default-extensions: " <> show defaultExtensions
91
96
pure $ nub defaultExtensions
97
+
98
+ readGenericPackageDescription :: Cabal. Verbosity -> FilePath -> IO Cabal. GenericPackageDescription
99
+ readGenericPackageDescription = readAndParseFile Cabal. parseGenericPackageDescription
100
+ where
101
+ readAndParseFile parser verbosity fpath = do
102
+ exists <- doesFileExist fpath
103
+ unless exists $
104
+ Cabal. die' verbosity $
105
+ " Error Parsing: file \" " ++ fpath ++ " \" doesn't exist. Cannot continue."
106
+ bs <- BS. readFile fpath
107
+ parseString parser verbosity fpath bs
108
+
109
+ parseString parser verbosity name bs = do
110
+ let (warnings, result) = Cabal. runParseResult (parser bs)
111
+ traverse_ (Cabal. warn verbosity . Cabal. showPWarning name) warnings
112
+ case result of
113
+ Right x -> return x
114
+ Left (_, errors) -> do
115
+ traverse_ (Cabal. warn verbosity . Cabal. showPError name) errors
116
+ Cabal. die' verbosity $ " Failed parsing \" " ++ name ++ " \" ."
0 commit comments