@@ -16,33 +16,23 @@ import Data.Aeson (FromJSON (..)
1616import qualified Data.Aeson as A
1717import qualified Data.Aeson.Types as A
1818import qualified Data.ByteString as B
19- import Data.Either (isRight )
2019import qualified Data.FileEmbed as FileEmbed
21- import Data.List (concatMap ,
22- inits ,
23- intercalate ,
20+ import Data.List (intercalate ,
2421 nub )
2522import Data.Map (Map )
2623import qualified Data.Map as M
27- import Data.Maybe (fromMaybe ,
28- maybeToList )
24+ import Data.Maybe (fromMaybe )
2925import Data.Yaml (decodeEither' ,
3026 prettyPrintParseException )
31- import qualified Distribution.PackageDescription as Cabal
32- import qualified Distribution.PackageDescription.Parsec as Cabal
33- import qualified Distribution.Simple.Utils as Cabal
34- import qualified Distribution.Types.CondTree as Cabal
35- import qualified Distribution.Verbosity as Cabal
36- import qualified Language.Haskell.Extension as Language
3727import System.Directory
38- import System.FilePath (joinPath ,
39- splitPath ,
40- (</>) )
28+ import System.FilePath ((</>) )
4129import qualified System.IO as IO (Newline (.. ),
4230 nativeNewline )
4331
4432
4533--------------------------------------------------------------------------------
34+ import qualified Language.Haskell.Stylish.Config.Cabal as Cabal
35+ import Language.Haskell.Stylish.Config.Internal
4636import Language.Haskell.Stylish.Step
4737import qualified Language.Haskell.Stylish.Step.Imports as Imports
4838import qualified Language.Haskell.Stylish.Step.LanguagePragmas as LanguagePragmas
@@ -64,6 +54,7 @@ data Config = Config
6454 , configColumns :: Int
6555 , configLanguageExtensions :: [String ]
6656 , configNewline :: IO. Newline
57+ , configCabal :: Bool
6758 }
6859
6960
@@ -95,10 +86,6 @@ configFilePath verbose Nothing = do
9586
9687 return mbConfig
9788
98- -- All ancestors of a dir (including that dir)
99- ancestors :: FilePath -> [FilePath ]
100- ancestors = init . map joinPath . reverse . inits . splitPath
101-
10289search :: Verbose -> [FilePath ] -> IO (Maybe FilePath )
10390search _ [] = return Nothing
10491search verbose (f : fs) = do
@@ -117,75 +104,15 @@ loadConfig verbose userSpecified = do
117104 Left err -> error $
118105 " Language.Haskell.Stylish.Config.loadConfig: " ++ prettyPrintParseException err
119106 Right config -> do
120- mbCabalFile <- cabalFilePath verbose
121- exsFromCabal <- case mbCabalFile of
122- Just cabalFile -> map show <$>
123- readDefaultLanguageExtensions verbose cabalFile
124- Nothing -> return []
125- let exsFromConfig = configLanguageExtensions config
126- return $ config {configLanguageExtensions = nub (exsFromConfig <> exsFromCabal)}
107+ cabalLanguageExtensions <- if configCabal config
108+ then map show <$> Cabal. findLanguageExtensions verbose
109+ else pure []
127110
128- --------------------------------------------------------------------------------
129- -- | Find the closest .cabal file, possibly going up the directory structure.
130- -- It's essential that
131- cabalFilePath :: Verbose -> IO (Maybe FilePath )
132- cabalFilePath verbose = do
133- potentialProjectRoots <- ancestors <$> getCurrentDirectory
134- potentialCabalFile <- filter isRight <$>
135- traverse Cabal. findPackageDesc potentialProjectRoots
136- case potentialCabalFile of
137- [Right cabalFile] -> return (Just cabalFile)
138- _ -> do
139- verbose $ " .cabal file not found, directories searched: " <>
140- show potentialProjectRoots
141- verbose $ " Stylish Haskell will work basing on LANGUAGE pragmas in source files."
142- return Nothing
111+ return $ config
112+ { configLanguageExtensions = nub $
113+ configLanguageExtensions config ++ cabalLanguageExtensions
114+ }
143115
144- --------------------------------------------------------------------------------
145- -- | Extract @default-extensions@ fields from a @.cabal@ file
146- readDefaultLanguageExtensions :: Verbose -> FilePath -> IO [Language. KnownExtension ]
147- readDefaultLanguageExtensions verbose cabalFile = do
148- verbose $ " Parsing " <> cabalFile <> " ..."
149- packageDescription <- Cabal. readGenericPackageDescription Cabal. silent cabalFile
150- let library :: [Cabal. Library ]
151- library = maybeToList $ fst . Cabal. ignoreConditions <$>
152- Cabal. condLibrary packageDescription
153-
154- subLibraries :: [Cabal. Library ]
155- subLibraries = fst . Cabal. ignoreConditions . snd <$>
156- Cabal. condSubLibraries packageDescription
157-
158- executables :: [Cabal. Executable ]
159- executables = fst . Cabal. ignoreConditions . snd <$>
160- Cabal. condExecutables packageDescription
161-
162- testSuites :: [Cabal. TestSuite ]
163- testSuites = fst . Cabal. ignoreConditions . snd <$>
164- Cabal. condTestSuites packageDescription
165-
166- benchmarks :: [Cabal. Benchmark ]
167- benchmarks = fst . Cabal. ignoreConditions . snd <$>
168- Cabal. condBenchmarks packageDescription
169-
170- gatherBuildInfos :: [Cabal. BuildInfo ]
171- gatherBuildInfos = map Cabal. libBuildInfo library <>
172- map Cabal. libBuildInfo subLibraries <>
173- map Cabal. buildInfo executables <>
174- map Cabal. testBuildInfo testSuites <>
175- map Cabal. benchmarkBuildInfo benchmarks
176-
177- defaultExtensions :: [Language. KnownExtension ]
178- defaultExtensions = map fromEnabled . filter isEnabled $
179- concatMap Cabal. defaultExtensions gatherBuildInfos
180- where isEnabled (Language. EnableExtension _) = True
181- isEnabled _ = False
182-
183- fromEnabled (Language. EnableExtension x) = x
184- fromEnabled x =
185- error $ " Language.Haskell.Stylish.Config.readLanguageExtensions: " <>
186- " invalid LANGUAGE pragma: " <> show x
187- verbose $ " Gathered default-extensions: " <> show defaultExtensions
188- pure $ nub defaultExtensions
189116
190117--------------------------------------------------------------------------------
191118parseConfig :: A. Value -> A. Parser Config
@@ -196,6 +123,7 @@ parseConfig (A.Object o) = do
196123 <*> (o A. .:? " columns" A. .!= 80 )
197124 <*> (o A. .:? " language_extensions" A. .!= [] )
198125 <*> (o A. .:? " newline" >>= parseEnum newlines IO. nativeNewline)
126+ <*> (o A. .:? " cabal" A. .!= True )
199127
200128 -- Then fill in the steps based on the partial config we already have
201129 stepValues <- o A. .: " steps" :: A. Parser [A. Value ]
0 commit comments