Skip to content

Commit 10051c3

Browse files
m-renaudphadej
authored andcommitted
Replace hand-formatted generateCabalFile code with PrettyField.
1 parent 4ca3e08 commit 10051c3

File tree

9 files changed

+483
-305
lines changed

9 files changed

+483
-305
lines changed

Cabal/Distribution/Fields/Pretty.hs

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -45,11 +45,21 @@ data PrettyField ann
4545
-- between comment lines.
4646
--
4747
showFields :: (ann -> [String]) -> [PrettyField ann] -> String
48-
showFields rann = showFields' rann 4
48+
showFields rann = showFields' rann (const id) 4
4949

5050
-- | 'showFields' with user specified indentation.
51-
showFields' :: (ann -> [String]) -> Int -> [PrettyField ann] -> String
52-
showFields' rann n = unlines . renderFields (Opts rann indent) where
51+
showFields'
52+
:: (ann -> [String])
53+
-- ^ Convert an annotation to lined to preceed the field or section.
54+
-> (ann -> [String] -> [String])
55+
-- ^ Post-process non-annotation produced lines.
56+
-> Int
57+
-- ^ Indentation level.
58+
-> [PrettyField ann]
59+
-- ^ Fields/sections to show.
60+
-> String
61+
showFields' rann post n = unlines . renderFields (Opts rann indent post)
62+
where
5363
-- few hardcoded, "unrolled" variants.
5464
indent | n == 4 = indent4
5565
| n == 2 = indent2
@@ -63,7 +73,11 @@ showFields' rann n = unlines . renderFields (Opts rann indent) where
6373
indent2 [] = []
6474
indent2 xs = ' ' : ' ' : xs
6575

66-
data Opts ann = Opts (ann -> [String]) (String -> String)
76+
data Opts ann = Opts
77+
{ _optAnnotation ::(ann -> [String])
78+
, _optIndent ::(String -> String)
79+
, _optPostprocess :: ann -> [String] -> [String]
80+
}
6781

6882
renderFields :: Opts ann -> [PrettyField ann] -> [String]
6983
renderFields opts fields = flattenBlocks $ map (renderField opts len) fields
@@ -97,8 +111,8 @@ flattenBlocks = go0 where
97111
| otherwise = id
98112

99113
renderField :: Opts ann -> Int -> PrettyField ann -> Block
100-
renderField (Opts rann indent) fw (PrettyField ann name doc) =
101-
Block before after $ comments ++ lines'
114+
renderField (Opts rann indent post) fw (PrettyField ann name doc) =
115+
Block before after $ comments ++ post ann lines'
102116
where
103117
comments = rann ann
104118
before = if null comments then NoMargin else Margin
@@ -115,10 +129,10 @@ renderField (Opts rann indent) fw (PrettyField ann name doc) =
115129
narrowStyle :: PP.Style
116130
narrowStyle = PP.style { PP.lineLength = PP.lineLength PP.style - fw }
117131

118-
renderField opts@(Opts rann indent) _ (PrettySection ann name args fields) = Block Margin Margin $
132+
renderField opts@(Opts rann indent post) _ (PrettySection ann name args fields) = Block Margin Margin $
119133
rann ann
120-
++
121-
[ PP.render $ PP.hsep $ PP.text (fromUTF8BS name) : args ]
134+
++
135+
post ann [ PP.render $ PP.hsep $ PP.text (fromUTF8BS name) : args ]
122136
++
123137
(map indent $ renderFields opts fields)
124138

Cabal/Distribution/PackageDescription/FieldGrammar.hs

