@@ -5,16 +5,21 @@ module Language.Haskell.Stylish.Config.Cabal
55
66
77--------------------------------------------------------------------------------
8+ import Control.Monad (unless )
9+ import qualified Data.ByteString.Char8 as BS
810import Data.Either (isRight )
11+ import Data.Foldable (traverse_ )
912import Data.List (nub )
1013import Data.Maybe (maybeToList )
1114import qualified Distribution.PackageDescription as Cabal
1215import qualified Distribution.PackageDescription.Parsec as Cabal
16+ import qualified Distribution.Parsec as Cabal
1317import qualified Distribution.Simple.Utils as Cabal
1418import qualified Distribution.Verbosity as Cabal
1519import qualified Language.Haskell.Extension as Language
1620import Language.Haskell.Stylish.Verbose
17- import System.Directory (getCurrentDirectory )
21+ import System.Directory (doesFileExist ,
22+ getCurrentDirectory )
1823
1924
2025--------------------------------------------------------------------------------
@@ -49,7 +54,7 @@ findCabalFile verbose = do
4954readDefaultLanguageExtensions :: Verbose -> FilePath -> IO [Language. KnownExtension ]
5055readDefaultLanguageExtensions verbose cabalFile = do
5156 verbose $ " Parsing " <> cabalFile <> " ..."
52- packageDescription <- Cabal. readGenericPackageDescription Cabal. silent cabalFile
57+ packageDescription <- readGenericPackageDescription Cabal. silent cabalFile
5358 let library :: [Cabal. Library ]
5459 library = maybeToList $ fst . Cabal. ignoreConditions <$>
5560 Cabal. condLibrary packageDescription
@@ -89,3 +94,23 @@ readDefaultLanguageExtensions verbose cabalFile = do
8994 " invalid LANGUAGE pragma: " <> show x
9095 verbose $ " Gathered default-extensions: " <> show defaultExtensions
9196 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