Skip to content

Commit 95945f7

Browse files
committed
feat(cabal-install): add ScopeAnyExeQualifier and UserAnyExeQualifier
1 parent a8050fc commit 95945f7

File tree

2 files changed

+36
-20
lines changed

2 files changed

+36
-20
lines changed

cabal-install-solver/src/Distribution/Solver/Types/PackageConstraint.hs

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -57,11 +57,11 @@ data ConstraintQualifier
5757
= ScopeTarget PackageName
5858
-- | The package with the specified name and qualifier.
5959
| ScopeQualified Qualifier PackageName
60-
-- | The package with the specified name when it has a
61-
-- setup qualifier.
60+
-- | The package with the specified name when it has a setup qualifier.
6261
| ScopeAnySetupQualifier PackageName
63-
-- | The package with the specified name regardless of
64-
-- qualifier.
62+
-- | The package with the specified name when it has an exe qualifier.
63+
| ScopeAnyExeQualifier PackageName
64+
-- | The package with the specified name regardless of qualifier.
6565
| ScopeAnyQualifier PackageName
6666
deriving (Eq, Show)
6767

@@ -76,22 +76,25 @@ scopeToPackageName :: ConstraintScope -> PackageName
7676
scopeToPackageName (ConstraintScope _stage (ScopeTarget pn)) = pn
7777
scopeToPackageName (ConstraintScope _stage (ScopeQualified _ pn)) = pn
7878
scopeToPackageName (ConstraintScope _stage (ScopeAnySetupQualifier pn)) = pn
79+
scopeToPackageName (ConstraintScope _stage (ScopeAnyExeQualifier pn)) = pn
7980
scopeToPackageName (ConstraintScope _stage (ScopeAnyQualifier pn)) = pn
8081

