Skip to content

Commit 4fc746f

Browse files
committed
feat: add stage to ConstraintScope and UserConstraint
1 parent 56fb1bc commit 4fc746f

File tree

14 files changed

+109
-62
lines changed

14 files changed

+109
-62
lines changed

cabal-install-solver/src/Distribution/Solver/Modular/IndexConversion.hs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -286,10 +286,11 @@ testConditionForComponent os arch cinfo constraints p tree =
286286
Lit False -> Just False
287287
_ -> Nothing
288288
where
289+
-- TODO: fix for stage
289290
flagAssignment :: [(FlagName, Bool)]
290291
flagAssignment =
291292
mconcat [ unFlagAssignment fa
292-
| PackageConstraint (ScopeAnyQualifier _) (PackagePropertyFlags fa)
293+
| PackageConstraint (ConstraintScope _stage (ScopeAnyQualifier _)) (PackagePropertyFlags fa)
293294
<- L.map unlabelPackageConstraint constraints]
294295

295296
-- Simplify the condition, using the current environment. Most of this

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

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
--
88
module Distribution.Solver.Types.PackageConstraint (
99
ConstraintScope(..),
10+
ConstraintQualifier(..),
1011
scopeToplevel,
1112
scopeToPackageName,
1213
constraintScopeMatches,
@@ -29,11 +30,15 @@ import Distribution.Solver.Types.OptionalStanza
2930
import Distribution.Solver.Types.PackagePath
3031

3132
import qualified Text.PrettyPrint as Disp
33+
import Distribution.Solver.Types.Toolchain (Stage)
3234

3335

3436
-- | Determines to what packages and in what contexts a
3537
-- constraint applies.
36-
data ConstraintScope
38+
data ConstraintScope = ConstraintScope (Maybe Stage) ConstraintQualifier
39+
deriving (Eq, Show)
40+
41+
data ConstraintQualifier
3742
-- | A scope that applies when the given package is used as a build target.
3843
-- In other words, the scope applies iff a goal has a top-level qualifier
3944
-- and its namespace matches the given package name. A namespace is
@@ -58,27 +63,35 @@ data ConstraintScope
5863
-- the package with the specified name when that package is a
5964
-- top-level dependency in the default namespace.
6065
scopeToplevel :: PackageName -> ConstraintScope
61-
scopeToplevel = ScopeQualified QualToplevel
66+
scopeToplevel = ConstraintScope Nothing . ScopeQualified QualToplevel
6267

6368
-- | Returns the package name associated with a constraint scope.
6469
scopeToPackageName :: ConstraintScope -> PackageName
65-
scopeToPackageName (ScopeTarget pn) = pn
66-
scopeToPackageName (ScopeQualified _ pn) = pn
67-
scopeToPackageName (ScopeAnySetupQualifier pn) = pn
68-
scopeToPackageName (ScopeAnyQualifier pn) = pn
70+
scopeToPackageName (ConstraintScope _stage (ScopeTarget pn)) = pn
71+
scopeToPackageName (ConstraintScope _stage (ScopeQualified _ pn)) = pn
72+
scopeToPackageName (ConstraintScope _stage (ScopeAnySetupQualifier pn)) = pn
73+
scopeToPackageName (ConstraintScope _stage (ScopeAnyQualifier pn)) = pn
6974

7075
constraintScopeMatches :: ConstraintScope -> QPN -> Bool
71-
constraintScopeMatches (ScopeTarget pn) (Q (PackagePath _ q) pn') =
76+
constraintScopeMatches (ConstraintScope mstage qualifier) (Q (PackagePath stage' q) pn') =
77+
maybe True (== stage') mstage && constraintQualifierMatches qualifier q pn'
78+
79+
constraintQualifierMatches :: ConstraintQualifier -> Qualifier -> PackageName -> Bool
80+
constraintQualifierMatches (ScopeTarget pn) q pn' =
7281
q == QualToplevel && pn == pn'
73-
constraintScopeMatches (ScopeQualified q pn) (Q (PackagePath _ q') pn') =
82+
constraintQualifierMatches (ScopeQualified q pn) q' pn' =
7483
q == q' && pn == pn'
75-
constraintScopeMatches (ScopeAnySetupQualifier pn) (Q pp pn') =
76-
let setup (PackagePath _ (QualSetup _)) = True
77-
setup _ = False
78-
in setup pp && pn == pn'
79-
constraintScopeMatches (ScopeAnyQualifier pn) (Q _ pn') = pn == pn'
84+
constraintQualifierMatches (ScopeAnySetupQualifier pn) (QualSetup _) pn' =
85+
pn == pn'
86+
constraintQualifierMatches (ScopeAnyQualifier pn) _ pn' =
87+
pn == pn'
88+
constraintQualifierMatches _ _ _ = False
8089

8190
instance Pretty ConstraintScope where
91+
pretty (ConstraintScope mstage qualifier) =
92+
maybe mempty pretty mstage <+> pretty qualifier
93+
94+
instance Pretty ConstraintQualifier where
8295
pretty (ScopeTarget pn) = pretty pn <<>> Disp.text "." <<>> pretty pn
8396
pretty (ScopeQualified q pn) = dispQualifier q <<>> pretty pn
8497
pretty (ScopeAnySetupQualifier pn) = Disp.text "setup." <<>> pretty pn

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,12 @@ module Distribution.Solver.Types.Stage
1616

1717
import Prelude (Enum (..))
1818
import Distribution.Compat.Prelude
19+
import qualified Distribution.Compat.CharParsing as P
1920

2021
import Data.Maybe (fromJust)
2122
import GHC.Stack
2223

24+
import Distribution.Parsec (Parsec (..))
2325
import Distribution.Pretty (Pretty (..))
2426
import Distribution.Utils.Structured (Structured (..))
2527
import qualified Text.PrettyPrint as Disp
@@ -42,6 +44,12 @@ showStage :: Stage -> String
4244
showStage Build = "build"
4345
showStage Host = "host"
4446

47+
instance Parsec Stage where
48+
parsec = P.choice [
49+
Build <$ P.string "build",
50+
Host <$ P.string "host"
51+
]
52+
4553
-- TOOD: I think there is similar code for stanzas, compare.
4654

4755
newtype Staged a = Staged

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ import Distribution.Client.ProjectOrchestration
2929
import Distribution.Client.ProjectPlanning
3030
import Distribution.Client.Targets
3131
( UserConstraint (..)
32-
, UserConstraintScope (..)
3332
, UserQualifier (..)
33+
, UserConstraintQualifier (..)
3434
)
3535
import Distribution.Solver.Types.ConstraintSource
3636
( ConstraintSource (..)
@@ -209,9 +209,11 @@ projectFreezeConstraints plan =
209209
-- constraint would apply to both instances). We do however keep flag
210210
-- constraints of local packages.
211211
--
212+
-- TODO: this is even worse with stages
212213
deleteLocalPackagesVersionConstraints
213214
(Map.unionWith (++) versionConstraints flagConstraints)
214215
where
216+
215217
versionConstraints :: Map PackageName [(UserConstraint, ConstraintSource)]
216218
versionConstraints =
217219
Map.mapWithKey

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,7 @@ import Distribution.Client.TargetProblem
7777
( TargetProblem (..)
7878
)
7979
import Distribution.Client.Targets
80-
( UserConstraint (..)
81-
, UserConstraintScope (..)
80+
( UserConstraint (..), UserConstraintQualifier (..)
8281
)
8382
import Distribution.Client.Types
8483
( PackageSpecifier (..)

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -430,7 +430,7 @@ dontInstallNonReinstallablePackages params =
430430
where
431431
extraConstraints =
432432
[ LabeledPackageConstraint
433-
(PackageConstraint (ScopeAnyQualifier pkgname) PackagePropertyInstalled)
433+
(PackageConstraint (ConstraintScope Nothing (ScopeAnyQualifier pkgname)) PackagePropertyInstalled)
434434
ConstraintSourceNonReinstallablePackage
435435
| pkgname <- nonReinstallablePackages
436436
]
@@ -483,7 +483,7 @@ hideInstalledPackagesSpecificBySourcePackageId
483483
hideInstalledPackagesSpecificBySourcePackageId pkgids =
484484
addConstraints
485485
[ LabeledPackageConstraint
486-
(PackageConstraint (ScopeAnyQualifier name) PackagePropertySource)
486+
(PackageConstraint (ConstraintScope Nothing (ScopeAnyQualifier name)) PackagePropertySource)
487487
-- FIXME
488488
ConstraintSourceUnknown
489489
| pkgId <- pkgids
@@ -623,7 +623,7 @@ addSetupCabalMinVersionConstraint minVersion =
623623
addConstraints
624624
[ LabeledPackageConstraint
625625
( PackageConstraint
626-
(ScopeAnySetupQualifier cabalPkgname)
626+
(ConstraintScope Nothing (ScopeAnySetupQualifier cabalPkgname))
627627
(PackagePropertyVersion $ orLaterVersion minVersion)
628628
)
629629
ConstraintSetupCabalMinVersion
@@ -641,7 +641,7 @@ addSetupCabalMaxVersionConstraint maxVersion =
641641
addConstraints
642642
[ LabeledPackageConstraint
643643
( PackageConstraint
644-
(ScopeAnySetupQualifier cabalPkgname)
644+
(ConstraintScope Nothing (ScopeAnySetupQualifier cabalPkgname))
645645
(PackagePropertyVersion $ earlierVersion maxVersion)
646646
)
647647
ConstraintSetupCabalMaxVersion
@@ -657,7 +657,7 @@ addSetupCabalProfiledDynamic =
657657
addConstraints
658658
[ LabeledPackageConstraint
659659
( PackageConstraint
660-
(ScopeAnySetupQualifier cabalPkgname)
660+
(ConstraintScope Nothing (ScopeAnySetupQualifier cabalPkgname))
661661
(PackagePropertyVersion $ orLaterVersion (mkVersion [3, 13, 0]))
662662
)
663663
ConstraintSourceProfiledDynamic
@@ -673,7 +673,7 @@ reinstallTargets params =
673673
addConstraints
674674
[ LabeledPackageConstraint
675675
( PackageConstraint
676-
(ScopeAnyQualifier pkgName)
676+
(ConstraintScope Nothing (ScopeAnyQualifier pkgName))
677677
PackagePropertySource
678678
)
679679
ConstraintSourceProfiledDynamic

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

Lines changed: 35 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
{-# LANGUAGE DeriveGeneric #-}
22
{-# LANGUAGE DeriveTraversable #-}
33
{-# LANGUAGE ScopedTypeVariables #-}
4+
{-# LANGUAGE PatternSynonyms #-}
45

56
-- |
67
-- Module : Distribution.Client.Targets
@@ -34,7 +35,8 @@ module Distribution.Client.Targets
3435
-- * User constraints
3536
, UserQualifier (..)
3637
, UserConstraintScope (..)
37-
, UserConstraint (..)
38+
, UserConstraintQualifier (..)
39+
, UserConstraint (UserConstraint, UserConstraintStaged)
3840
, userConstraintPackageName
3941
, readUserConstraint
4042
, userToPackageConstraint
@@ -115,6 +117,7 @@ import System.FilePath
115117
, takeDirectory
116118
, takeExtension
117119
)
120+
import Distribution.Solver.Types.Stage (Stage)
118121

119122
-- ------------------------------------------------------------
120123

@@ -613,7 +616,13 @@ instance Structured UserQualifier
613616

614617
-- | Version of 'ConstraintScope' that a user may specify on the
615618
-- command line.
616-
data UserConstraintScope
619+
data UserConstraintScope = UserConstraintScope (Maybe Stage) UserConstraintQualifier
620+
deriving (Eq, Show, Generic)
621+
622+
instance Binary UserConstraintScope
623+
instance Structured UserConstraintScope
624+
625+
data UserConstraintQualifier
617626
= -- | Scope that applies to the package when it has the specified qualifier.
618627
UserQualified UserQualifier PackageName
619628
| -- | Scope that applies to the package when it has a setup qualifier.
@@ -622,38 +631,46 @@ data UserConstraintScope
622631
UserAnyQualifier PackageName
623632
deriving (Eq, Show, Generic)
624633

625-
instance Binary UserConstraintScope
626-
instance Structured UserConstraintScope
634+
instance Binary UserConstraintQualifier
635+
instance Structured UserConstraintQualifier
627636

628637
fromUserQualifier :: UserQualifier -> Qualifier
629638
fromUserQualifier UserQualToplevel = QualToplevel
630639
fromUserQualifier (UserQualSetup name) = QualSetup name
631640
fromUserQualifier (UserQualExe name1 name2) = QualExe name1 name2
632641

633642
fromUserConstraintScope :: UserConstraintScope -> ConstraintScope
634-
fromUserConstraintScope (UserQualified q pn) =
635-
ScopeQualified (fromUserQualifier q) pn
636-
fromUserConstraintScope (UserAnySetupQualifier pn) = ScopeAnySetupQualifier pn
637-
fromUserConstraintScope (UserAnyQualifier pn) = ScopeAnyQualifier pn
643+
fromUserConstraintScope (UserConstraintScope mstage (UserQualified q pn)) =
644+
ConstraintScope mstage (ScopeQualified (fromUserQualifier q) pn)
645+
fromUserConstraintScope (UserConstraintScope mstage (UserAnySetupQualifier pn)) =
646+
ConstraintScope mstage (ScopeAnySetupQualifier pn)
647+
fromUserConstraintScope (UserConstraintScope mstage (UserAnyQualifier pn)) =
648+
ConstraintScope mstage (ScopeAnyQualifier pn)
638649

639650
-- | Version of 'PackageConstraint' that the user can specify on
640651
-- the command line.
641652
data UserConstraint
642-
= UserConstraint UserConstraintScope PackageProperty
653+
= UserConstraintX UserConstraintScope PackageProperty
643654
deriving (Eq, Show, Generic)
644655

645656
instance Binary UserConstraint
646657
instance Structured UserConstraint
647658

659+
pattern UserConstraint :: UserConstraintQualifier -> PackageProperty -> UserConstraint
660+
pattern UserConstraint qualifier prop = UserConstraintX (UserConstraintScope Nothing qualifier) prop
661+
662+
pattern UserConstraintStaged :: Stage -> UserConstraintQualifier -> PackageProperty -> UserConstraint
663+
pattern UserConstraintStaged stage qualifier prop = UserConstraintX (UserConstraintScope (Just stage) qualifier) prop
664+
648665
userConstraintPackageName :: UserConstraint -> PackageName
649-
userConstraintPackageName (UserConstraint scope _) = scopePN scope
666+
userConstraintPackageName (UserConstraintX (UserConstraintScope _stage qualifier) _) = scopePN qualifier
650667
where
651668
scopePN (UserQualified _ pn) = pn
652669
scopePN (UserAnyQualifier pn) = pn
653670
scopePN (UserAnySetupQualifier pn) = pn
654671

655672
userToPackageConstraint :: UserConstraint -> PackageConstraint
656-
userToPackageConstraint (UserConstraint scope prop) =
673+
userToPackageConstraint (UserConstraintX scope prop) =
657674
PackageConstraint (fromUserConstraintScope scope) prop
658675

659676
readUserConstraint :: String -> Either String UserConstraint
@@ -668,7 +685,7 @@ readUserConstraint str =
668685
++ "'source', 'test', 'bench', or flags. "
669686

670687
instance Pretty UserConstraint where
671-
pretty (UserConstraint scope prop) =
688+
pretty (UserConstraintX scope prop) =
672689
pretty $ PackageConstraint (fromUserConstraintScope scope) prop
673690

674691
instance Parsec UserConstraint where
@@ -684,24 +701,26 @@ instance Parsec UserConstraint where
684701
, PackagePropertyStanzas [TestStanzas] <$ P.string "test"
685702
, PackagePropertyStanzas [BenchStanzas] <$ P.string "bench"
686703
]
687-
return (UserConstraint scope prop)
704+
return (UserConstraintX scope prop)
688705
where
689706
parseConstraintScope :: forall m. CabalParsing m => m UserConstraintScope
690707
parseConstraintScope = do
708+
mstage <- P.optional (parsec <* P.char ':')
691709
pn <- parsec
692-
P.choice
710+
c <- P.choice
693711
[ P.char '.' *> withDot pn
694712
, P.char ':' *> withColon pn
695713
, return (UserQualified UserQualToplevel pn)
696714
]
715+
return $ UserConstraintScope mstage c
697716
where
698-
withDot :: PackageName -> m UserConstraintScope
717+
withDot :: PackageName -> m UserConstraintQualifier
699718
withDot pn
700719
| pn == mkPackageName "any" = UserAnyQualifier <$> parsec
701720
| pn == mkPackageName "setup" = UserAnySetupQualifier <$> parsec
702721
| otherwise = P.unexpected $ "constraint scope: " ++ unPackageName pn
703722

704-
withColon :: PackageName -> m UserConstraintScope
723+
withColon :: PackageName -> m UserConstraintQualifier
705724
withColon pn =
706725
UserQualified (UserQualSetup pn)
707726
<$ P.string "setup."

cabal-install/src/Distribution/Client/Types/PackageSpecifier.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ pkgSpecifierConstraints (SpecificSourcePackage pkg) =
5252
where
5353
sourceConstraint =
5454
PackageConstraint
55-
(ScopeTarget $ packageName pkg)
55+
(ConstraintScope Nothing (ScopeTarget $ packageName pkg))
5656
PackagePropertySource
5757

5858
mkNamedPackage :: PackageIdentifier -> PackageSpecifier pkg

cabal-install/tests/IntegrationTests2.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ import Distribution.Client.TargetSelector hiding (DirActions (..))
3030
import qualified Distribution.Client.TargetSelector as TS (DirActions (..))
3131
import Distribution.Client.Targets
3232
( UserConstraint (..)
33-
, UserConstraintScope (UserAnyQualifier)
33+
, UserConstraintQualifier (UserAnyQualifier)
3434
)
3535
import Distribution.Client.Types
3636
( PackageLocation (..)

cabal-install/tests/UnitTests/Distribution/Client/ArbitraryInstances.hs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,10 @@ instance Arbitrary UserConstraintScope where
287287
arbitrary = genericArbitrary
288288
shrink = genericShrink
289289

290+
instance Arbitrary UserConstraintQualifier where
291+
arbitrary = genericArbitrary
292+
shrink = genericShrink
293+
290294
instance Arbitrary UserQualifier where
291295
arbitrary =
292296
oneof

0 commit comments

Comments
 (0)