Skip to content

Commit

Permalink
Add Parsec instances for PackageDescription fields
Browse files Browse the repository at this point in the history
  • Loading branch information
jgotoh committed Nov 30, 2023
1 parent 1dd0419 commit dcc3a02
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 13 deletions.
19 changes: 19 additions & 0 deletions Cabal/src/Distribution/Simple/Compiler.hs
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@ module Distribution.Simple.Compiler
) where

import Distribution.Compat.Prelude
import Distribution.Parsec
import Distribution.Pretty
import Prelude ()

Expand Down Expand Up @@ -243,6 +244,12 @@ data OptimisationLevel
instance Binary OptimisationLevel
instance Structured OptimisationLevel

instance Parsec OptimisationLevel where
parsec = parsecOptimisationLevel

parsecOptimisationLevel :: CabalParsing m => m OptimisationLevel
parsecOptimisationLevel = flagToOptimisationLevel <$> pure <$> parsecToken

flagToOptimisationLevel :: Maybe String -> OptimisationLevel
flagToOptimisationLevel Nothing = NormalOptimisation
flagToOptimisationLevel (Just s) = case reads s of
Expand Down Expand Up @@ -276,6 +283,12 @@ data DebugInfoLevel
instance Binary DebugInfoLevel
instance Structured DebugInfoLevel

instance Parsec DebugInfoLevel where
parsec = parsecDebugInfoLevel

parsecDebugInfoLevel :: CabalParsing m => m DebugInfoLevel
parsecDebugInfoLevel = flagToDebugInfoLevel <$> pure <$> parsecToken

flagToDebugInfoLevel :: Maybe String -> DebugInfoLevel
flagToDebugInfoLevel Nothing = NormalDebugInfo
flagToDebugInfoLevel (Just s) = case reads s of
Expand Down Expand Up @@ -470,6 +483,12 @@ data ProfDetailLevel
instance Binary ProfDetailLevel
instance Structured ProfDetailLevel

instance Parsec ProfDetailLevel where
parsec = parsecProfDetailLevel

parsecProfDetailLevel :: CabalParsing m => m ProfDetailLevel
parsecProfDetailLevel = flagToProfDetailLevel <$> parsecToken

flagToProfDetailLevel :: String -> ProfDetailLevel
flagToProfDetailLevel "" = ProfDetailDefault
flagToProfDetailLevel s =
Expand Down
12 changes: 12 additions & 0 deletions Cabal/src/Distribution/Types/DumpBuildInfo.hs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ module Distribution.Types.DumpBuildInfo
) where

import Distribution.Compat.Prelude
import Distribution.Parsec

data DumpBuildInfo
= NoDumpBuildInfo
Expand All @@ -14,3 +15,14 @@ data DumpBuildInfo

instance Binary DumpBuildInfo
instance Structured DumpBuildInfo

instance Parsec DumpBuildInfo where
parsec = parsecDumpBuildInfo

parsecDumpBuildInfo :: CabalParsing m => m DumpBuildInfo
parsecDumpBuildInfo = boolToDumpBuildInfo <$> parsec

boolToDumpBuildInfo :: Bool -> DumpBuildInfo
boolToDumpBuildInfo bool = case bool of
True -> DumpBuildInfo
_ -> NoDumpBuildInfo
27 changes: 14 additions & 13 deletions cabal-install/src/Distribution/Client/ProjectConfig/FieldGrammar.hs
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import Distribution.Verbosity
-- TODO check usages of monoidalField: "Field which can be define multiple times, and the results are mappended."
-- I've used it often for fields that should not be appended if defined multiple times, basically any field that is not a list
-- I expect I can just use optionalFieldDef/Ala in these cases, see optionalFieldDefAla "haddock-css"
-- TODO check if ^^^ availableSince can be used in some of the fields (see FieldGrammar of PackageDescription)

