Skip to content

Commit d71859c

Browse files
committed
feat: add ScopeAnyExeQualifier
1 parent 482a1fc commit d71859c

File tree

2 files changed

+42
-17
lines changed

2 files changed

+42
-17
lines changed

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

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,9 @@ data ConstraintQualifier
6060
-- | The package with the specified name when it has a
6161
-- setup qualifier.
6262
| ScopeAnySetupQualifier PackageName
63+
-- | The package with the specified name when it has a
64+
-- setup qualifier.
65+
| ScopeAnyExeQualifier PackageName
6366
-- | The package with the specified name regardless of
6467
-- qualifier.
6568
| ScopeAnyQualifier PackageName
@@ -76,22 +79,25 @@ scopeToPackageName :: ConstraintScope -> PackageName
7679
scopeToPackageName (ConstraintScope _stage (ScopeTarget pn)) = pn
7780
scopeToPackageName (ConstraintScope _stage (ScopeQualified _ pn)) = pn
7881
scopeToPackageName (ConstraintScope _stage (ScopeAnySetupQualifier pn)) = pn
82+
scopeToPackageName (ConstraintScope _stage (ScopeAnyExeQualifier pn)) = pn
7983
scopeToPackageName (ConstraintScope _stage (ScopeAnyQualifier pn)) = pn
8084

