From 776169179537bdec2c31d566c721dc49822a7e6e Mon Sep 17 00:00:00 2001 From: Kazu Yamamoto Date: Fri, 1 Mar 2013 15:25:43 +0900 Subject: [PATCH] Refactoring Cabal stuff. --- Cabal.hs | 4 ++-- CabalApi.hs | 45 +++++++++++++++++++++++++++++++------------- test/CabalApiSpec.hs | 4 ++-- 3 files changed, 36 insertions(+), 17 deletions(-) diff --git a/Cabal.hs b/Cabal.hs index f907dfa..9c9dcf1 100644 --- a/Cabal.hs +++ b/Cabal.hs @@ -2,7 +2,7 @@ module Cabal (initializeGHC, getDirs, fromCabal) where -import CabalApi (cabalParseFile, cabalBuildInfo, cabalDependPackages) +import CabalApi import Control.Applicative import Control.Exception import Control.Monad @@ -47,7 +47,7 @@ fromCabal ghcOptions = do idirs = case hsSourceDirs of [] -> [cdir,owdir] dirs -> map (cdir ) dirs ++ [owdir] - let depPkgs = removeMe cfile $ cabalDependPackages cabal + let depPkgs = removeMe cfile $ cabalAllDependPackages cabal return (gopts,idirs,depPkgs) removeMe :: FilePath -> [String] -> [String] diff --git a/CabalApi.hs b/CabalApi.hs index 7818215..2cb28af 100644 --- a/CabalApi.hs +++ b/CabalApi.hs @@ -1,19 +1,19 @@ module CabalApi ( cabalParseFile , cabalBuildInfo - , cabalDependPackages - , getBuildInfos + , cabalAllDependPackages + , cabalAllExtentions ) where import Control.Applicative - -import Data.Maybe (fromJust, maybeToList) +import Data.Maybe (fromJust, maybeToList, catMaybes) import Data.Set (fromList, toList) - import Distribution.Package (Dependency(Dependency), PackageName(PackageName)) import Distribution.PackageDescription import Distribution.PackageDescription.Parse (readPackageDescription) +import Distribution.Text (display) import Distribution.Verbosity (silent) +import Language.Haskell.Extension (Extension(..)) ---------------------------------------------------------------- @@ -33,24 +33,38 @@ cabalBuildInfo pd = fromJust $ fromLibrary pd <|> fromExecutable pd ---------------------------------------------------------------- -cabalDependPackages :: GenericPackageDescription -> [String] -cabalDependPackages = uniqueAndSort . map getDependencyPackageName . allDependsOfDescription +cabalAllDependPackages :: GenericPackageDescription -> [String] +cabalAllDependPackages pd = uniqueAndSort pkgs where - uniqueAndSort = toList . fromList + pkgs = map getDependencyPackageName $ cabalAllDependency pd -allDependsOfDescription :: GenericPackageDescription -> [Dependency] -allDependsOfDescription = fromPackageDescription getDeps getDeps getDeps getDeps +cabalAllDependency :: GenericPackageDescription -> [Dependency] +cabalAllDependency = fromPackageDescription getDeps getDeps getDeps getDeps where getDeps :: [Tree a] -> [Dependency] getDeps = concatMap condTreeConstraints getDependencyPackageName :: Dependency -> String -getDependencyPackageName (Dependency (PackageName n) _) = n +getDependencyPackageName (Dependency (PackageName nm) _) = nm ---------------------------------------------------------------- -getBuildInfos :: GenericPackageDescription -> [BuildInfo] -getBuildInfos = fromPackageDescription f1 f2 f3 f4 +cabalAllExtentions :: GenericPackageDescription -> [String] +cabalAllExtentions pd = uniqueAndSort exts + where + buildInfos = cabalAllBuildInfos pd + eexts = concatMap oldExtensions buildInfos + ++ concatMap defaultExtensions buildInfos + exts = catMaybes $ map getExtensionName eexts + +getExtensionName :: Extension -> Maybe String +getExtensionName (EnableExtension nm) = Just (display nm) +getExtensionName _ = Nothing + +---------------------------------------------------------------- + +cabalAllBuildInfos :: GenericPackageDescription -> [BuildInfo] +cabalAllBuildInfos = fromPackageDescription f1 f2 f3 f4 where f1 = map (libBuildInfo . condTreeData) f2 = map (buildInfo . condTreeData) @@ -73,3 +87,8 @@ fromPackageDescription f1 f2 f3 f4 pd = lib ++ exe ++ tests ++ bench exe = f2 . map snd . condExecutables $ pd tests = f3 . map snd . condTestSuites $ pd bench = f4 . map snd . condBenchmarks $ pd + +---------------------------------------------------------------- + +uniqueAndSort :: [String] -> [String] +uniqueAndSort = toList . fromList diff --git a/test/CabalApiSpec.hs b/test/CabalApiSpec.hs index d17f867..90aa9a7 100644 --- a/test/CabalApiSpec.hs +++ b/test/CabalApiSpec.hs @@ -6,9 +6,9 @@ import CabalApi spec :: Spec spec = do - describe "cabalDependPackages" $ do + describe "cabalAllDependPackages" $ do it "extracts dependent packages" $ do - pkgs <- cabalDependPackages <$> cabalParseFile "test/data/cabalapi.cabal" + pkgs <- cabalAllDependPackages <$> cabalParseFile "test/data/cabalapi.cabal" pkgs `shouldBe` ["Cabal","base","containers","convertible","directory","filepath","ghc","ghc-paths","ghc-syb-utils","hlint","hspec","io-choice","old-time","process","regex-posix","syb","time","transformers"] describe "cabalBuildInfo" $ do