projectConfigFieldGrammar :: FilePath -> ParsecFieldGrammar' ProjectConfig
projectConfigFieldGrammar source =
Expand Down Expand Up @@ -124,7 +125,7 @@ packageConfigFieldGrammar =
<*> optionalFieldDef "executable-profiling" L.packageConfigProfExe mempty
<*> optionalFieldDef "profiling-detail" L.packageConfigProfDetail mempty
<*> optionalFieldDef "library-profiling-detail" L.packageConfigProfLibDetail mempty
<*> monoidalFieldAla "configure-options" (alaList NoCommaFSep) L.packageConfigConfigureArgs
<*> monoidalFieldAla "configure-options" (alaList' NoCommaFSep Token) L.packageConfigConfigureArgs
<*> optionalFieldDef "optimization" L.packageConfigOptimization mempty
<*> optionalFieldDef "program-prefix" L.packageConfigProgPrefix mempty
<*> optionalFieldDef "program-suffix" L.packageConfigProgSuffix mempty
Expand All @@ -147,27 +148,27 @@ packageConfigFieldGrammar =
<*> optionalFieldDef "documentation" L.packageConfigDocumentation mempty
<*> optionalFieldDef "haddock-hoogle" L.packageConfigHaddockHoogle mempty
<*> optionalFieldDef "haddock-html" L.packageConfigHaddockHtml mempty
<*> optionalFieldDef "haddock-html-location-log" L.packageConfigHaddockHtmlLocation mempty
<*> optionalFieldDef "haddock-foreign-libraries" L.packageConfigHaddockForeignLibs mempty
<*> optionalFieldDef "haddock-executables" L.packageConfigHaddockExecutables mempty
<*> optionalFieldDef "haddock-tests" L.packageConfigHaddockTestSuites mempty
<*> optionalFieldDef "haddock-benchmarks" L.packageConfigHaddockBenchmarks mempty
<*> optionalFieldDef "haddock-internal" L.packageConfigHaddockInternal mempty
<*> optionalFieldDefAla "haddock-html-location" (alaFlag Token) L.packageConfigHaddockHtmlLocation mempty -- STRT
<*> optionalFieldDef "haddock-foreign-libraries" L.packageConfigHaddockForeignLibs mempty
<*> optionalFieldDef "haddock-executables" L.packageConfigHaddockExecutables mempty
<*> optionalFieldDef "haddock-tests" L.packageConfigHaddockTestSuites mempty
<*> optionalFieldDef "haddock-benchmarks" L.packageConfigHaddockBenchmarks mempty
<*> optionalFieldDef "haddock-internal" L.packageConfigHaddockInternal mempty
<*> optionalFieldDefAla "haddock-css" (alaFlag FilePathNT) L.packageConfigHaddockCss mempty
<*> optionalFieldDef "haddock-hyperlink-source" L.packageConfigHaddockLinkedSource mempty
<*> optionalFieldDef "haddock-quickjump" L.packageConfigHaddockQuickJump mempty
<*> optionalFieldDef "haddock-hyperlink-source" L.packageConfigHaddockLinkedSource mempty
<*> optionalFieldDef "haddock-quickjump" L.packageConfigHaddockQuickJump mempty
<*> optionalFieldDefAla "haddock-hscolour-css" (alaFlag FilePathNT) L.packageConfigHaddockHscolourCss mempty
<*> optionalFieldDef "haddock-contents-location" L.packageConfigHaddockContents mempty
<*> optionalFieldDef "haddock-index-location" L.packageConfigHaddockIndex mempty
<*> optionalFieldDef "haddock-base-url" L.packageConfigHaddockBaseUrl mempty
<*> optionalFieldDef "haddock-lib" L.packageConfigHaddockLib mempty
<*> optionalFieldDefAla "haddock-base-url" (alaFlag Token) L.packageConfigHaddockBaseUrl mempty
<*> optionalFieldDefAla "haddock-lib" (alaFlag Token) L.packageConfigHaddockLib mempty
<*> optionalFieldDefAla "haddock-output-dir" (alaFlag FilePathNT) L.packageConfigHaddockOutputDir mempty
<*> optionalFieldDef "haddock-for-hackage" L.packageConfigHaddockForHackage mempty
<*> optionalFieldDef "human-log" L.packageConfigTestHumanLog mempty
<*> optionalFieldDef "machine-log" L.packageConfigTestMachineLog mempty
<*> optionalFieldDef "test-show-details" L.packageConfigTestShowDetails mempty
<*> optionalFieldDef "test-keep-tix-files" L.packageConfigTestKeepTix mempty
<*> optionalFieldDef "test-keep-tix-files" L.packageConfigTestKeepTix mempty
<*> optionalFieldDefAla "test-wrapper" (alaFlag FilePathNT) L.packageConfigTestWrapper mempty
<*> optionalFieldDef "test-fail-when-no-test-suites" L.packageConfigTestFailWhenNoTestSuites mempty
<*> optionalFieldDef "test-fail-when-no-test-suites" L.packageConfigTestFailWhenNoTestSuites mempty
<*> monoidalFieldAla "test-options" (alaList NoCommaFSep) L.packageConfigTestTestOptions
<*> monoidalFieldAla "benchmark-options" (alaList NoCommaFSep) L.packageConfigBenchmarkOptions

0 comments on commit dcc3a02

Please sign in to comment.