Merge pull request #251 from DanielG/dev-cabal1.16

Copy readMaybe/readEither from base for backwards compatibility
This commit is contained in:
Kazu Yamamoto 2014-05-10 21:15:01 +09:00
commit d88dcde733
5 changed files with 176 additions and 11 deletions

View File

@ -1,3 +1,35 @@
-- Copyright : Isaac Jones 2003-2004
{- All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials provided
with the distribution.
* Neither the name of Isaac Jones nor the names of other
contributors may be used to endorse or promote products derived
from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -}
-- | ComponentLocalBuildInfo for Cabal <= 1.16 -- | ComponentLocalBuildInfo for Cabal <= 1.16
module Language.Haskell.GhcMod.Cabal16 ( module Language.Haskell.GhcMod.Cabal16 (
ComponentLocalBuildInfo ComponentLocalBuildInfo

View File

@ -1,7 +1,39 @@
-- Copyright : Isaac Jones 2003-2004
{- All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials provided
with the distribution.
* Neither the name of Isaac Jones nor the names of other
contributors may be used to endorse or promote products derived
from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -}
-- | ComponentLocalBuildInfo for Cabal >= 1.18 -- | ComponentLocalBuildInfo for Cabal >= 1.18
module Language.Haskell.GhcMod.Cabal18 ( module Language.Haskell.GhcMod.Cabal18 (
ComponentLocalBuildInfo ComponentLocalBuildInfo
, componentPackageDeps , componentPackageDeps
, componentLibraries
) where ) where
import Distribution.Package (InstalledPackageId, PackageId) import Distribution.Package (InstalledPackageId, PackageId)

View File

@ -6,6 +6,7 @@ module Language.Haskell.GhcMod.CabalConfig (
import Language.Haskell.GhcMod.GhcPkg import Language.Haskell.GhcMod.GhcPkg
import Language.Haskell.GhcMod.Utils import Language.Haskell.GhcMod.Utils
import Language.Haskell.GhcMod.Read
import Language.Haskell.GhcMod.Types import Language.Haskell.GhcMod.Types
import qualified Language.Haskell.GhcMod.Cabal16 as C16 import qualified Language.Haskell.GhcMod.Cabal16 as C16
@ -24,7 +25,6 @@ import Distribution.Simple.BuildPaths (defaultDistPref)
import Distribution.Simple.Configure (localBuildInfoFile) import Distribution.Simple.Configure (localBuildInfoFile)
import Distribution.Simple.LocalBuildInfo (ComponentName) import Distribution.Simple.LocalBuildInfo (ComponentName)
import System.FilePath ((</>)) import System.FilePath ((</>))
import Text.Read (readMaybe)
---------------------------------------------------------------- ----------------------------------------------------------------
type CabalConfig = String type CabalConfig = String
@ -94,7 +94,7 @@ configDependencies thisPkg config = map fromInstalledPackageId deps
clbi <- stripPrefix " = " field clbi <- stripPrefix " = " field
if "Nothing" `isPrefixOf` clbi if "Nothing" `isPrefixOf` clbi
then Nothing then Nothing
else case readMaybe <$> stripPrefix "Just " clbi of else case readMaybe =<< stripPrefix "Just " clbi of
Just x -> x Just x -> x
Nothing -> error $ "reading libraryConfig failed\n" ++ show (stripPrefix "Just " clbi) Nothing -> error $ "reading libraryConfig failed\n" ++ show (stripPrefix "Just " clbi)
@ -102,15 +102,9 @@ configDependencies thisPkg config = map fromInstalledPackageId deps
extract field = readConfigs field <$> extractField config field extract field = readConfigs field <$> extractField config field
readConfigs :: String -> String -> [(String, C16.ComponentLocalBuildInfo)] readConfigs :: String -> String -> [(String, C16.ComponentLocalBuildInfo)]
readConfigs f s = case readMaybe s of readConfigs f s = case readEither s of
Just x -> x Right x -> x
Nothing -> error $ "reading config " ++ f ++ " failed" Left msg -> error $ "reading config " ++ f ++ " failed ("++msg++")"
readEither :: Read r => String -> Either String r
readEither s = case readMaybe s of
Just x -> Right x
Nothing -> Left $ "read: failed on input:\n" ++ s
extractField :: CabalConfig -> String -> Either String String extractField :: CabalConfig -> String -> Either String String
extractField config field = extractField config field =

View File

@ -0,0 +1,106 @@
module Language.Haskell.GhcMod.Read where
import Text.Read (readPrec_to_S, readPrec, minPrec)
import qualified Text.ParserCombinators.ReadP as P
import Text.ParserCombinators.ReadPrec (lift)
-- This library (libraries/base) is derived from code from several
-- sources:
-- * Code from the GHC project which is largely (c) The University of
-- Glasgow, and distributable under a BSD-style license (see below),
-- * Code from the Haskell 98 Report which is (c) Simon Peyton Jones
-- and freely redistributable (but see the full license for
-- restrictions).
-- * Code from the Haskell Foreign Function Interface specification,
-- which is (c) Manuel M. T. Chakravarty and freely redistributable
-- (but see the full license for restrictions).
-- The full text of these licenses is reproduced below. All of the
-- licenses are BSD-style or compatible.
-- -----------------------------------------------------------------------------
-- The Glasgow Haskell Compiler License
-- Copyright 2004, The University Court of the University of Glasgow.
-- All rights reserved.
-- Redistribution and use in source and binary forms, with or without
-- modification, are permitted provided that the following conditions are met:
-- - Redistributions of source code must retain the above copyright notice,
-- this list of conditions and the following disclaimer.
-- - Redistributions in binary form must reproduce the above copyright notice,
-- this list of conditions and the following disclaimer in the documentation
-- and/or other materials provided with the distribution.
-- - Neither name of the University nor the names of its contributors may be
-- used to endorse or promote products derived from this software without
-- specific prior written permission.
-- THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY COURT OF THE UNIVERSITY OF
-- GLASGOW AND THE CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
-- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-- FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-- UNIVERSITY COURT OF THE UNIVERSITY OF GLASGOW OR THE CONTRIBUTORS BE LIABLE
-- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-- SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-- CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-- OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
-- DAMAGE.
-- -----------------------------------------------------------------------------
-- Code derived from the document "Report on the Programming Language
-- Haskell 98", is distributed under the following license:
-- Copyright (c) 2002 Simon Peyton Jones
-- The authors intend this Report to belong to the entire Haskell
-- community, and so we grant permission to copy and distribute it for
-- any purpose, provided that it is reproduced in its entirety,
-- including this Notice. Modified versions of this Report may also be
-- copied and distributed for any purpose, provided that the modified
-- version is clearly presented as such, and that it does not claim to
-- be a definition of the Haskell 98 Language.
-- -----------------------------------------------------------------------------
-- Code derived from the document "The Haskell 98 Foreign Function
-- Interface, An Addendum to the Haskell 98 Report" is distributed under
-- the following license:
-- Copyright (c) 2002 Manuel M. T. Chakravarty
-- The authors intend this Report to belong to the entire Haskell
-- community, and so we grant permission to copy and distribute it for
-- any purpose, provided that it is reproduced in its entirety,
-- including this Notice. Modified versions of this Report may also be
-- copied and distributed for any purpose, provided that the modified
-- version is clearly presented as such, and that it does not claim to
-- be a definition of the Haskell 98 Foreign Function Interface.
-- -----------------------------------------------------------------------------
readEither :: Read a => String -> Either String a
readEither s =
case [ x | (x,"") <- readPrec_to_S read' minPrec s ] of
[x] -> Right x
[] -> Left "Prelude.read: no parse"
_ -> Left "Prelude.read: ambiguous parse"
where
read' =
do x <- readPrec
lift P.skipSpaces
return x
readMaybe :: Read a => String -> Maybe a
readMaybe s = case readEither s of
Left _ -> Nothing
Right a -> Just a

View File

@ -79,6 +79,7 @@ Library
Language.Haskell.GhcMod.PkgDoc Language.Haskell.GhcMod.PkgDoc
Language.Haskell.GhcMod.Utils Language.Haskell.GhcMod.Utils
Language.Haskell.GhcMod.Types Language.Haskell.GhcMod.Types
Language.Haskell.GhcMod.Read
Build-Depends: base >= 4.0 && < 5 Build-Depends: base >= 4.0 && < 5
, containers , containers
, deepseq , deepseq