11{-# LANGUAGE DeriveGeneric #-}
22{-# LANGUAGE DeriveTraversable #-}
3+ {-# LANGUAGE PatternSynonyms #-}
34{-# LANGUAGE ScopedTypeVariables #-}
45
56-- |
@@ -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
@@ -99,6 +101,7 @@ import qualified Data.Map as Map
99101import Distribution.Client.Errors
100102import qualified Distribution.Client.GZipUtils as GZipUtils
101103import qualified Distribution.Compat.CharParsing as P
104+ import Distribution.Solver.Types.Stage (Stage )
102105import Distribution.Utils.Path (makeSymbolicPath )
103106import Network.URI
104107 ( URI (.. )
@@ -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
628637fromUserQualifier :: UserQualifier -> Qualifier
629638fromUserQualifier UserQualToplevel = QualToplevel
630639fromUserQualifier (UserQualSetup name) = QualSetup name
631640fromUserQualifier (UserQualExe name1 name2) = QualExe name1 name2
632641
633642fromUserConstraintScope :: 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.
641652data UserConstraint
642- = UserConstraint UserConstraintScope PackageProperty
653+ = UserConstraintX UserConstraintScope PackageProperty
643654 deriving (Eq , Show , Generic )
644655
645656instance Binary UserConstraint
646657instance 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+
648665userConstraintPackageName :: 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
655672userToPackageConstraint :: UserConstraint -> PackageConstraint
656- userToPackageConstraint (UserConstraint scope prop) =
673+ userToPackageConstraint (UserConstraintX scope prop) =
657674 PackageConstraint (fromUserConstraintScope scope) prop
658675
659676readUserConstraint :: String -> Either String UserConstraint
@@ -668,7 +685,7 @@ readUserConstraint str =
668685 ++ " 'source', 'test', 'bench', or flags. "
669686
670687instance Pretty UserConstraint where
671- pretty (UserConstraint scope prop) =
688+ pretty (UserConstraintX scope prop) =
672689 pretty $ PackageConstraint (fromUserConstraintScope scope) prop
673690
674691instance Parsec UserConstraint where
@@ -684,25 +701,49 @@ 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 (P. try (parsec <* P. char ' :' ))
691709 pn <- parsec
692- P. choice
693- [ P. char ' .' *> withDot pn
694- , P. char ' :' *> withColon pn
695- , return (UserQualified UserQualToplevel pn)
696- ]
710+ c <-
711+ P. choice
712+ [ P. char ' .' *> withDot pn
713+ , P. char ' :' *> withColon pn
714+ , return (UserQualified UserQualToplevel pn)
715+ ]
716+ return $ UserConstraintScope mstage c
697717 where
698- withDot :: PackageName -> m UserConstraintScope
718+ withDot :: PackageName -> m UserConstraintQualifier
699719 withDot pn
700720 | pn == mkPackageName " any" = UserAnyQualifier <$> parsec
701721 | pn == mkPackageName " setup" = UserAnySetupQualifier <$> parsec
702722 | otherwise = P. unexpected $ " constraint scope: " ++ unPackageName pn
703723
704- withColon :: PackageName -> m UserConstraintScope
724+ withColon :: PackageName -> m UserConstraintQualifier
705725 withColon pn =
706726 UserQualified (UserQualSetup pn)
707727 <$ P. string " setup."
708728 <*> parsec
729+
730+ -- >>> eitherParsec "foo > 1.2.3.4" :: Either String UserConstraint
731+ -- Right (UserConstraintX (UserConstraintScope Nothing (UserQualified UserQualToplevel (PackageName "foo"))) (PackagePropertyVersion (LaterVersion (mkVersion [1,2,3,4]))))
732+ --
733+ -- >>> eitherParsec "foo ^>= 1.2.3.4" :: Either String UserConstraint
734+ -- Right (UserConstraintX (UserConstraintScope Nothing (UserQualified UserQualToplevel (PackageName "foo"))) (PackagePropertyVersion (MajorBoundVersion (mkVersion [1,2,3,4]))))
735+ --
736+ -- >>> eitherParsec "foo:setup.bar > 1.2.3.4" :: Either String UserConstraint
737+ -- Right (UserConstraintX (UserConstraintScope Nothing (UserQualified (UserQualSetup (PackageName "foo")) (PackageName "bar"))) (PackagePropertyVersion (LaterVersion (mkVersion [1,2,3,4]))))
738+ --
739+ -- >>> eitherParsec "setup.any source" :: Either String UserConstraint
740+ -- Right (UserConstraintX (UserConstraintScope Nothing (UserAnySetupQualifier (PackageName "any"))) PackagePropertySource)
741+ --
742+ -- >>> eitherParsec "build:rts source" :: Either String UserConstraint
743+ -- Right (UserConstraintX (UserConstraintScope (Just Build) (UserQualified UserQualToplevel (PackageName "rts"))) PackagePropertySource)
744+ --
745+ -- >>> eitherParsec "setup.any installed" :: Either String UserConstraint
746+ -- Right (UserConstraintX (UserConstraintScope Nothing (UserAnySetupQualifier (PackageName "any"))) PackagePropertyInstalled)
747+ --
748+ -- >>> eitherParsec "build:ghc-internal installed" :: Either String UserConstraint
749+ -- Right (UserConstraintX (UserConstraintScope (Just Build) (UserQualified UserQualToplevel (PackageName "ghc-internal"))) PackagePropertyInstalled)
0 commit comments