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
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,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."
0 commit comments