8185
constraintScopeMatches :: ConstraintScope -> QPN -> Bool
8286
constraintScopeMatches (ConstraintScope mstage qualifier) (Q (PackagePath stage' q) pn') =
8387
maybe True (== stage') mstage && constraintQualifierMatches qualifier q pn'
8488

8589
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
90+
constraintQualifierMatches (ScopeTarget pn) QualToplevel pn' = pn == pn'
91+
constraintQualifierMatches (ScopeTarget _) (QualSetup _) _ = False
92+
constraintQualifierMatches (ScopeTarget _) (QualExe _ _) _ = False
93+
constraintQualifierMatches (ScopeQualified q pn) q' pn' = q == q' && pn == pn'
94+
constraintQualifierMatches (ScopeAnySetupQualifier _) QualToplevel _ = False
95+
constraintQualifierMatches (ScopeAnySetupQualifier _) (QualExe _ _) _ = False
96+
constraintQualifierMatches (ScopeAnySetupQualifier pn) (QualSetup _) pn' = pn == pn'
97+
constraintQualifierMatches (ScopeAnyExeQualifier pn) (QualExe _ _) pn' = pn == pn'
98+
constraintQualifierMatches (ScopeAnyExeQualifier _) QualToplevel _ = False
99+
constraintQualifierMatches (ScopeAnyExeQualifier _) (QualSetup _) _compile = False
100+
constraintQualifierMatches (ScopeAnyQualifier pn) _ pn' = pn == pn'
95101

96102
instance Pretty ConstraintScope where
97103
pretty (ConstraintScope mstage qualifier) =
@@ -101,6 +107,7 @@ instance Pretty ConstraintQualifier where
101107
pretty (ScopeTarget pn) = pretty pn <<>> Disp.text "." <<>> pretty pn
102108
pretty (ScopeQualified q pn) = dispQualifier q <<>> pretty pn
103109
pretty (ScopeAnySetupQualifier pn) = Disp.text "setup." <<>> pretty pn
110+
pretty (ScopeAnyExeQualifier pn) = Disp.text "exe." <<>> pretty pn
104111
pretty (ScopeAnyQualifier pn) = Disp.text "any." <<>> pretty pn
105112

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

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

Lines changed: 26 additions & 8 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) =
@@ -718,6 +723,7 @@ instance Parsec UserConstraint where
718723
withDot pn
719724
| pn == mkPackageName "any" = UserAnyQualifier <$> parsec
720725
| pn == mkPackageName "setup" = UserAnySetupQualifier <$> parsec
726+
| pn == mkPackageName "exe" = UserAnyExeQualifier <$> parsec
721727
| otherwise = P.unexpected $ "constraint scope: " ++ unPackageName pn
722728

723729
withColon :: PackageName -> m UserConstraintQualifier
@@ -732,17 +738,29 @@ instance Parsec UserConstraint where
732738
-- >>> eitherParsec "foo ^>= 1.2.3.4" :: Either String UserConstraint
733739
-- Right (UserConstraintX (UserConstraintScope Nothing (UserQualified UserQualToplevel (PackageName "foo"))) (PackagePropertyVersion (MajorBoundVersion (mkVersion [1,2,3,4]))))
734740
--
741+
-- >>> eitherParsec "any.bar > 1.2.3.4" :: Either String UserConstraint
742+
-- Right (UserConstraintX (UserConstraintScope Nothing (UserAnyQualifier (PackageName "bar"))) (PackagePropertyVersion (LaterVersion (mkVersion [1,2,3,4]))))
743+
--
744+
-- >>> eitherParsec "setup.bar > 1.2.3.4" :: Either String UserConstraint
745+
-- Right (UserConstraintX (UserConstraintScope Nothing (UserAnySetupQualifier (PackageName "bar"))) (PackagePropertyVersion (LaterVersion (mkVersion [1,2,3,4]))))
746+
--
747+
-- >>> eitherParsec "exe.bar > 1.2.3.4" :: Either String UserConstraint
748+
-- Right (UserConstraintX (UserConstraintScope Nothing (UserAnyExeQualifier (PackageName "bar"))) (PackagePropertyVersion (LaterVersion (mkVersion [1,2,3,4]))))
749+
--
735750
-- >>> eitherParsec "foo:setup.bar > 1.2.3.4" :: Either String UserConstraint
736751
-- Right (UserConstraintX (UserConstraintScope Nothing (UserQualified (UserQualSetup (PackageName "foo")) (PackageName "bar"))) (PackagePropertyVersion (LaterVersion (mkVersion [1,2,3,4]))))
737752
--
738-
-- >>> eitherParsec "setup.any source" :: Either String UserConstraint
739-
-- Right (UserConstraintX (UserConstraintScope Nothing (UserAnySetupQualifier (PackageName "any"))) PackagePropertySource)
740-
--
753+
-- >>> eitherParsec "foo:exe:bar.abc > 1.2.3.4" :: Either String UserConstraint
754+
-- Right (UserConstraintX (UserConstraintScope Nothing (UserQualified (UserQualExe (PackageName "foo") (PackageName "bar")) (PackageName "abc"))) (PackagePropertyVersion (LaterVersion (mkVersion [1,2,3,4]))))
755+
----
741756
-- >>> eitherParsec "build:rts source" :: Either String UserConstraint
742757
-- Right (UserConstraintX (UserConstraintScope (Just Build) (UserQualified UserQualToplevel (PackageName "rts"))) PackagePropertySource)
743758
--
744-
-- >>> eitherParsec "setup.any installed" :: Either String UserConstraint
745-
-- Right (UserConstraintX (UserConstraintScope Nothing (UserAnySetupQualifier (PackageName "any"))) PackagePropertyInstalled)
746-
--
747-
-- >>> eitherParsec "build:ghc-internal installed" :: Either String UserConstraint
748-
-- Right (UserConstraintX (UserConstraintScope (Just Build) (UserQualified UserQualToplevel (PackageName "ghc-internal"))) PackagePropertyInstalled)
759+
-- >>> eitherParsec "build:any.rts source" :: Either String UserConstraint
760+
-- Right (UserConstraintX (UserConstraintScope (Just Build) (UserAnyQualifier (PackageName "rts"))) PackagePropertySource)
761+
--
762+
-- >>> eitherParsec "setup.ghc-internal installed" :: Either String UserConstraint
763+
-- Right (UserConstraintX (UserConstraintScope Nothing (UserAnySetupQualifier (PackageName "ghc-internal"))) PackagePropertyInstalled)
764+
--
765+
-- >>> eitherParsec "setup.ghc-internal installed" :: Either String UserConstraint
766+
-- Right (UserConstraintX (UserConstraintScope Nothing (UserAnySetupQualifier (PackageName "ghc-internal"))) PackagePropertyInstalled)

0 commit comments

Comments
 (0)