8182
constraintScopeMatches :: ConstraintScope -> QPN -> Bool
8283
constraintScopeMatches (ConstraintScope mstage qualifier) (Q (PackagePath stage' q) pn') =
8384
maybe True (== stage') mstage && constraintQualifierMatches qualifier q pn'
8485

8586
constraintQualifierMatches :: ConstraintQualifier -> Qualifier -> PackageName -> Bool
86-
constraintQualifierMatches (ScopeTarget pn) q pn' =
87-
q == QualToplevel && pn == pn'
88-
constraintQualifierMatches (ScopeQualified q pn) q' pn' =
89-
q == q' && pn == pn'
90-
constraintQualifierMatches (ScopeAnySetupQualifier pn) (QualSetup _) pn' =
91-
pn == pn'
92-
constraintQualifierMatches (ScopeAnyQualifier pn) _ pn' =
93-
pn == pn'
94-
constraintQualifierMatches _ _ _ = False
87+
constraintQualifierMatches (ScopeTarget pn) QualToplevel pn' = pn == pn'
88+
constraintQualifierMatches (ScopeTarget _) (QualSetup _) _ = False
89+
constraintQualifierMatches (ScopeTarget _) (QualExe _ _) _ = False
90+
constraintQualifierMatches (ScopeQualified q pn) q' pn' = q == q' && pn == pn'
91+
constraintQualifierMatches (ScopeAnySetupQualifier _) QualToplevel _ = False
92+
constraintQualifierMatches (ScopeAnySetupQualifier _) (QualExe _ _) _ = False
93+
constraintQualifierMatches (ScopeAnySetupQualifier pn) (QualSetup _) pn' = pn == pn'
94+
constraintQualifierMatches (ScopeAnyExeQualifier pn) (QualExe _ _) pn' = pn == pn'
95+
constraintQualifierMatches (ScopeAnyExeQualifier _) QualToplevel _ = False
96+
constraintQualifierMatches (ScopeAnyExeQualifier _) (QualSetup _) _compile = False
97+
constraintQualifierMatches (ScopeAnyQualifier pn) _ pn' = pn == pn'
9598

9699
instance Pretty ConstraintScope where
97100
pretty (ConstraintScope mstage qualifier) =
@@ -101,6 +104,7 @@ instance Pretty ConstraintQualifier where
101104
pretty (ScopeTarget pn) = pretty pn <<>> Disp.text "." <<>> pretty pn
102105
pretty (ScopeQualified q pn) = dispQualifier q <<>> pretty pn
103106
pretty (ScopeAnySetupQualifier pn) = Disp.text "setup." <<>> pretty pn
107+
pretty (ScopeAnyExeQualifier pn) = Disp.text "exe." <<>> pretty pn
104108
pretty (ScopeAnyQualifier pn) = Disp.text "any." <<>> pretty pn
105109

106110
-- | A package property is a logical predicate on packages.

cabal-install/src/Distribution/Client/Targets.hs

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -627,6 +627,8 @@ data UserConstraintQualifier
627627
UserQualified UserQualifier PackageName
628628
| -- | Scope that applies to the package when it has a setup qualifier.
629629
UserAnySetupQualifier PackageName
630+
| -- | Scope that applies to the package when it has a setup qualifier.
631+
UserAnyExeQualifier PackageName
630632
| -- | Scope that applies to the package when it has any qualifier.
631633
UserAnyQualifier PackageName
632634
deriving (Eq, Show, Generic)
@@ -644,6 +646,8 @@ fromUserConstraintScope (UserConstraintScope mstage (UserQualified q pn)) =
644646
ConstraintScope mstage (ScopeQualified (fromUserQualifier q) pn)
645647
fromUserConstraintScope (UserConstraintScope mstage (UserAnySetupQualifier pn)) =
646648
ConstraintScope mstage (ScopeAnySetupQualifier pn)
649+
fromUserConstraintScope (UserConstraintScope mstage (UserAnyExeQualifier pn)) =
650+
ConstraintScope mstage (ScopeAnyExeQualifier pn)
647651
fromUserConstraintScope (UserConstraintScope mstage (UserAnyQualifier pn)) =
648652
ConstraintScope mstage (ScopeAnyQualifier pn)
649653

@@ -668,6 +672,7 @@ userConstraintPackageName (UserConstraintX (UserConstraintScope _stage qualifier
668672
scopePN (UserQualified _ pn) = pn
669673
scopePN (UserAnyQualifier pn) = pn
670674
scopePN (UserAnySetupQualifier pn) = pn
675+
scopePN (UserAnyExeQualifier pn) = pn
671676

672677
userToPackageConstraint :: UserConstraint -> PackageConstraint
673678
userToPackageConstraint (UserConstraintX scope prop) =
@@ -719,6 +724,7 @@ instance Parsec UserConstraint where
719724
withDot pn
720725
| pn == mkPackageName "any" = UserAnyQualifier <$> parsec
721726
| pn == mkPackageName "setup" = UserAnySetupQualifier <$> parsec
727+
| pn == mkPackageName "exe" = UserAnyExeQualifier <$> parsec
722728
| otherwise = P.unexpected $ "constraint scope: " ++ unPackageName pn
723729

724730
withColon :: PackageName -> m UserConstraintQualifier
@@ -734,20 +740,26 @@ instance Parsec UserConstraint where
734740
-- >>> eitherParsec "foo ^>= 1.2.3.4" :: Either String UserConstraint
735741
-- Right (UserConstraintX (UserConstraintScope Nothing (UserQualified UserQualToplevel (PackageName "foo"))) (PackagePropertyVersion (MajorBoundVersion (mkVersion [1,2,3,4]))))
736742
--
743+
-- >>> eitherParsec "any.bar > 1.2.3.4" :: Either String UserConstraint
744+
-- Right (UserConstraintX (UserConstraintScope Nothing (UserAnyQualifier (PackageName "bar"))) (PackagePropertyVersion (LaterVersion (mkVersion [1,2,3,4]))))
745+
--
746+
-- >>> eitherParsec "setup.bar > 1.2.3.4" :: Either String UserConstraint
747+
-- Right (UserConstraintX (UserConstraintScope Nothing (UserAnySetupQualifier (PackageName "bar"))) (PackagePropertyVersion (LaterVersion (mkVersion [1,2,3,4]))))
748+
--
749+
-- >>> eitherParsec "exe.bar > 1.2.3.4" :: Either String UserConstraint
750+
-- Right (UserConstraintX (UserConstraintScope Nothing (UserAnyExeQualifier (PackageName "bar"))) (PackagePropertyVersion (LaterVersion (mkVersion [1,2,3,4]))))
751+
--
737752
-- >>> eitherParsec "foo:setup.bar > 1.2.3.4" :: Either String UserConstraint
738753
-- Right (UserConstraintX (UserConstraintScope Nothing (UserQualified (UserQualSetup (PackageName "foo")) (PackageName "bar"))) (PackagePropertyVersion (LaterVersion (mkVersion [1,2,3,4]))))
739754
--
740-
-- >>> eitherParsec "setup.any source" :: Either String UserConstraint
741-
-- Right (UserConstraintX (UserConstraintScope Nothing (UserAnySetupQualifier (PackageName "any"))) PackagePropertySource)
742-
--
743755
-- >>> eitherParsec "build:rts source" :: Either String UserConstraint
744756
-- Right (UserConstraintX (UserConstraintScope (Just Build) (UserQualified UserQualToplevel (PackageName "rts"))) PackagePropertySource)
745757
--
746-
-- >>> eitherParsec "setup.any installed" :: Either String UserConstraint
747-
-- Right (UserConstraintX (UserConstraintScope Nothing (UserAnySetupQualifier (PackageName "any"))) PackagePropertyInstalled)
758+
-- >>> eitherParsec "build:any.rts source" :: Either String UserConstraint
759+
-- Right (UserConstraintX (UserConstraintScope (Just Build) (UserAnyQualifier (PackageName "rts"))) PackagePropertySource)
748760
--
749-
-- >>> eitherParsec "build:ghc-internal installed" :: Either String UserConstraint
750-
-- Right (UserConstraintX (UserConstraintScope (Just Build) (UserQualified UserQualToplevel (PackageName "ghc-internal"))) PackagePropertyInstalled)
761+
-- >>> eitherParsec "setup.ghc-internal installed" :: Either String UserConstraint
762+
-- Right (UserConstraintX (UserConstraintScope Nothing (UserAnySetupQualifier (PackageName "ghc-internal"))) PackagePropertyInstalled)
751763
--
752764
-- >>> eitherParsec "foo:exe:bar.baz > 1.2.3.4" :: Either String UserConstraint
753765
-- Right (UserConstraintX (UserConstraintScope Nothing (UserQualified (UserQualExe (PackageName "foo") (PackageName "bar")) (PackageName "baz"))) (PackagePropertyVersion (LaterVersion (mkVersion [1,2,3,4]))))

0 commit comments

Comments
 (0)