@@ -67,6 +67,7 @@ import Distribution.Solver.Types.OptionalStanza
67
67
import Distribution.Solver.Types.PackageConstraint
68
68
import Distribution.Solver.Types.PackageIndex (PackageIndex )
69
69
import qualified Distribution.Solver.Types.PackageIndex as PackageIndex
70
+ import Distribution.Solver.Types.PackagePath
70
71
import Distribution.Solver.Types.SourcePackage
71
72
72
73
import qualified Distribution.Client.World as World
@@ -203,8 +204,9 @@ pkgSpecifierConstraints (NamedPackage _ constraints) = map toLpc constraints
203
204
pkgSpecifierConstraints (SpecificSourcePackage pkg) =
204
205
[LabeledPackageConstraint pc ConstraintSourceUserTarget ]
205
206
where
206
- pc = PackageConstraintVersion (packageName pkg)
207
- (thisVersion (packageVersion pkg))
207
+ pc = PackageConstraint (Q (PackagePath DefaultNamespace Unqualified )
208
+ (packageName pkg)) $
209
+ PackagePropertyVersion (thisVersion (packageVersion pkg))
208
210
209
211
-- ------------------------------------------------------------
210
212
-- * Parsing and checking user targets
@@ -414,6 +416,12 @@ data PackageTarget pkg =
414
416
-- * Converting user targets to package targets
415
417
-- ------------------------------------------------------------
416
418
419
+ dependencyToConstraints :: Dependency -> [PackageConstraint ]
420
+ dependencyToConstraints (Dependency name vrange) =
421
+ [ PackageConstraint (Q defaultPackagePath name) $
422
+ PackagePropertyVersion vrange
423
+ | not (isAnyVersion vrange) ]
424
+
417
425
-- | Given a user-specified target, expand it to a bunch of package targets
418
426
-- (each of which refers to only one package).
419
427
--
@@ -422,19 +430,17 @@ expandUserTarget :: FilePath
422
430
-> IO [PackageTarget (PackageLocation () )]
423
431
expandUserTarget worldFile userTarget = case userTarget of
424
432
425
- UserTargetNamed (Dependency name vrange) ->
426
- let constraints = [ PackageConstraintVersion name vrange
427
- | not (isAnyVersion vrange) ]
428
- in return [PackageTargetNamedFuzzy name constraints userTarget]
433
+ UserTargetNamed dep@ (Dependency name _) ->
434
+ return [PackageTargetNamedFuzzy name (dependencyToConstraints dep) userTarget]
429
435
430
436
UserTargetWorld -> do
431
437
worldPkgs <- World. getContents worldFile
432
438
-- TODO: should we warn if there are no world targets?
433
439
return [ PackageTargetNamed name constraints userTarget
434
- | World. WorldPkgInfo (Dependency name vrange ) flags <- worldPkgs
435
- , let constraints = [ PackageConstraintVersion name vrange
436
- | not (isAnyVersion vrange) ]
437
- ++ [ PackageConstraintFlags name flags
440
+ | World. WorldPkgInfo dep @ (Dependency name _ ) flags <- worldPkgs
441
+ , let constraints = dependencyToConstraints dep
442
+ ++ [ PackageConstraint ( Q defaultPackagePath name) $
443
+ PackagePropertyFlags flags
438
444
| not (null flags) ] ]
439
445
440
446
UserTargetLocalDir dir ->
@@ -701,40 +707,75 @@ extraPackageNameEnv names = PackageNameEnv pkgNameLookup
701
707
-- * Package constraints
702
708
-- ------------------------------------------------------------
703
709
704
- data UserConstraint =
705
- UserConstraintVersion PackageName VersionRange
706
- | UserConstraintInstalled PackageName
707
- | UserConstraintSource PackageName
708
- | UserConstraintFlags PackageName FlagAssignment
709
- | UserConstraintStanzas PackageName [OptionalStanza ]
710
- deriving (Eq , Show , Generic )
710
+ -- | Restricted version of 'Qualifier' that a user may specify on the command line.
711
+ data UserQualifier =
712
+ -- | Top-level dependency.
713
+ UserUnqualified
714
+
715
+ -- | Setup dependency.
716
+ | UserSetup PackageName
717
+
718
+ -- | Executable dependency.
719
+ | UserExe PackageName PackageName
720
+
721
+ fromUserQualifier :: UserQualifier -> Qualifier
722
+ fromUserQualifier UserUnqualified = Unqualified
723
+ fromUserQualifier (UserSetup name) = Setup name
724
+ fromUserQualifier (UserExe name1 name2) = Exe name1 name2
725
+
726
+ -- | A version of 'PackageProperty' that a user may specify on the command
727
+ -- line (currently, it has identical representation to 'PackageProperty').
728
+ newtype UserProperty = UserProperty PackageProperty
729
+
730
+ -- | Per-package constraints. Package constraints must be respected by the
731
+ -- solver. Multiple constraints for each package can be given, though obviously
732
+ -- it is possible to construct conflicting constraints (eg impossible version
733
+ -- range or inconsistent flag assignment).
734
+ --
735
+ instance Text UserProperty where
736
+ disp (PackagePropertyVersion verrange) = disp verrange
737
+ disp PackagePropertyInstalled = Disp. text " installed"
738
+ disp PackagePropertySource = Disp. text " source"
739
+ disp (PackagePropertyFlags flags) = dispFlagAssignment flags
740
+ disp (PackagePropertyStanzas stanzas) = dispStanzas stanzas
741
+ where
742
+ dispStanzas = Disp. hsep . map dispStanza
743
+ dispStanza TestStanzas = Disp. text " test"
744
+ dispStanza BenchStanzas = Disp. text " bench"
745
+
746
+ parse =
747
+ ((parse >>= return . PackagePropertyVersion )
748
+ +++ (do skipSpaces1
749
+ _ <- Parse. string " installed"
750
+ return (PackagePropertyInstalled ))
751
+ +++ (do skipSpaces1
752
+ _ <- Parse. string " source"
753
+ return (PackagePropertySource ))
754
+ +++ (do skipSpaces1
755
+ _ <- Parse. string " test"
756
+ return (PackagePropertyStanzas [TestStanzas ]))
757
+ +++ (do skipSpaces1
758
+ _ <- Parse. string " bench"
759
+ return (PackagePropertyStanzas [BenchStanzas ])))
760
+ <++ (do skipSpaces1
761
+ flags <- parseFlagAssignment
762
+ return (PackagePropertyFlags flags))
711
763
712
- instance Binary UserConstraint
764
+ -- | A restricted version of PackageConstraint that the user can specify on the
765
+ -- command line.
766
+ newtype UserConstraint = UserConstraint UserQualifier PackageName PackageProperty
767
+ deriving (Eq , Show )
713
768
714
769
userConstraintPackageName :: UserConstraint -> PackageName
715
- userConstraintPackageName uc = case uc of
716
- UserConstraintVersion name _ -> name
717
- UserConstraintInstalled name -> name
718
- UserConstraintSource name -> name
719
- UserConstraintFlags name _ -> name
720
- UserConstraintStanzas name _ -> name
770
+ userConstraintPackageName (UserConstraint _ name _ = name
721
771
722
772
userToPackageConstraint :: UserConstraint -> PackageConstraint
723
- -- At the moment, the types happen to be directly equivalent
724
- userToPackageConstraint uc = case uc of
725
- UserConstraintVersion name ver -> PackageConstraintVersion name ver
726
- UserConstraintInstalled name -> PackageConstraintInstalled name
727
- UserConstraintSource name -> PackageConstraintSource name
728
- UserConstraintFlags name flags -> PackageConstraintFlags name flags
729
- UserConstraintStanzas name stanzas -> PackageConstraintStanzas name stanzas
773
+ userToPackageConstraint (UserConstraint qual name pp) =
774
+ PackageConstraint (Q (fromUserQualifier qual) name) pp
730
775
731
776
renamePackageConstraint :: PackageName -> PackageConstraint -> PackageConstraint
732
- renamePackageConstraint name pc = case pc of
733
- PackageConstraintVersion _ ver -> PackageConstraintVersion name ver
734
- PackageConstraintInstalled _ -> PackageConstraintInstalled name
735
- PackageConstraintSource _ -> PackageConstraintSource name
736
- PackageConstraintFlags _ flags -> PackageConstraintFlags name flags
737
- PackageConstraintStanzas _ stanzas -> PackageConstraintStanzas name stanzas
777
+ renamePackageConstraint name (PackageConstraint (Q path _) pp) =
778
+ PackageConstraint (Q path name) pp
738
779
739
780
readUserConstraint :: String -> Either String UserConstraint
740
781
readUserConstraint str =
0 commit comments