1
+ {-# LANGUAGE DeriveGeneric #-}
1
2
-----------------------------------------------------------------------------
2
3
-- |
3
4
-- Module : Distribution.Client.World
@@ -33,22 +34,20 @@ import Prelude (sequence)
33
34
import Distribution.Client.Compat.Prelude hiding (getContents )
34
35
35
36
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 )
39
40
import Distribution.Verbosity
40
41
( Verbosity )
41
42
import Distribution.Simple.Utils
42
43
( 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
46
48
import Distribution.Compat.Exception ( catchIO )
47
49
import qualified Text.PrettyPrint as Disp
48
50
49
-
50
- import Data.Char as Char
51
-
52
51
import Data.List
53
52
( unionBy , deleteFirstsBy )
54
53
import System.IO.Error
@@ -57,7 +56,7 @@ import qualified Data.ByteString.Lazy.Char8 as B
57
56
58
57
59
58
data WorldPkgInfo = WorldPkgInfo Dependency FlagAssignment
60
- deriving (Show ,Eq )
59
+ deriving (Show ,Eq , Generic )
61
60
62
61
-- | Adds packages to the world file; creates the file if it doesn't
63
62
-- exist yet. Version constraints and flag assignments for a package are
@@ -102,7 +101,7 @@ modifyWorld f verbosity world pkgs =
102
101
then do
103
102
info verbosity " Updating world file..."
104
103
writeFileAtomic world . B. pack $ unlines
105
- [ (display pkg) | pkg <- pkgsNewWorld]
104
+ [ (prettyShow pkg) | pkg <- pkgsNewWorld]
106
105
else
107
106
info verbosity " World file is already up to date."
108
107
@@ -111,7 +110,7 @@ modifyWorld f verbosity world pkgs =
111
110
getContents :: Verbosity -> FilePath -> IO [WorldPkgInfo ]
112
111
getContents verbosity world = do
113
112
content <- safelyReadFile world
114
- let result = map simpleParse (lines $ B. unpack content)
113
+ let result = map simpleParsec (lines $ B. unpack content)
115
114
case sequence result of
116
115
Nothing -> die' verbosity " Could not parse world file."
117
116
Just xs -> return xs
@@ -123,51 +122,34 @@ getContents verbosity world = do
123
122
| otherwise = ioError e
124
123
125
124
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)
128
127
where
129
128
dispFlags [] = Disp. empty
130
129
dispFlags fs = Disp. text " --flags="
131
130
<<>> Disp. doubleQuotes (flagAssToDoc fs)
132
131
flagAssToDoc = foldr (\ (fname,val) flagAssDoc ->
133
132
(if not val then Disp. char ' -'
134
- else Disp. empty )
133
+ else Disp. char ' + ' )
135
134
<<>> Disp. text (unFlagName fname)
136
135
Disp. <+> flagAssDoc)
137
136
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
142
143
return $ WorldPkgInfo dep flagAss
143
144
where
144
- parseFlagAssignment :: Parse. ReadP r FlagAssignment
145
+ parseFlagAssignment :: CabalParsing m => m FlagAssignment
145
146
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
151
149
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 ' "' )
165
151
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 " \" " )
0 commit comments