Skip to content

Commit 276cbd5

Browse files
committed
Remove Text WorldPkgInfo
1 parent 4e7f733 commit 276cbd5

File tree

3 files changed

+39
-46
lines changed

3 files changed

+39
-46
lines changed

cabal-install/Distribution/Client/World.hs

Lines changed: 28 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
{-# LANGUAGE DeriveGeneric #-}
12
-----------------------------------------------------------------------------
23
-- |
34
-- Module : Distribution.Client.World
@@ -33,22 +34,20 @@ import Prelude (sequence)
3334
import Distribution.Client.Compat.Prelude hiding (getContents)
3435

3536
import Distribution.Types.Dependency
36-
import Distribution.PackageDescription
37-
( FlagAssignment, mkFlagAssignment, unFlagAssignment
38-
, mkFlagName, unFlagName )
37+
import Distribution.Types.Flag
38+
( FlagAssignment, unFlagAssignment
39+
, unFlagName, parsecFlagAssignmentNonEmpty, describeFlagAssignmentNonEmpty )
3940
import Distribution.Verbosity
4041
( Verbosity )
4142
import Distribution.Simple.Utils
4243
( die', info, chattyTry, writeFileAtomic )
43-
import Distribution.Deprecated.Text
44-
( Text(..), display, simpleParse )
45-
import qualified Distribution.Deprecated.ReadP as Parse
44+
import Distribution.Parsec (Parsec (..), CabalParsing, simpleParsec)
45+
import Distribution.Pretty (Pretty (..), prettyShow)
46+
import Distribution.FieldGrammar.Described (Described (..), GrammarRegex (..))
47+
import qualified Distribution.Compat.CharParsing as P
4648
import Distribution.Compat.Exception ( catchIO )
4749
import qualified Text.PrettyPrint as Disp
4850

49-
50-
import Data.Char as Char
51-
5251
import Data.List
5352
( unionBy, deleteFirstsBy )
5453
import System.IO.Error
@@ -57,7 +56,7 @@ import qualified Data.ByteString.Lazy.Char8 as B
5756

5857

5958
data WorldPkgInfo = WorldPkgInfo Dependency FlagAssignment
60-
deriving (Show,Eq)
59+
deriving (Show,Eq, Generic)
6160

6261
-- | Adds packages to the world file; creates the file if it doesn't
6362
-- exist yet. Version constraints and flag assignments for a package are
@@ -102,7 +101,7 @@ modifyWorld f verbosity world pkgs =
102101
then do
103102
info verbosity "Updating world file..."
104103
writeFileAtomic world . B.pack $ unlines
105-
[ (display pkg) | pkg <- pkgsNewWorld]
104+
[ (prettyShow pkg) | pkg <- pkgsNewWorld]
106105
else
107106
info verbosity "World file is already up to date."
108107

@@ -111,7 +110,7 @@ modifyWorld f verbosity world pkgs =
111110
getContents :: Verbosity -> FilePath -> IO [WorldPkgInfo]
112111
getContents verbosity world = do
113112
content <- safelyReadFile world
114-
let result = map simpleParse (lines $ B.unpack content)
113+
let result = map simpleParsec (lines $ B.unpack content)
115114
case sequence result of
116115
Nothing -> die' verbosity "Could not parse world file."
117116
Just xs -> return xs
@@ -123,51 +122,34 @@ getContents verbosity world = do
123122
| otherwise = ioError e
124123

125124

126-
instance Text WorldPkgInfo where
127-
disp (WorldPkgInfo dep flags) = disp dep Disp.<+> dispFlags (unFlagAssignment flags)
125+
instance Pretty WorldPkgInfo where
126+
pretty (WorldPkgInfo dep flags) = pretty dep Disp.<+> dispFlags (unFlagAssignment flags)
128127
where
129128
dispFlags [] = Disp.empty
130129
dispFlags fs = Disp.text "--flags="
131130
<<>> Disp.doubleQuotes (flagAssToDoc fs)
132131
flagAssToDoc = foldr (\(fname,val) flagAssDoc ->
133132
(if not val then Disp.char '-'
134-
else Disp.empty)
133+
else Disp.char '+')
135134
<<>> Disp.text (unFlagName fname)
136135
Disp.<+> flagAssDoc)
137136
Disp.empty
138-
parse = do
139-
dep <- parse
140-
Parse.skipSpaces
141-
flagAss <- Parse.option mempty parseFlagAssignment
137+
138+
instance Parsec WorldPkgInfo where
139+
parsec = do
140+
dep <- parsec
141+
P.spaces
142+
flagAss <- P.option mempty parseFlagAssignment
142143
return $ WorldPkgInfo dep flagAss
143144
where
144-
parseFlagAssignment :: Parse.ReadP r FlagAssignment
145+
parseFlagAssignment :: CabalParsing m => m FlagAssignment
145146
parseFlagAssignment = do
146-
_ <- Parse.string "--flags"
147-
Parse.skipSpaces
148-
_ <- Parse.char '='
149-
Parse.skipSpaces
150-
mkFlagAssignment <$> (inDoubleQuotes $ Parse.many1 flag)
147+
_ <- P.string "--flags="
148+
inDoubleQuotes parsecFlagAssignmentNonEmpty
151149
where
152-
inDoubleQuotes :: Parse.ReadP r a -> Parse.ReadP r a
153-
inDoubleQuotes = Parse.between (Parse.char '"') (Parse.char '"')
154-
155-
flag = do
156-
Parse.skipSpaces
157-
val <- negative Parse.+++ positive
158-
name <- ident
159-
Parse.skipSpaces
160-
return (mkFlagName name,val)
161-
negative = do
162-
_ <- Parse.char '-'
163-
return False
164-
positive = return True
150+
inDoubleQuotes = P.between (P.char '"') (P.char '"')
165151

166-
ident :: Parse.ReadP r String
167-
ident = do
168-
-- First character must be a letter/digit to avoid flags
169-
-- like "+-debug":
170-
c <- Parse.satisfy Char.isAlphaNum
171-
cs <- Parse.munch (\ch -> Char.isAlphaNum ch || ch == '_'
172-
|| ch == '-')
173-
return (c:cs)
152+
instance Described WorldPkgInfo where
153+
describe _ =
154+
describe (Proxy :: Proxy Dependency)
155+
<> REOpt (RESpaces1 <> fromString "--flags=\"" <> describeFlagAssignmentNonEmpty <> fromString "\"")

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import Distribution.Client.InstallSymlink (OverwritePolicy)
3737
import Distribution.Client.Targets
3838
import Distribution.Client.Types (RepoName (..), WriteGhcEnvironmentFilesPolicy)
3939
import Distribution.Client.Types.AllowNewer
40+
import Distribution.Client.World (WorldPkgInfo (..))
4041
import Distribution.Solver.Types.OptionalStanza (OptionalStanza (..))
4142
import Distribution.Solver.Types.PackageConstraint (PackageProperty (..))
4243

@@ -260,6 +261,14 @@ instance Arbitrary RelaxDepSubject where
260261
instance Arbitrary RelaxedDep where
261262
arbitrary = RelaxedDep <$> arbitrary <*> arbitrary <*> arbitrary
262263

264+
-------------------------------------------------------------------------------
265+
-- WorldPkgInfo
266+
-------------------------------------------------------------------------------
267+
268+
instance Arbitrary WorldPkgInfo where
269+
arbitrary = WorldPkgInfo <$> arbitrary <*> arbitrary
270+
shrink = genericShrink
271+
263272
-------------------------------------------------------------------------------
264273
-- UserConstraint
265274
-------------------------------------------------------------------------------

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import Distribution.Client.IndexUtils.Timestamp (Timestamp)
2323
import Distribution.Client.Targets (UserConstraint)
2424
import Distribution.Client.Types (RepoName)
2525
import Distribution.Client.Types.AllowNewer (RelaxDepSubject, RelaxDeps, RelaxedDep)
26+
import Distribution.Client.World (WorldPkgInfo)
2627

2728
import qualified RERE as RE
2829
import qualified RERE.CharSet as RE
@@ -41,6 +42,7 @@ tests = testGroup "Described"
4142
, testDescribed (Proxy :: Proxy RelaxedDep)
4243
, testDescribed (Proxy :: Proxy RelaxDeps)
4344
, testDescribed (Proxy :: Proxy UserConstraint)
45+
, testDescribed (Proxy :: Proxy WorldPkgInfo)
4446
]
4547

4648
-------------------------------------------------------------------------------

0 commit comments

Comments
 (0)