diff --git a/Language/Haskell/GhcMod/Cabal16.hs b/Language/Haskell/GhcMod/Cabal16.hs index e2a65e6..d36fc36 100644 --- a/Language/Haskell/GhcMod/Cabal16.hs +++ b/Language/Haskell/GhcMod/Cabal16.hs @@ -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 module Language.Haskell.GhcMod.Cabal16 ( ComponentLocalBuildInfo diff --git a/Language/Haskell/GhcMod/Cabal18.hs b/Language/Haskell/GhcMod/Cabal18.hs index 69c80a2..94451a7 100644 --- a/Language/Haskell/GhcMod/Cabal18.hs +++ b/Language/Haskell/GhcMod/Cabal18.hs @@ -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 module Language.Haskell.GhcMod.Cabal18 ( ComponentLocalBuildInfo , componentPackageDeps + , componentLibraries ) where import Distribution.Package (InstalledPackageId, PackageId) diff --git a/Language/Haskell/GhcMod/CabalConfig.hs b/Language/Haskell/GhcMod/CabalConfig.hs index 75dc525..93e6e37 100644 --- a/Language/Haskell/GhcMod/CabalConfig.hs +++ b/Language/Haskell/GhcMod/CabalConfig.hs @@ -6,6 +6,7 @@ module Language.Haskell.GhcMod.CabalConfig ( import Language.Haskell.GhcMod.GhcPkg import Language.Haskell.GhcMod.Utils +import Language.Haskell.GhcMod.Read import Language.Haskell.GhcMod.Types 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.LocalBuildInfo (ComponentName) import System.FilePath (()) -import Text.Read (readMaybe) ---------------------------------------------------------------- type CabalConfig = String @@ -94,7 +94,7 @@ configDependencies thisPkg config = map fromInstalledPackageId deps clbi <- stripPrefix " = " field if "Nothing" `isPrefixOf` clbi then Nothing - else case readMaybe <$> stripPrefix "Just " clbi of + else case readMaybe =<< stripPrefix "Just " clbi of Just x -> x 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 readConfigs :: String -> String -> [(String, C16.ComponentLocalBuildInfo)] - readConfigs f s = case readMaybe s of - Just x -> x - Nothing -> error $ "reading config " ++ f ++ " failed" - - -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 + readConfigs f s = case readEither s of + Right x -> x + Left msg -> error $ "reading config " ++ f ++ " failed ("++msg++")" extractField :: CabalConfig -> String -> Either String String extractField config field = diff --git a/Language/Haskell/GhcMod/Read.hs b/Language/Haskell/GhcMod/Read.hs new file mode 100644 index 0000000..21b5b65 --- /dev/null +++ b/Language/Haskell/GhcMod/Read.hs @@ -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 diff --git a/ghc-mod.cabal b/ghc-mod.cabal index c043128..bfc2659 100644 --- a/ghc-mod.cabal +++ b/ghc-mod.cabal @@ -79,6 +79,7 @@ Library Language.Haskell.GhcMod.PkgDoc Language.Haskell.GhcMod.Utils Language.Haskell.GhcMod.Types + Language.Haskell.GhcMod.Read Build-Depends: base >= 4.0 && < 5 , containers , deepseq