Lines changed: 42 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,14 @@ module Distribution.PackageDescription.FieldGrammar (
2424
benchmarkFieldGrammar,
2525
validateBenchmark,
2626
unvalidateBenchmark,
27+
-- * Field grammars
28+
formatDependencyList,
29+
formatExposedModules,
30+
formatExtraSourceFiles,
31+
formatHsSourceDirs,
32+
formatMixinList,
33+
formatOtherExtensions,
34+
formatOtherModules,
2735
-- ** Lenses
2836
benchmarkStanzaBenchmarkType,
2937
benchmarkStanzaMainIs,
@@ -41,6 +49,7 @@ module Distribution.PackageDescription.FieldGrammar (
4149

4250
import Distribution.Compat.Lens
4351
import Distribution.Compat.Prelude
52+
import Language.Haskell.Extension
4453
import Prelude ()
4554

4655
import Distribution.CabalSpecVersion
@@ -57,6 +66,7 @@ import Distribution.Types.ExecutableScope
5766
import Distribution.Types.ForeignLib
5867
import Distribution.Types.ForeignLibType
5968
import Distribution.Types.LibraryVisibility
69+
import Distribution.Types.Mixin
6070
import Distribution.Types.UnqualComponentName
6171

6272
import qualified Distribution.SPDX as SPDX
@@ -100,7 +110,7 @@ packageDescriptionFieldGrammar = PackageDescription
100110
-- * Files
101111
<*> monoidalFieldAla "data-files" (alaList' VCat FilePathNT) L.dataFiles
102112
<*> optionalFieldDefAla "data-dir" FilePathNT L.dataDir ""
103-
<*> monoidalFieldAla "extra-source-files" (alaList' VCat FilePathNT) L.extraSrcFiles
113+
<*> monoidalFieldAla "extra-source-files" formatExtraSourceFiles L.extraSrcFiles
104114
<*> monoidalFieldAla "extra-tmp-files" (alaList' VCat FilePathNT) L.extraTmpFiles
105115
<*> monoidalFieldAla "extra-doc-files" (alaList' VCat FilePathNT) L.extraDocFiles
106116
where
@@ -125,7 +135,7 @@ libraryFieldGrammar
125135
=> LibraryName
126136
-> g Library Library
127137
libraryFieldGrammar n = Library n
128-
<$> monoidalFieldAla "exposed-modules" (alaList' VCat MQuoted) L.exposedModules
138+
<$> monoidalFieldAla "exposed-modules" formatExposedModules L.exposedModules
129139
<*> monoidalFieldAla "reexported-modules" (alaList CommaVCat) L.reexportedModules
130140
<*> monoidalFieldAla "signatures" (alaList' VCat MQuoted) L.signatures
131141
^^^ availableSince CabalSpecV2_0 []
@@ -408,14 +418,14 @@ buildInfoFieldGrammar = BuildInfo
408418
^^^ availableSince CabalSpecV2_2 []
409419
<*> monoidalFieldAla "js-sources" (alaList' VCat FilePathNT) L.jsSources
410420
<*> hsSourceDirsGrammar
411-
<*> monoidalFieldAla "other-modules" (alaList' VCat MQuoted) L.otherModules
421+
<*> monoidalFieldAla "other-modules" formatOtherModules L.otherModules
412422
<*> monoidalFieldAla "virtual-modules" (alaList' VCat MQuoted) L.virtualModules
413423
^^^ availableSince CabalSpecV2_2 []
414424
<*> monoidalFieldAla "autogen-modules" (alaList' VCat MQuoted) L.autogenModules
415425
<*> optionalFieldAla "default-language" MQuoted L.defaultLanguage
416426
<*> monoidalFieldAla "other-languages" (alaList' FSep MQuoted) L.otherLanguages
417427
<*> monoidalFieldAla "default-extensions" (alaList' FSep MQuoted) L.defaultExtensions
418-
<*> monoidalFieldAla "other-extensions" (alaList' FSep MQuoted) L.otherExtensions
428+
<*> monoidalFieldAla "other-extensions" formatOtherExtensions L.otherExtensions
419429
<*> monoidalFieldAla "extensions" (alaList' FSep MQuoted) L.oldExtensions
420430
^^^ deprecatedSince CabalSpecV1_12
421431
"Please use 'default-extensions' or 'other-extensions' fields."
@@ -438,8 +448,8 @@ buildInfoFieldGrammar = BuildInfo
438448
<*> sharedOptionsFieldGrammar
439449
<*> pure mempty -- static-options ???
440450
<*> prefixedFields "x-" L.customFieldsBI
441-
<*> monoidalFieldAla "build-depends" (alaList CommaVCat) L.targetBuildDepends
442-
<*> monoidalFieldAla "mixins" (alaList CommaVCat) L.mixins
451+
<*> monoidalFieldAla "build-depends" formatDependencyList L.targetBuildDepends
452+
<*> monoidalFieldAla "mixins" formatMixinList L.mixins
443453
^^^ availableSince CabalSpecV2_0 []
444454
{-# SPECIALIZE buildInfoFieldGrammar :: ParsecFieldGrammar' BuildInfo #-}
445455
{-# SPECIALIZE buildInfoFieldGrammar :: PrettyFieldGrammar' BuildInfo #-}
@@ -448,7 +458,7 @@ hsSourceDirsGrammar
448458
:: (FieldGrammar g, Applicative (g BuildInfo))
449459
=> g BuildInfo [FilePath]
450460
hsSourceDirsGrammar = (++)
451-
<$> monoidalFieldAla "hs-source-dirs" (alaList' FSep FilePathNT) L.hsSourceDirs
461+
<$> monoidalFieldAla "hs-source-dirs" formatHsSourceDirs L.hsSourceDirs
452462
<*> monoidalFieldAla "hs-source-dir" (alaList' FSep FilePathNT) wrongLens
453463
--- https://github.com/haskell/cabal/commit/49e3cdae3bdf21b017ccd42e66670ca402e22b44
454464
^^^ deprecatedSince CabalSpecV1_2 "Please use 'hs-source-dirs'"
@@ -542,3 +552,28 @@ setupBInfoFieldGrammar def = flip SetupBuildInfo def
542552
<$> monoidalFieldAla "setup-depends" (alaList CommaVCat) L.setupDepends
543553
{-# SPECIALIZE setupBInfoFieldGrammar :: Bool -> ParsecFieldGrammar' SetupBuildInfo #-}
544554
{-# SPECIALIZE setupBInfoFieldGrammar :: Bool ->PrettyFieldGrammar' SetupBuildInfo #-}
555+
556+
-------------------------------------------------------------------------------
557+
-- Define how field values should be formatted for 'pretty'.
558+
-------------------------------------------------------------------------------
559+
560+
formatDependencyList :: [Dependency] -> List CommaVCat (Identity Dependency) Dependency
561+
formatDependencyList = alaList CommaVCat
562+
563+
formatMixinList :: [Mixin] -> List CommaVCat (Identity Mixin) Mixin
564+
formatMixinList = alaList CommaVCat
565+
566+
formatExtraSourceFiles :: [FilePath] -> List VCat FilePathNT FilePath
567+
formatExtraSourceFiles = alaList' VCat FilePathNT
568+
569+
formatExposedModules :: [ModuleName] -> List VCat (MQuoted ModuleName) ModuleName
570+
formatExposedModules = alaList' VCat MQuoted
571+
572+
formatHsSourceDirs :: [FilePath] -> List FSep FilePathNT FilePath
573+
formatHsSourceDirs = alaList' FSep FilePathNT
574+
575+
formatOtherExtensions :: [Extension] -> List FSep (MQuoted Extension) Extension
576+
formatOtherExtensions = alaList' FSep MQuoted
577+
578+
formatOtherModules :: [ModuleName] -> List VCat (MQuoted ModuleName) ModuleName
579+
formatOtherModules = alaList' VCat MQuoted

cabal-install/Distribution/Client/Init/Command.hs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ import Distribution.Client.Init.Prompt
6767
( prompt, promptYesNo, promptStr, promptList, maybePrompt
6868
, promptListOptional )
6969
import Distribution.Client.Init.Utils
70-
( eligibleForTestSuite, message )
70+
( eligibleForTestSuite, message )
7171
import Distribution.Client.Init.Types
7272
( InitFlags(..), PackageType(..), Category(..)
7373
, displayPackageType )
@@ -76,6 +76,8 @@ import Distribution.Client.Init.Heuristics
7676
SourceFileEntry(..),
7777
scanForModules, neededBuildPrograms )
7878

79+
import Distribution.Simple.Flag
80+
( maybeToFlag )
7981
import Distribution.Simple.Setup
8082
( Flag(..), flagToMaybe )
8183
import Distribution.Simple.Configure
@@ -169,10 +171,6 @@ f ?>> g = do
169171
then return ma
170172
else g
171173

172-
-- | Witness the isomorphism between Maybe and Flag.
173-
maybeToFlag :: Maybe a -> Flag a
174-
maybeToFlag = maybe NoFlag Flag
175-
176174
-- | Ask if a simple project with sensible defaults should be created.
177175
getSimpleProject :: InitFlags -> IO InitFlags
178176
getSimpleProject flags = do

0 commit comments

Comments
 (0)