packages feed

cabal-gild 1.5.0.2 → 1.5.0.3

raw patch · 15 files changed

+353/−272 lines, 15 files

Files

cabal-gild.cabal view
@@ -11,7 +11,7 @@ maintainer: Taylor Fausak name: cabal-gild synopsis: Formats package descriptions.-version: 1.5.0.2+version: 1.5.0.3  source-repository head   type: git@@ -109,23 +109,16 @@     CabalGild.Unstable.Type.Context     CabalGild.Unstable.Type.Dependency     CabalGild.Unstable.Type.DiscoverTarget-    CabalGild.Unstable.Type.ExeDependency     CabalGild.Unstable.Type.Extension     CabalGild.Unstable.Type.Flag-    CabalGild.Unstable.Type.ForeignLibOption     CabalGild.Unstable.Type.Input-    CabalGild.Unstable.Type.Language-    CabalGild.Unstable.Type.LegacyExeDependency     CabalGild.Unstable.Type.Leniency     CabalGild.Unstable.Type.Line     CabalGild.Unstable.Type.List     CabalGild.Unstable.Type.Mixin     CabalGild.Unstable.Type.Mode-    CabalGild.Unstable.Type.ModuleReexport     CabalGild.Unstable.Type.Optional     CabalGild.Unstable.Type.Output-    CabalGild.Unstable.Type.PkgconfigDependency-    CabalGild.Unstable.Type.PkgconfigVersionRange     CabalGild.Unstable.Type.Pragma     CabalGild.Unstable.Type.Set     CabalGild.Unstable.Type.SomeParsecParser
source/library/CabalGild/Unstable/Action/FormatFields.hs view
@@ -8,14 +8,8 @@ import qualified CabalGild.Unstable.Extra.String as String import qualified CabalGild.Unstable.Type.Condition as Condition import qualified CabalGild.Unstable.Type.Dependency as Dependency-import qualified CabalGild.Unstable.Type.ExeDependency as ExeDependency import qualified CabalGild.Unstable.Type.Extension as Extension-import qualified CabalGild.Unstable.Type.ForeignLibOption as ForeignLibOption-import qualified CabalGild.Unstable.Type.Language as Language-import qualified CabalGild.Unstable.Type.LegacyExeDependency as LegacyExeDependency import qualified CabalGild.Unstable.Type.Mixin as Mixin-import qualified CabalGild.Unstable.Type.ModuleReexport as ModuleReexport-import qualified CabalGild.Unstable.Type.PkgconfigDependency as PkgconfigDependency import qualified CabalGild.Unstable.Type.SomeParsecParser as SPP import qualified CabalGild.Unstable.Type.TestedWith as TestedWith import qualified CabalGild.Unstable.Type.Variable as Variable@@ -29,6 +23,12 @@ import qualified Distribution.ModuleName as ModuleName import qualified Distribution.Parsec as Parsec import qualified Distribution.Parsec.FieldLineStream as FieldLineStream+import qualified Distribution.Types.ExeDependency as ExeDependency+import qualified Distribution.Types.ForeignLibOption as ForeignLibOption+import qualified Distribution.Types.LegacyExeDependency as LegacyExeDependency+import qualified Distribution.Types.ModuleReexport as ModuleReexport+import qualified Distribution.Types.PkgconfigDependency as PkgconfigDependency+import qualified Language.Haskell.Extension as Haskell import qualified Text.PrettyPrint as PrettyPrint  -- | A wrapper around 'field' to allow this to be composed with other actions.@@ -193,7 +193,7 @@           "mixins" =: SPP.set @Newtypes.CommaVCat @(Identity.Identity Mixin.Mixin),           "options" =: SPP.set @Newtypes.FSep @(Identity.Identity ForeignLibOption.ForeignLibOption),           "other-extensions" =: SPP.set @Newtypes.FSep @(Newtypes.MQuoted Extension.Extension),-          "other-languages" =: SPP.set @Newtypes.FSep @(Newtypes.MQuoted Language.Language),+          "other-languages" =: SPP.set @Newtypes.FSep @(Newtypes.MQuoted Haskell.Language),           "other-modules" =: SPP.set @Newtypes.VCat @(Newtypes.MQuoted ModuleName.ModuleName),           "pkgconfig-depends" =: SPP.set @Newtypes.CommaFSep @(Identity.Identity PkgconfigDependency.PkgconfigDependency),           "reexported-modules" =: SPP.set @Newtypes.CommaVCat @(Identity.Identity ModuleReexport.ModuleReexport),
source/library/CabalGild/Unstable/Extra/CharParsing.hs view
@@ -3,6 +3,10 @@ import qualified Distribution.Compat.CharParsing as Parse import qualified Distribution.Parsec as Parsec +-- | Wraps the given parser in curly braces.+braces :: (Parsec.CabalParsing m) => m a -> m a+braces = Parse.between (token "{") (token "}")+ -- | Wraps the given parser in parentheses. parens :: (Parsec.CabalParsing m) => m a -> m a parens = Parse.between (token "(") (token ")")
source/library/CabalGild/Unstable/Type/Dependency.hs view
@@ -1,26 +1,58 @@+{-# LANGUAGE NamedFieldPuns #-}+ module CabalGild.Unstable.Type.Dependency where  import qualified CabalGild.Unstable.Type.VersionRange as VersionRange-import qualified Data.Ord as Ord+import qualified Control.Monad as Monad+import qualified Data.List.NonEmpty as NonEmpty+import qualified Distribution.CabalSpecVersion as CabalSpecVersion+import qualified Distribution.Compat.CharParsing as Parse import qualified Distribution.Parsec as Parsec import qualified Distribution.Pretty as Pretty-import qualified Distribution.Types.Dependency as Dependency+import qualified Distribution.Types.PackageName as PackageName+import qualified Distribution.Types.UnqualComponentName as UnqualComponentName+import qualified Text.PrettyPrint as PrettyPrint --- | This type exists to provide an 'Ord' instance for--- 'Dependency.Dependency', which was added in @Cabal-syntax-3.10.1.0@.-newtype Dependency = Dependency-  { unwrap :: Dependency.Dependency+data Dependency = MkDependency+  { packageName :: PackageName.PackageName,+    libraryNames :: Maybe (Either UnqualComponentName.UnqualComponentName (NonEmpty.NonEmpty UnqualComponentName.UnqualComponentName)),+    versionRange :: Maybe VersionRange.VersionRange   }-  deriving (Eq, Show)--instance Ord Dependency where-  compare =-    Ord.comparing $-      (\(Dependency.Dependency pn vr lns) -> (pn, VersionRange.fromVersionRange vr, lns))-        . unwrap+  deriving (Eq, Ord, Show)  instance Parsec.Parsec Dependency where-  parsec = Dependency <$> Parsec.parsec+  parsec = do+    packageName <- Parsec.parsec+    libraryNames <- Parse.optional $ do+      Monad.void $ Parse.char ':'+      csv <- Parsec.askCabalSpecVersion+      Monad.guard $ csv >= CabalSpecVersion.CabalSpecV3_0+      Monad.msum+        [ Left <$> Parsec.parsec,+          Right+            <$> Parse.between+              (Parse.char '{' *> Parse.spaces)+              (Parse.spaces <* Parse.char '}')+              (Parsec.parsecCommaNonEmpty Parsec.parsec)+        ]+    Parse.spaces+    versionRange <- Parse.optional Parsec.parsec+    pure MkDependency {packageName, libraryNames, versionRange}  instance Pretty.Pretty Dependency where-  pretty = Pretty.pretty . unwrap+  pretty dependency =+    let pkg = Pretty.pretty $ packageName dependency+        libs = case libraryNames dependency of+          Nothing -> mempty+          Just e ->+            PrettyPrint.char ':' <> case e of+              Left ucn -> Pretty.pretty ucn+              Right ucns ->+                PrettyPrint.braces+                  . PrettyPrint.hsep+                  . PrettyPrint.punctuate PrettyPrint.comma+                  . fmap Pretty.pretty+                  . NonEmpty.toList+                  $ NonEmpty.sort ucns+        ver = foldMap Pretty.pretty $ versionRange dependency+     in PrettyPrint.hsep [pkg <> libs, ver]
− source/library/CabalGild/Unstable/Type/ExeDependency.hs
@@ -1,26 +0,0 @@-module CabalGild.Unstable.Type.ExeDependency where--import qualified CabalGild.Unstable.Type.VersionRange as VersionRange-import qualified Data.Ord as Ord-import qualified Distribution.Parsec as Parsec-import qualified Distribution.Pretty as Pretty-import qualified Distribution.Types.ExeDependency as ExeDependency---- | This type exists to provide an 'Ord' instance for--- 'ExeDependency.ExeDependency', which was added in @Cabal-syntax-3.10.1.0@.-newtype ExeDependency = ExeDependency-  { unwrap :: ExeDependency.ExeDependency-  }-  deriving (Eq, Show)--instance Ord ExeDependency where-  compare =-    Ord.comparing $-      (\(ExeDependency.ExeDependency pn ucn vr) -> (pn, ucn, VersionRange.fromVersionRange vr))-        . unwrap--instance Parsec.Parsec ExeDependency where-  parsec = ExeDependency <$> Parsec.parsec--instance Pretty.Pretty ExeDependency where-  pretty = Pretty.pretty . unwrap
− source/library/CabalGild/Unstable/Type/ForeignLibOption.hs
@@ -1,23 +0,0 @@-module CabalGild.Unstable.Type.ForeignLibOption where--import qualified Data.Ord as Ord-import qualified Distribution.Parsec as Parsec-import qualified Distribution.Pretty as Pretty-import qualified Distribution.Types.ForeignLibOption as ForeignLibOption---- | This type exists to provide an 'Ord' instance for--- 'ForeignLibOption.ForeignLibOption', which was added in--- @Cabal-syntax-3.10.1.0@.-newtype ForeignLibOption = ForeignLibOption-  { unwrap :: ForeignLibOption.ForeignLibOption-  }-  deriving (Eq, Show)--instance Ord ForeignLibOption where-  compare = Ord.comparing Pretty.prettyShow--instance Parsec.Parsec ForeignLibOption where-  parsec = ForeignLibOption <$> Parsec.parsec--instance Pretty.Pretty ForeignLibOption where-  pretty = Pretty.pretty . unwrap
− source/library/CabalGild/Unstable/Type/Language.hs
@@ -1,22 +0,0 @@-module CabalGild.Unstable.Type.Language where--import qualified Data.Ord as Ord-import qualified Distribution.Parsec as Parsec-import qualified Distribution.Pretty as Pretty-import qualified Language.Haskell.Extension as Extension---- | This type exists to provide an 'Ord' instance for--- 'Language.Language', which was added in @Cabal-syntax-3.10.1.0@.-newtype Language = Language-  { unwrap :: Extension.Language-  }-  deriving (Eq, Show)--instance Ord Language where-  compare = Ord.comparing Pretty.prettyShow--instance Parsec.Parsec Language where-  parsec = Language <$> Parsec.parsec--instance Pretty.Pretty Language where-  pretty = Pretty.pretty . unwrap
− source/library/CabalGild/Unstable/Type/LegacyExeDependency.hs
@@ -1,27 +0,0 @@-module CabalGild.Unstable.Type.LegacyExeDependency where--import qualified CabalGild.Unstable.Type.VersionRange as VersionRange-import qualified Data.Ord as Ord-import qualified Distribution.Parsec as Parsec-import qualified Distribution.Pretty as Pretty-import qualified Distribution.Types.LegacyExeDependency as LegacyExeDependency---- | This type exists to provide an 'Ord' instance for--- 'LegacyExeDependency.LegacyExeDependency', which was added in--- @Cabal-syntax-3.10.1.0@.-newtype LegacyExeDependency = LegacyExeDependency-  { unwrap :: LegacyExeDependency.LegacyExeDependency-  }-  deriving (Eq, Show)--instance Ord LegacyExeDependency where-  compare =-    Ord.comparing $-      (\(LegacyExeDependency.LegacyExeDependency s vr) -> (s, VersionRange.fromVersionRange vr))-        . unwrap--instance Parsec.Parsec LegacyExeDependency where-  parsec = LegacyExeDependency <$> Parsec.parsec--instance Pretty.Pretty LegacyExeDependency where-  pretty = Pretty.pretty . unwrap
− source/library/CabalGild/Unstable/Type/ModuleReexport.hs
@@ -1,25 +0,0 @@-module CabalGild.Unstable.Type.ModuleReexport where--import qualified Data.Ord as Ord-import qualified Distribution.Parsec as Parsec-import qualified Distribution.Pretty as Pretty-import qualified Distribution.Types.ModuleReexport as ModuleReexport---- | This type exists to provide an 'Ord' instance for--- 'ModuleReexport.ModuleReexport', which was added in @Cabal-syntax-3.10.1.0@.-newtype ModuleReexport = ModuleReexport-  { unwrap :: ModuleReexport.ModuleReexport-  }-  deriving (Eq, Show)--instance Ord ModuleReexport where-  compare =-    Ord.comparing $-      (\(ModuleReexport.ModuleReexport mpn mn1 mn2) -> (mpn, mn1, mn2))-        . unwrap--instance Parsec.Parsec ModuleReexport where-  parsec = ModuleReexport <$> Parsec.parsec--instance Pretty.Pretty ModuleReexport where-  pretty = Pretty.pretty . unwrap
− source/library/CabalGild/Unstable/Type/PkgconfigDependency.hs
@@ -1,27 +0,0 @@-module CabalGild.Unstable.Type.PkgconfigDependency where--import qualified CabalGild.Unstable.Type.PkgconfigVersionRange as PkgconfigVersionRange-import qualified Data.Ord as Ord-import qualified Distribution.Parsec as Parsec-import qualified Distribution.Pretty as Pretty-import qualified Distribution.Types.PkgconfigDependency as PkgconfigDependency---- | This type exists to provide an 'Ord' instance for--- 'PkgconfigDependency.PkgconfigDependency', which was added in--- @Cabal-syntax-3.10.1.0@.-newtype PkgconfigDependency = PkgconfigDependency-  { unwrap :: PkgconfigDependency.PkgconfigDependency-  }-  deriving (Eq, Show)--instance Ord PkgconfigDependency where-  compare =-    Ord.comparing $-      (\(PkgconfigDependency.PkgconfigDependency pn pvr) -> (pn, PkgconfigVersionRange.PkgconfigVersionRange pvr))-        . unwrap--instance Parsec.Parsec PkgconfigDependency where-  parsec = PkgconfigDependency <$> Parsec.parsec--instance Pretty.Pretty PkgconfigDependency where-  pretty = Pretty.pretty . unwrap
− source/library/CabalGild/Unstable/Type/PkgconfigVersionRange.hs
@@ -1,27 +0,0 @@-module CabalGild.Unstable.Type.PkgconfigVersionRange where--import qualified CabalGild.Unstable.Type.VersionRange as VersionRange-import qualified Data.Ord as Ord-import qualified Distribution.Parsec as Parsec-import qualified Distribution.Pretty as Pretty-import qualified Distribution.Types.PkgconfigVersionRange as PkgconfigVersionRange---- | This type exists to provide an 'Ord' instance for--- 'PkgconfigVersionRange.PkgconfigVersionRange', which was added in--- @Cabal-syntax-3.10.1.0@.-newtype PkgconfigVersionRange = PkgconfigVersionRange-  { unwrap :: PkgconfigVersionRange.PkgconfigVersionRange-  }-  deriving (Eq, Show)--instance Ord PkgconfigVersionRange where-  compare =-    Ord.comparing $-      VersionRange.fromPkgconfigVersionRange-        . unwrap--instance Parsec.Parsec PkgconfigVersionRange where-  parsec = PkgconfigVersionRange <$> Parsec.parsec--instance Pretty.Pretty PkgconfigVersionRange where-  pretty = Pretty.pretty . unwrap
source/library/CabalGild/Unstable/Type/TestedWith.hs view
@@ -1,32 +1,28 @@ module CabalGild.Unstable.Type.TestedWith where  import qualified CabalGild.Unstable.Type.VersionRange as VersionRange-import qualified Data.Ord as Ord-import qualified Distribution.FieldGrammar.Newtypes as Newtypes+import qualified Distribution.Compat.CharParsing as Parse+import qualified Distribution.Compiler as Compiler import qualified Distribution.Parsec as Parsec import qualified Distribution.Pretty as Pretty+import qualified Text.PrettyPrint as PrettyPrint --- | This type exists to provide an 'Ord' instance for 'Newtypes.TestedWith',--- which was added in @Cabal-syntax-3.10.1.0@.-newtype TestedWith = TestedWith-  { unwrap :: Newtypes.TestedWith+data TestedWith = MkTestedWith+  { compilerFlavor :: Compiler.CompilerFlavor,+    versionRange :: Maybe VersionRange.VersionRange   }--instance Eq TestedWith where-  x == y = compare x y == EQ--instance Ord TestedWith where-  compare =-    Ord.comparing $-      fmap VersionRange.fromVersionRange-        . Newtypes.getTestedWith-        . unwrap+  deriving (Eq, Ord, Show)  instance Parsec.Parsec TestedWith where-  parsec = TestedWith <$> Parsec.parsec+  parsec =+    MkTestedWith+      <$> Parsec.parsec+      <* Parse.spaces+      <*> Parse.optional Parsec.parsec  instance Pretty.Pretty TestedWith where-  pretty = Pretty.pretty . unwrap--instance Show TestedWith where-  show = show . Newtypes.getTestedWith . unwrap+  pretty x =+    PrettyPrint.hsep+      [ Pretty.pretty $ compilerFlavor x,+        foldMap Pretty.pretty $ versionRange x+      ]
source/library/CabalGild/Unstable/Type/Variable.hs view
@@ -1,6 +1,7 @@ module CabalGild.Unstable.Type.Variable where  import qualified CabalGild.Unstable.Extra.CharParsing as Parse+import qualified CabalGild.Unstable.Type.VersionRange as VersionRange import qualified Data.Char as Char import qualified Distribution.Compat.CharParsing as Parse import qualified Distribution.Compiler as Compiler@@ -8,7 +9,6 @@ import qualified Distribution.Pretty as Pretty import qualified Distribution.System as System import qualified Distribution.Types.Flag as Flag-import qualified Distribution.Types.VersionRange as VersionRange import qualified Text.PrettyPrint as PrettyPrint  -- | Similar to 'Distribution.Types.ConfVar.ConfVar', but with different@@ -16,7 +16,7 @@ data Variable   = Arch System.Arch   | Flag Flag.FlagName-  | Impl Compiler.CompilerFlavor VersionRange.VersionRange+  | Impl Compiler.CompilerFlavor (Maybe VersionRange.VersionRange)   | Os System.OS   deriving (Eq, Show) @@ -41,14 +41,14 @@ parseFlag = Parse.token "flag" *> Parse.parens (Parsec.parsec <* Parse.spaces)  -- | Parses an 'Impl'.-parseImpl :: (Parsec.CabalParsing m) => m (Compiler.CompilerFlavor, VersionRange.VersionRange)+parseImpl :: (Parsec.CabalParsing m) => m (Compiler.CompilerFlavor, Maybe VersionRange.VersionRange) parseImpl = do   Parse.token "impl"   Parse.parens $     (,)       <$> Parsec.parsec       <* Parse.spaces-      <*> Parse.option VersionRange.anyVersion Parsec.parsec+      <*> Parse.optional Parsec.parsec       <* Parse.spaces  -- | Parses an 'Os'.@@ -77,7 +77,7 @@         <> PrettyPrint.parens (Pretty.pretty y)     Impl y z ->       PrettyPrint.text "impl"-        <> PrettyPrint.parens (Pretty.pretty y PrettyPrint.<+> Pretty.pretty z)+        <> PrettyPrint.parens (Pretty.pretty y PrettyPrint.<+> foldMap Pretty.pretty z)     Os y ->       PrettyPrint.text "os"         <> PrettyPrint.parens (Pretty.pretty y)
source/library/CabalGild/Unstable/Type/VersionRange.hs view
@@ -1,45 +1,182 @@+{-# LANGUAGE FlexibleInstances #-}+ module CabalGild.Unstable.Type.VersionRange where -import qualified Distribution.Types.PkgconfigVersion as PkgconfigVersion-import qualified Distribution.Types.PkgconfigVersionRange as PkgconfigVersionRange-import qualified Distribution.Types.Version as Version-import qualified Distribution.Types.VersionRange as VersionRange+import qualified CabalGild.Unstable.Extra.CharParsing as Parse+import qualified Data.List.NonEmpty as NonEmpty+import qualified Data.Set as Set+import qualified Distribution.Compat.CharParsing as Parse+import qualified Distribution.Parsec as Parsec+import qualified Distribution.Pretty as Pretty+import qualified Numeric.Natural as Natural+import qualified Text.PrettyPrint as PrettyPrint+import qualified Text.Read as Read --- | This type exists to provide an 'Ord' instance for--- 'VersionRange.VersionRange', which was added in @Cabal-syntax-3.10.1.0@.-data VersionRange a+data Part+  = Numeric Natural.Natural+  | Wildcard+  deriving (Eq, Ord, Show)++parseNumeric :: (Parsec.CabalParsing m) => m Natural.Natural+parseNumeric =+  Parse.choice+    [ parseZero,+      parseNonZero+    ]++parseZero :: (Parsec.CabalParsing m) => m Natural.Natural+parseZero = 0 <$ Parse.token "0"++parseNonZero :: (Parsec.CabalParsing m) => m Natural.Natural+parseNonZero = do+  c <- Parse.satisfy $ \c -> '1' <= c && c <= '9'+  cs <- Parse.many Parse.digit+  let s = c : cs+  case Read.readMaybe s of+    Nothing -> fail $ "invalid Natural: " <> show s+    Just n -> n <$ Parse.spaces++renderNumeric :: Natural.Natural -> PrettyPrint.Doc+renderNumeric = PrettyPrint.text . show++parseWildcard :: (Parsec.CabalParsing m) => m ()+parseWildcard = Parse.token "*"++renderWildcard :: PrettyPrint.Doc+renderWildcard = PrettyPrint.char '*'++parsePart :: (Parsec.CabalParsing m) => m Part+parsePart =+  Parse.choice+    [ Numeric <$> parseNumeric,+      Wildcard <$ parseWildcard+    ]++renderPart :: Part -> PrettyPrint.Doc+renderPart x =+  case x of+    Numeric n -> renderNumeric n+    Wildcard -> renderWildcard++newtype Version+  = MkVersion (NonEmpty.NonEmpty Part)+  deriving (Eq, Ord, Show)++parseVersion :: (Parsec.CabalParsing m) => m Version+parseVersion =+  MkVersion+    <$> Parse.sepByNonEmpty parsePart (Parse.char '.')+    <* Parse.spaces++renderVersion :: Version -> PrettyPrint.Doc+renderVersion (MkVersion parts) =+  mconcat+    . PrettyPrint.punctuate (PrettyPrint.char '.')+    . fmap renderPart+    $ NonEmpty.toList parts++data Versions+  = One Version+  | Set (Set.Set Version)+  deriving (Eq, Ord, Show)++parseVersions :: (Parsec.CabalParsing m) => m Versions+parseVersions =+  Parse.choice+    [ One <$> parseVersion,+      Set . Set.fromList <$> Parse.braces (Parse.sepBy parseVersion $ Parse.token ",")+    ]++renderVersions :: Versions -> PrettyPrint.Doc+renderVersions x =+  case x of+    One v -> renderVersion v+    Set vs ->+      PrettyPrint.braces+        . PrettyPrint.hsep+        . PrettyPrint.punctuate PrettyPrint.comma+        . fmap renderVersion+        $ Set.toAscList vs++data Operator+  = Caret+  | Ge+  | Gt+  | Le+  | Lt+  | Eq+  deriving (Eq, Ord, Show)++parseOperator :: (Parsec.CabalParsing m) => m Operator+parseOperator =+  Parse.choice+    [ Caret <$ Parse.token "^>=",+      Parse.try $ Ge <$ Parse.token ">=",+      Gt <$ Parse.token ">",+      Parse.try $ Le <$ Parse.token "<=",+      Lt <$ Parse.token "<",+      Eq <$ Parse.token "=="+    ]++renderOperator :: Operator -> PrettyPrint.Doc+renderOperator x =+  case x of+    Caret -> PrettyPrint.text "^>="+    Ge -> PrettyPrint.text ">="+    Gt -> PrettyPrint.char '>'+    Le -> PrettyPrint.text "<="+    Lt -> PrettyPrint.char '<'+    Eq -> PrettyPrint.text "=="++data Simple   = Any-  | This a-  | Later a-  | Earlier a-  | Union (VersionRange a) (VersionRange a)-  | Intersect (VersionRange a) (VersionRange a)+  | None+  | Op Operator Versions   deriving (Eq, Ord, Show) --- | Converts a 'PkgconfigVersionRange.PkgconfigVersionRange' into a--- 'VersionRange'. Note that the former is more expressive, so things like--- 'PkgconfigVersionRange.PcOrLaterVersion' will be converted into a 'Union'.-fromPkgconfigVersionRange ::-  PkgconfigVersionRange.PkgconfigVersionRange ->-  VersionRange PkgconfigVersion.PkgconfigVersion-fromPkgconfigVersionRange x = case x of-  PkgconfigVersionRange.PcAnyVersion -> Any-  PkgconfigVersionRange.PcThisVersion v -> This v-  PkgconfigVersionRange.PcLaterVersion v -> Later v-  PkgconfigVersionRange.PcEarlierVersion v -> Earlier v-  PkgconfigVersionRange.PcOrLaterVersion v -> Union (Later v) (This v)-  PkgconfigVersionRange.PcOrEarlierVersion v -> Union (Earlier v) (This v)-  PkgconfigVersionRange.PcUnionVersionRanges v w -> Union (fromPkgconfigVersionRange v) (fromPkgconfigVersionRange w)-  PkgconfigVersionRange.PcIntersectVersionRanges v w -> Intersect (fromPkgconfigVersionRange v) (fromPkgconfigVersionRange w)+parseSimple :: (Parsec.CabalParsing m) => m Simple+parseSimple =+  Parse.choice+    [ Parse.try $ Any <$ Parse.token "-any",+      None <$ Parse.token "-none",+      Op <$> parseOperator <*> parseVersions+    ] --- | Converts a 'VersionRange.VersionRange' into a 'VersionRange'. These are--- isomorphic, so no information is lost.-fromVersionRange :: VersionRange.VersionRange -> VersionRange Version.Version-fromVersionRange =-  VersionRange.foldVersionRange-    Any-    This-    Later-    Earlier-    Union-    Intersect+renderSimple :: Simple -> PrettyPrint.Doc+renderSimple x =+  case x of+    Any -> PrettyPrint.text "-any"+    None -> PrettyPrint.text "-none"+    Op o vs -> renderOperator o <> renderVersions vs++data Complex a+  = Par (Complex a)+  | And a (Complex a)+  | Or a (Complex a)+  | Simple a+  deriving (Eq, Ord, Show)++parseComplex :: (Parsec.CabalParsing m) => m a -> m (Complex a)+parseComplex p =+  Parse.choice+    [ Par <$> Parse.parens (parseComplex p),+      Parse.try $ And <$> p <* Parse.token "&&" <*> parseComplex p,+      Parse.try $ Or <$> p <* Parse.token "||" <*> parseComplex p,+      Simple <$> p+    ]++renderComplex :: (a -> PrettyPrint.Doc) -> Complex a -> PrettyPrint.Doc+renderComplex f x =+  case x of+    Par y -> PrettyPrint.parens $ renderComplex f y+    And l r -> PrettyPrint.hsep [f l, PrettyPrint.text "&&", renderComplex f r]+    Or l r -> PrettyPrint.hsep [f l, PrettyPrint.text "||", renderComplex f r]+    Simple y -> f y++type VersionRange = Complex Simple++instance Parsec.Parsec VersionRange where+  parsec = parseComplex parseSimple++instance Pretty.Pretty VersionRange where+  pretty = renderComplex renderSimple
source/test-suite/Main.hs view
@@ -635,8 +635,13 @@     Hspec.it "formats impl without version range" $ do       expectGilded         "if impl ( ghc )"-        "if impl(ghc >=0)\n"+        "if impl(ghc)\n" +    Hspec.it "formats complex impl version range" $ do+      expectGilded+        "if impl ( ghc > 8 && < 9 )"+        "if impl(ghc >8 && <9)\n"+     Hspec.it "formats os" $ do       expectGilded         "if os ( osx )"@@ -737,6 +742,11 @@       "tested-with: GHC == 9.8.1 , GHC == 9.6.4"       "tested-with:\n  ghc ==9.6.4\n  ghc ==9.8.1\n" +  Hspec.it "formats complex tested-with version range" $ do+    expectGilded+      "tested-with: GHC > 8 && < 9"+      "tested-with: ghc >8 && <9\n"+   Hspec.it "sorts data-files" $ do     expectGilded       "data-files: g f"@@ -1564,6 +1574,92 @@       (".", [["Setup.hs"], ["source", "Example.hs"]])       "-- cabal-gild: discover source\nexposed-modules:"       "-- cabal-gild: discover source\nexposed-modules: Example\n"++  Hspec.it "keeps an explicit sub-library name" $ do+    expectGilded+      "cabal-version: 3.0\nbuild-depends: x:x"+      "cabal-version: 3.0\nbuild-depends: x:x\n"++  Hspec.it "keeps a singleton set of sub-library names" $ do+    expectGilded+      "cabal-version: 3.0\nbuild-depends: x:{ x }"+      "cabal-version: 3.0\nbuild-depends: x:{x}\n"++  Hspec.describe "version ranges" $ do+    Hspec.it "implicit" $ do+      expectGilded+        "build-depends:  x"+        "build-depends: x\n"++    Hspec.it "any" $ do+      expectGilded+        "build-depends: x  -any"+        "build-depends: x -any\n"++    Hspec.it "none" $ do+      expectGilded+        "build-depends: x  -none"+        "build-depends: x -none\n"++    Hspec.it "this" $ do+      expectGilded+        "build-depends: x == 1"+        "build-depends: x ==1\n"++    Hspec.it "later" $ do+      expectGilded+        "build-depends: x > 1"+        "build-depends: x >1\n"++    Hspec.it "or later" $ do+      expectGilded+        "build-depends: x >= 1"+        "build-depends: x >=1\n"++    Hspec.it "earlier" $ do+      expectGilded+        "build-depends: x < 1"+        "build-depends: x <1\n"++    Hspec.it "or earlier" $ do+      expectGilded+        "build-depends: x <= 1"+        "build-depends: x <=1\n"++    Hspec.it "union" $ do+      expectGilded+        "build-depends: x > 1 || < 1"+        "build-depends: x >1 || <1\n"++    Hspec.it "intersect" $ do+      expectGilded+        "build-depends: x > 1 && < 2"+        "build-depends: x >1 && <2\n"++    Hspec.it "within" $ do+      expectGilded+        "build-depends: x == 1.*"+        "build-depends: x ==1.*\n"++    Hspec.it "major bound" $ do+      expectGilded+        "build-depends: x ^>= 1"+        "build-depends: x ^>=1\n"++    Hspec.it "set" $ do+      expectGilded+        "build-depends: x == { 1 , 2 }"+        "build-depends: x =={1, 2}\n"++    Hspec.it "sorts set" $ do+      expectGilded+        "build-depends: x == { 2, 1 }"+        "build-depends: x =={1, 2}\n"++    Hspec.it "paren" $ do+      expectGilded+        "build-depends: x ( == 1 )"+        "build-depends: x (==1)\n"    Hspec.around_ withTemporaryDirectory     . Hspec.it "discovers modules on the file system"