From dcc3a02ae55456fec5bd738540165ce22a6d7270 Mon Sep 17 00:00:00 2001 From: jgotoh <18658140+jgotoh@users.noreply.github.com> Date: Thu, 30 Nov 2023 16:46:18 +0100 Subject: [PATCH] Add Parsec instances for PackageDescription fields --- Cabal/src/Distribution/Simple/Compiler.hs | 19 +++++++++++++ Cabal/src/Distribution/Types/DumpBuildInfo.hs | 12 +++++++++ .../Client/ProjectConfig/FieldGrammar.hs | 27 ++++++++++--------- 3 files changed, 45 insertions(+), 13 deletions(-) diff --git a/Cabal/src/Distribution/Simple/Compiler.hs b/Cabal/src/Distribution/Simple/Compiler.hs index 62e49477732..160ac195379 100644 --- a/Cabal/src/Distribution/Simple/Compiler.hs +++ b/Cabal/src/Distribution/Simple/Compiler.hs @@ -78,6 +78,7 @@ module Distribution.Simple.Compiler ) where import Distribution.Compat.Prelude +import Distribution.Parsec import Distribution.Pretty import Prelude () @@ -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 @@ -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 @@ -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 = diff --git a/Cabal/src/Distribution/Types/DumpBuildInfo.hs b/Cabal/src/Distribution/Types/DumpBuildInfo.hs index 2b3dae8888f..3133fc0e1a7 100644 --- a/Cabal/src/Distribution/Types/DumpBuildInfo.hs +++ b/Cabal/src/Distribution/Types/DumpBuildInfo.hs @@ -6,6 +6,7 @@ module Distribution.Types.DumpBuildInfo ) where import Distribution.Compat.Prelude +import Distribution.Parsec data DumpBuildInfo = NoDumpBuildInfo @@ -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 diff --git a/cabal-install/src/Distribution/Client/ProjectConfig/FieldGrammar.hs b/cabal-install/src/Distribution/Client/ProjectConfig/FieldGrammar.hs index d45d9d07ffb..fa0c34b2fa4 100644 --- a/cabal-install/src/Distribution/Client/ProjectConfig/FieldGrammar.hs +++ b/cabal-install/src/Distribution/Client/ProjectConfig/FieldGrammar.hs @@ -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 = @@ -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 @@ -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