Skip to content

Commit efbc3c7

Browse files
committed
Replace hand-formatted generateCabalFile code with PrettyField.
1 parent d711f39 commit efbc3c7

File tree

5 files changed

+314
-222
lines changed

5 files changed

+314
-222
lines changed

Cabal/Distribution/Fields/Pretty.hs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import qualified Text.PrettyPrint as PP
3434

3535
data PrettyField ann
3636
= PrettyField ann FieldName PP.Doc
37+
| PrettyFieldCommentedOut ann FieldName
3738
| PrettySection ann FieldName [PP.Doc] [PrettyField ann]
3839
deriving (Functor, Foldable, Traversable)
3940

@@ -72,6 +73,7 @@ renderFields opts fields = flattenBlocks $ map (renderField opts len) fields
7273

7374
maxNameLength !acc [] = acc
7475
maxNameLength !acc (PrettyField _ name _ : rest) = maxNameLength (max acc (BS.length name)) rest
76+
maxNameLength !acc (PrettyFieldCommentedOut _ _ : rest) = maxNameLength acc rest
7577
maxNameLength !acc (PrettySection {} : rest) = maxNameLength acc rest
7678

7779
-- | Block of lines,
@@ -115,6 +117,12 @@ renderField (Opts rann indent) fw (PrettyField ann name doc) =
115117
narrowStyle :: PP.Style
116118
narrowStyle = PP.style { PP.lineLength = PP.lineLength PP.style - fw }
117119

120+
renderField (Opts rann _) _ (PrettyFieldCommentedOut ann name) =
121+
Block NoMargin NoMargin $ comments ++ fieldLine
122+
where
123+
comments = rann ann
124+
fieldLine = [ "-- " ++ fromUTF8BS name ++ ":" ]
125+
118126
renderField opts@(Opts rann indent) _ (PrettySection ann name args fields) = Block Margin Margin $
119127
rann ann
120128
++

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 formatters
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+
-- Field formatters - 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: 1 addition & 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, maybeToFlag, message )
7171
import Distribution.Client.Init.Types
7272
( InitFlags(..), PackageType(..), Category(..)
7373
, displayPackageType )
@@ -169,10 +169,6 @@ f ?>> g = do
169169
then return ma
170170
else g
171171

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

0 commit comments

Comments
 (0)