Skip to content

Commit d037a34

Browse files
committed
Make cabal-install use parsec parser
1 parent 7759eb7 commit d037a34

File tree

15 files changed

+140
-41
lines changed

15 files changed

+140
-41
lines changed

Cabal/Distribution/PackageDescription/Parsec.hs

+9
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/tests/ParserHackageTests.hs

+2-3
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

+8-3
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

+8-2
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

+8-2
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

+34-10
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/ProjectConfig.hs

+7-2
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,13 @@ import Distribution.System
7575
( Platform )
7676
import Distribution.PackageDescription
7777
( SourceRepo(..) )
78+
#if CABAL_PARSEC
79+
import Distribution.PackageDescription.Parsec
80+
( readGenericPackageDescription )
81+
#else
7882
import Distribution.PackageDescription.Parse
79-
( readPackageDescription )
83+
( readGenericPackageDescription )
84+
#endif
8085
import Distribution.Simple.Compiler
8186
( Compiler, compilerInfo )
8287
import Distribution.Simple.Program
@@ -866,7 +871,7 @@ readSourcePackage verbosity (ProjectPackageLocalCabalFile cabalFile) =
866871
readSourcePackage verbosity (ProjectPackageLocalDirectory dir cabalFile) = do
867872
monitorFiles [monitorFileHashed cabalFile]
868873
root <- askRoot
869-
pkgdesc <- liftIO $ readPackageDescription verbosity (root </> cabalFile)
874+
pkgdesc <- liftIO $ readGenericPackageDescription verbosity (root </> cabalFile)
870875
return SourcePackage {
871876
packageInfoId = packageId pkgdesc,
872877
packageDescription = pkgdesc,

cabal-install/Distribution/Client/Sandbox.hs

+8-3
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
{-# LANGUAGE CPP #-}
12
{-# LANGUAGE FlexibleContexts #-}
23
-----------------------------------------------------------------------------
34
-- |
@@ -79,7 +80,11 @@ import Distribution.Client.Utils ( inDir, tryCanonicalizePath
7980
, tryFindAddSourcePackageDesc)
8081
import Distribution.PackageDescription.Configuration
8182
( flattenPackageDescription )
82-
import Distribution.PackageDescription.Parse ( readPackageDescription )
83+
#ifdef CABAL_PARSEC
84+
import Distribution.PackageDescription.Parsec ( readGenericPackageDescription )
85+
#else
86+
import Distribution.PackageDescription.Parse ( readGenericPackageDescription )
87+
#endif
8388
import Distribution.Simple.Compiler ( Compiler(..), PackageDB(..) )
8489
import Distribution.Simple.Configure ( configCompilerAuxEx
8590
, getPackageDBContents
@@ -436,7 +441,7 @@ sandboxAddSourceSnapshot verbosity buildTreeRefs sandboxDir pkgEnv = do
436441
pkgs <- forM buildTreeRefs $ \buildTreeRef ->
437442
inDir (Just buildTreeRef) $
438443
return . flattenPackageDescription
439-
=<< readPackageDescription verbosity
444+
=<< readGenericPackageDescription verbosity
440445
=<< defaultPackageDesc verbosity
441446

442447
-- Copy the package sources to "snapshots/$PKGNAME-$VERSION-tmp". If
@@ -735,7 +740,7 @@ withSandboxPackageInfo verbosity configFlags globalFlags
735740
let err = "Error reading sandbox package information."
736741
-- Get the package descriptions for all add-source deps.
737742
depsCabalFiles <- mapM (flip tryFindAddSourcePackageDesc err) buildTreeRefs
738-
depsPkgDescs <- mapM (readPackageDescription verbosity) depsCabalFiles
743+
depsPkgDescs <- mapM (readGenericPackageDescription verbosity) depsCabalFiles
739744
let depsMap = M.fromList (zip buildTreeRefs depsPkgDescs)
740745
isInstalled pkgid = not . null
741746
. InstalledPackageIndex.lookupSourcePackageId installedPkgIndex $ pkgid

cabal-install/Distribution/Client/SetupWrapper.hs

+7-2
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,13 @@ import Distribution.PackageDescription
3939
( GenericPackageDescription(packageDescription)
4040
, PackageDescription(..), specVersion
4141
, BuildType(..), knownBuildTypes, defaultRenaming )
42+
#ifdef CABAL_PARSEC
43+
import Distribution.PackageDescription.Parsec
44+
( readGenericPackageDescription )
45+
#else
4246
import Distribution.PackageDescription.Parse
43-
( readPackageDescription )
47+
( readGenericPackageDescription )
48+
#endif
4449
import Distribution.Simple.Configure
4550
( configCompilerEx )
4651
import Distribution.Compiler
@@ -302,7 +307,7 @@ getSetup verbosity options mpkg = do
302307
}
303308
where
304309
getPkg = tryFindPackageDesc (fromMaybe "." (useWorkingDir options))
305-
>>= readPackageDescription verbosity
310+
>>= readGenericPackageDescription verbosity
306311
>>= return . packageDescription
307312

308313
checkBuildType (UnknownBuildType name) =

cabal-install/Distribution/Client/SrcDist.hs

+9-3
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
{-# LANGUAGE CPP #-}
12
{-# LANGUAGE NondecreasingIndentation #-}
23
{-# LANGUAGE FlexibleContexts #-}
34
-- Implements the \"@.\/cabal sdist@\" command, which creates a source
@@ -19,8 +20,13 @@ import Distribution.PackageDescription
1920
( PackageDescription )
2021
import Distribution.PackageDescription.Configuration
2122
( flattenPackageDescription )
23+
#ifdef CABAL_PARSEC
24+
import Distribution.PackageDescription.Parsec
25+
( readGenericPackageDescription )
26+
#else
2227
import Distribution.PackageDescription.Parse
23-
( readPackageDescription )
28+
( readGenericPackageDescription )
29+
#endif
2430
import Distribution.Simple.Utils
2531
( createDirectoryIfMissingVerbose, defaultPackageDesc
2632
, warn, die, notice, withTempDirectory )
@@ -51,7 +57,7 @@ import Control.Exception (IOException, evaluate)
5157
sdist :: SDistFlags -> SDistExFlags -> IO ()
5258
sdist flags exflags = do
5359
pkg <- liftM flattenPackageDescription
54-
(readPackageDescription verbosity =<< defaultPackageDesc verbosity)
60+
(readGenericPackageDescription verbosity =<< defaultPackageDesc verbosity)
5561
let withDir :: (FilePath -> IO a) -> IO a
5662
withDir = if not needMakeArchive then \f -> f tmpTargetDir
5763
else withTempDirectory verbosity tmpTargetDir "sdist."
@@ -156,7 +162,7 @@ allPackageSourceFiles verbosity setupOpts0 packageDir = do
156162
pkg <- do
157163
let err = "Error reading source files of package."
158164
desc <- tryFindAddSourcePackageDesc packageDir err
159-
flattenPackageDescription `fmap` readPackageDescription verbosity desc
165+
flattenPackageDescription `fmap` readGenericPackageDescription verbosity desc
160166
globalTmp <- getTemporaryDirectory
161167
withTempDirectory verbosity globalTmp "cabal-list-sources." $ \tempDir -> do
162168
let file = tempDir </> "cabal-sdist-list-sources"

0 commit comments

Comments
 (0)