Skip to content

Commit c621a78

Browse files
authored
Merge pull request #4235 from phadej/cabal-install-parsec-2
parsec for cabal-install
2 parents 4d08a8a + b27aa25 commit c621a78

File tree

18 files changed

+167
-52
lines changed

18 files changed

+167
-52
lines changed

Cabal/Distribution/PackageDescription/Parse.hs

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@
1919

2020
module Distribution.PackageDescription.Parse (
2121
-- * Package descriptions
22+
readGenericPackageDescription,
23+
parseGenericPackageDescription,
24+
25+
-- ** Deprecated names
2226
readPackageDescription,
2327
parsePackageDescription,
2428

@@ -592,10 +596,14 @@ readHookedBuildInfo :: Verbosity -> FilePath -> IO HookedBuildInfo
592596
readHookedBuildInfo =
593597
readAndParseFile withFileContents parseHookedBuildInfo
594598

595-
-- |Parse the given package file.
596599
readPackageDescription :: Verbosity -> FilePath -> IO GenericPackageDescription
597-
readPackageDescription =
598-
readAndParseFile withUTF8FileContents parsePackageDescription
600+
readPackageDescription = readGenericPackageDescription
601+
{-# DEPRECATED readPackageDescription "Use readGenericPackageDescription, old name is missleading." #-}
602+
603+
-- | Parse the given package file.
604+
readGenericPackageDescription :: Verbosity -> FilePath -> IO GenericPackageDescription
605+
readGenericPackageDescription =
606+
readAndParseFile withUTF8FileContents parseGenericPackageDescription
599607

600608
stanzas :: [Field] -> [[Field]]
601609
stanzas [] = []
@@ -713,12 +721,16 @@ skipField = modify tail
713721
--FIXME: this should take a ByteString, not a String. We have to be able to
714722
-- decode UTF8 and handle the BOM.
715723

724+
parsePackageDescription :: String -> ParseResult GenericPackageDescription
725+
parsePackageDescription = parseGenericPackageDescription
726+
{-# DEPRECATED parsePackageDescription "Use parseGenericPackageDescription, old name is missleading" #-}
727+
716728
-- | Parses the given file into a 'GenericPackageDescription'.
717729
--
718730
-- In Cabal 1.2 the syntax for package descriptions was changed to a format
719731
-- with sections and possibly indented property descriptions.
720-
parsePackageDescription :: String -> ParseResult GenericPackageDescription
721-
parsePackageDescription file = do
732+
parseGenericPackageDescription :: String -> ParseResult GenericPackageDescription
733+
parseGenericPackageDescription file = do
722734

723735
-- This function is quite complex because it needs to be able to parse
724736
-- both pre-Cabal-1.2 and post-Cabal-1.2 files. Additionally, it contains

Cabal/Distribution/PackageDescription/Parsec.hs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,11 @@ module Distribution.PackageDescription.Parsec (
1919
-- * Package descriptions
2020
readGenericPackageDescription,
2121
parseGenericPackageDescription,
22+
parseGenericPackageDescriptionMaybe,
2223

2324
-- ** Parsing
2425
ParseResult,
26+
runParseResult,
2527

2628
-- ** Supplementary build information
2729
-- readHookedBuildInfo,
@@ -105,6 +107,13 @@ parseGenericPackageDescription bs = case readFields' bs of
105107
-- TODO: better marshalling of errors
106108
Left perr -> parseFatalFailure (Position 0 0) (show perr)
107109

110+
-- | 'Maybe' variant of 'parseGenericPackageDescription'
111+
parseGenericPackageDescriptionMaybe :: BS.ByteString -> Maybe GenericPackageDescription
112+
parseGenericPackageDescriptionMaybe =
113+
trdOf3 . runParseResult . parseGenericPackageDescription
114+
where
115+
trdOf3 (_, _, x) = x
116+
108117
runFieldParser :: FieldParser a -> [FieldLine Position] -> ParseResult a
109118
runFieldParser p ls = runFieldParser' pos p =<< fieldlinesToString pos ls
110119
where

Cabal/Distribution/Simple.hs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -237,10 +237,8 @@ confPkgDescr hooks verbosity mb_path = do
237237
Just path -> return path
238238
#ifdef CABAL_PARSEC
239239
info verbosity "Using Parsec parser"
240-
descr <- readGenericPackageDescription verbosity pdfile
241-
#else
242-
descr <- readPackageDescription verbosity pdfile
243240
#endif
241+
descr <- readGenericPackageDescription verbosity pdfile
244242
return (Just pdfile, descr)
245243

246244
buildAction :: UserHooks -> BuildFlags -> Args -> IO ()

Cabal/tests/ParserHackageTests.hs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ import qualified Distribution.PackageDescription.Parse as ReadP
3030
import qualified Distribution.PackageDescription.Parsec as Parsec
3131
import qualified Distribution.Parsec.Parser as Parsec
3232
import qualified Distribution.Parsec.Types.Common as Parsec
33-
import qualified Distribution.Parsec.Types.ParseResult as Parsec
3433
import qualified Distribution.ParseUtils as ReadP
3534
import qualified Distribution.Compat.DList as DList
3635

@@ -97,7 +96,7 @@ compareTest pfx fpath bsl
9796
let str = ignoreBOM $ fromUTF8LBS bsl
9897

9998
putStrLn $ "::: " ++ fpath
100-
(readp, readpWarnings) <- case ReadP.parsePackageDescription str of
99+
(readp, readpWarnings) <- case ReadP.parseGenericPackageDescription str of
101100
ReadP.ParseOk ws x -> return (x, ws)
102101
ReadP.ParseFailed err -> print err >> exitFailure
103102
traverse_ (putStrLn . ReadP.showPWarning fpath) readpWarnings
@@ -155,7 +154,7 @@ compareTest pfx fpath bsl
155154
parseReadpTest :: FilePath -> BSL.ByteString -> IO ()
156155
parseReadpTest fpath bsl = when (not $ any ($ fpath) problematicFiles) $ do
157156
let str = fromUTF8LBS bsl
158-
case ReadP.parsePackageDescription str of
157+
case ReadP.parseGenericPackageDescription str of
159158
ReadP.ParseOk _ _ -> return ()
160159
ReadP.ParseFailed err -> print err >> exitFailure
161160

cabal-install/Distribution/Client/Check.hs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
{-# LANGUAGE CPP #-}
12
-----------------------------------------------------------------------------
23
-- |
34
-- Module : Distribution.Client.Check
@@ -17,8 +18,12 @@ module Distribution.Client.Check (
1718

1819
import Control.Monad ( when, unless )
1920

20-
import Distribution.PackageDescription.Parse
21-
( readPackageDescription )
21+
#ifdef CABAL_PARSEC
22+
import Distribution.PackageDescription.Parsec ( readGenericPackageDescription )
23+
#else
24+
import Distribution.PackageDescription.Parse ( readGenericPackageDescription )
25+
#endif
26+
2227
import Distribution.PackageDescription.Check
2328
import Distribution.PackageDescription.Configuration
2429
( flattenPackageDescription )
@@ -30,7 +35,7 @@ import Distribution.Simple.Utils
3035
check :: Verbosity -> IO Bool
3136
check verbosity = do
3237
pdfile <- defaultPackageDesc verbosity
33-
ppd <- readPackageDescription verbosity pdfile
38+
ppd <- readGenericPackageDescription verbosity pdfile
3439
-- flatten the generic package description into a regular package
3540
-- description
3641
-- TODO: this may give more warnings than it should give;

cabal-install/Distribution/Client/Configure.hs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
{-# LANGUAGE CPP #-}
12
-----------------------------------------------------------------------------
23
-- |
34
-- Module : Distribution.Client.Configure
@@ -67,8 +68,13 @@ import Distribution.Package
6768
import Distribution.Types.Dependency
6869
( Dependency(..), thisPackageVersion )
6970
import qualified Distribution.PackageDescription as PkgDesc
71+
#ifdef CABAL_PARSEC
72+
import Distribution.PackageDescription.Parsec
73+
( readGenericPackageDescription )
74+
#else
7075
import Distribution.PackageDescription.Parse
71-
( readPackageDescription )
76+
( readGenericPackageDescription )
77+
#endif
7278
import Distribution.PackageDescription.Configuration
7379
( finalizePD )
7480
import Distribution.Version
@@ -296,7 +302,7 @@ planLocalPackage :: Verbosity -> Compiler
296302
-> IO (Progress String String SolverInstallPlan)
297303
planLocalPackage verbosity comp platform configFlags configExFlags
298304
installedPkgIndex (SourcePackageDb _ packagePrefs) pkgConfigDb = do
299-
pkg <- readPackageDescription verbosity =<<
305+
pkg <- readGenericPackageDescription verbosity =<<
300306
case flagToMaybe (configCabalFilePath configFlags) of
301307
Nothing -> defaultPackageDesc verbosity
302308
Just fp -> return fp

cabal-install/Distribution/Client/GenBounds.hs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
{-# LANGUAGE CPP #-}
12
-----------------------------------------------------------------------------
23
-- |
34
-- Module : Distribution.Client.GenBounds
@@ -28,8 +29,13 @@ import Distribution.PackageDescription
2829
( buildDepends )
2930
import Distribution.PackageDescription.Configuration
3031
( finalizePD )
32+
#ifdef CABAL_PARSEC
33+
import Distribution.PackageDescription.Parsec
34+
( readGenericPackageDescription )
35+
#else
3136
import Distribution.PackageDescription.Parse
32-
( readPackageDescription )
37+
( readGenericPackageDescription )
38+
#endif
3339
import Distribution.Types.ComponentRequestedSpec
3440
( defaultComponentRequestedSpec )
3541
import Distribution.Types.Dependency
@@ -109,7 +115,7 @@ genBounds verbosity packageDBs repoCtxt comp platform progdb mSandboxPkgInfo
109115

110116
cwd <- getCurrentDirectory
111117
path <- tryFindPackageDesc cwd
112-
gpd <- readPackageDescription verbosity path
118+
gpd <- readGenericPackageDescription verbosity path
113119
-- NB: We don't enable tests or benchmarks, since often they
114120
-- don't really have useful bounds.
115121
let epd = finalizePD [] defaultComponentRequestedSpec

cabal-install/Distribution/Client/IndexUtils.hs

Lines changed: 34 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
{-# LANGUAGE CPP #-}
12
{-# LANGUAGE DeriveGeneric #-}
23
{-# LANGUAGE RecordWildCards #-}
34
{-# LANGUAGE BangPatterns #-}
@@ -51,30 +52,39 @@ import Distribution.Package
5152
, Package(..), packageVersion, packageName )
5253
import Distribution.Types.Dependency
5354
import Distribution.Simple.PackageIndex (InstalledPackageIndex)
54-
import qualified Distribution.PackageDescription.Parse as PackageDesc.Parse
5555
import Distribution.PackageDescription
5656
( GenericPackageDescription )
57-
import Distribution.PackageDescription.Parse
58-
( parsePackageDescription )
5957
import Distribution.Simple.Compiler
6058
( Compiler, PackageDBStack )
6159
import Distribution.Simple.Program
6260
( ProgramDb )
6361
import qualified Distribution.Simple.Configure as Configure
6462
( getInstalledPackages, getInstalledPackagesMonitorFiles )
65-
import Distribution.ParseUtils
66-
( ParseResult(..) )
6763
import Distribution.Version
6864
( mkVersion, intersectVersionRanges )
6965
import Distribution.Text
7066
( display, simpleParse )
7167
import Distribution.Verbosity
7268
( Verbosity, normal, lessVerbose )
7369
import Distribution.Simple.Utils
74-
( die, warn, info, fromUTF8, ignoreBOM )
70+
( die, warn, info )
7571
import Distribution.Client.Setup
7672
( RepoContext(..) )
7773

74+
#ifdef CABAL_PARSEC
75+
import Distribution.PackageDescription.Parsec
76+
( parseGenericPackageDescriptionMaybe )
77+
import qualified Distribution.PackageDescription.Parsec as PackageDesc.Parse
78+
#else
79+
import Distribution.ParseUtils
80+
( ParseResult(..) )
81+
import Distribution.PackageDescription.Parse
82+
( parseGenericPackageDescription )
83+
import Distribution.Simple.Utils
84+
( fromUTF8, ignoreBOM )
85+
import qualified Distribution.PackageDescription.Parse as PackageDesc.Parse
86+
#endif
87+
7888
import Distribution.Solver.Types.PackageIndex (PackageIndex)
7989
import qualified Distribution.Solver.Types.PackageIndex as PackageIndex
8090
import Distribution.Solver.Types.SourcePackage
@@ -434,12 +444,20 @@ extractPkg entry blockNo = case Tar.entryContent entry of
434444
Just ver -> Just . return $ Just (NormalPackage pkgid descr content blockNo)
435445
where
436446
pkgid = PackageIdentifier (mkPackageName pkgname) ver
437-
parsed = parsePackageDescription . ignoreBOM . fromUTF8 . BS.Char8.unpack
447+
#ifdef CABAL_PARSEC
448+
parsed = parseGenericPackageDescriptionMaybe (BS.toStrict content)
449+
descr = case parsed of
450+
Just d -> d
451+
Nothing -> error $ "Couldn't read cabal file "
452+
++ show fileName
453+
#else
454+
parsed = parseGenericPackageDescription . ignoreBOM . fromUTF8 . BS.Char8.unpack
438455
$ content
439456
descr = case parsed of
440457
ParseOk _ d -> d
441458
_ -> error $ "Couldn't read cabal file "
442459
++ show fileName
460+
#endif
443461
_ -> Nothing
444462
_ -> Nothing
445463

@@ -451,7 +469,7 @@ extractPkg entry blockNo = case Tar.entryContent entry of
451469
result <- if not dirExists then return Nothing
452470
else do
453471
cabalFile <- tryFindAddSourcePackageDesc path "Error reading package index."
454-
descr <- PackageDesc.Parse.readPackageDescription normal cabalFile
472+
descr <- PackageDesc.Parse.readGenericPackageDescription normal cabalFile
455473
return . Just $ BuildTreeRef (refTypeFromTypeCode typeCode) (packageId descr)
456474
descr path blockNo
457475
return result
@@ -674,7 +692,7 @@ packageListFromCache mkPkg hnd Cache{..} mode = accum mempty [] mempty cacheEntr
674692
path <- liftM byteStringToFilePath . getEntryContent $ blockno
675693
pkg <- do let err = "Error reading package index from cache."
676694
file <- tryFindAddSourcePackageDesc path err
677-
PackageDesc.Parse.readPackageDescription normal file
695+
PackageDesc.Parse.readGenericPackageDescription normal file
678696
let srcpkg = mkPkg (BuildTreeRef refType (packageId pkg) pkg path blockno)
679697
accum srcpkgs (srcpkg:btrs) prefs entries
680698

@@ -693,9 +711,15 @@ packageListFromCache mkPkg hnd Cache{..} mode = accum mempty [] mempty cacheEntr
693711

694712
readPackageDescription :: ByteString -> IO GenericPackageDescription
695713
readPackageDescription content =
696-
case parsePackageDescription . ignoreBOM . fromUTF8 . BS.Char8.unpack $ content of
714+
#ifdef CABAL_PARSEC
715+
case parseGenericPackageDescriptionMaybe (BS.toStrict content) of
716+
Just gpd -> return gpd
717+
Nothing -> interror "failed to parse .cabal file"
718+
#else
719+
case parseGenericPackageDescription . ignoreBOM . fromUTF8 . BS.Char8.unpack $ content of
697720
ParseOk _ d -> return d
698721
_ -> interror "failed to parse .cabal file"
722+
#endif
699723

700724
interror msg = die $ "internal error when reading package index: " ++ msg
701725
++ "The package index or index cache is probably "

cabal-install/Distribution/Client/Outdated.hs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
{-# LANGUAGE CPP #-}
12
-----------------------------------------------------------------------------
23
-- |
34
-- Module : Distribution.Client.Outdated
@@ -28,8 +29,6 @@ import Distribution.Client.Sandbox.PackageEnvironment
2829
import Distribution.Package (PackageName, packageVersion)
2930
import Distribution.PackageDescription (buildDepends)
3031
import Distribution.PackageDescription.Configuration (finalizePD)
31-
import Distribution.PackageDescription.Parse
32-
(readPackageDescription)
3332
import Distribution.Simple.Compiler (Compiler, compilerInfo)
3433
import Distribution.Simple.Setup (fromFlagOrDefault)
3534
import Distribution.Simple.Utils
@@ -43,6 +42,13 @@ import Distribution.Verbosity (Verbosity, silent)
4342
import Distribution.Version
4443
(Version, LowerBound(..), UpperBound(..)
4544
,asVersionIntervals, majorBoundVersion)
45+
#ifdef CABAL_PARSEC
46+
import Distribution.PackageDescription.Parsec
47+
(readGenericPackageDescription)
48+
#else
49+
import Distribution.PackageDescription.Parse
50+
(readGenericPackageDescription)
51+
#endif
4652

4753
import qualified Data.Set as S
4854
import System.Directory (getCurrentDirectory)
@@ -134,7 +140,7 @@ depsFromPkgDesc :: Verbosity -> Compiler -> Platform -> IO [Dependency]
134140
depsFromPkgDesc verbosity comp platform = do
135141
cwd <- getCurrentDirectory
136142
path <- tryFindPackageDesc cwd
137-
gpd <- readPackageDescription verbosity path
143+
gpd <- readGenericPackageDescription verbosity path
138144
let cinfo = compilerInfo comp
139145
epd = finalizePD [] (ComponentRequestedSpec True True)
140146
(const True) platform cinfo [] gpd

cabal-install/Distribution/Client/ProjectConfig.hs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,13 @@ import Distribution.System
7676
( Platform )
7777
import Distribution.PackageDescription
7878
( SourceRepo(..) )
79+
#if CABAL_PARSEC
80+
import Distribution.PackageDescription.Parsec
81+
( readGenericPackageDescription )
82+
#else
7983
import Distribution.PackageDescription.Parse
80-
( readPackageDescription )
84+
( readGenericPackageDescription )
85+
#endif
8186
import Distribution.Simple.Compiler
8287
( Compiler, compilerInfo )
8388
import Distribution.Simple.Program
@@ -867,7 +872,7 @@ readSourcePackage verbosity (ProjectPackageLocalCabalFile cabalFile) =
867872
readSourcePackage verbosity (ProjectPackageLocalDirectory dir cabalFile) = do
868873
monitorFiles [monitorFileHashed cabalFile]
869874
root <- askRoot
870-
pkgdesc <- liftIO $ readPackageDescription verbosity (root </> cabalFile)
875+
pkgdesc <- liftIO $ readGenericPackageDescription verbosity (root </> cabalFile)
871876
return SourcePackage {
872877
packageInfoId = packageId pkgdesc,
873878
packageDescription = pkgdesc,

0 commit comments

Comments
 (0)