From 36c0b7ac855b288bd9210dc6030a6ba64b1b4f0c Mon Sep 17 00:00:00 2001 From: Kazu Yamamoto Date: Mon, 6 Feb 2012 18:07:32 +0900 Subject: [PATCH] general parsing for *.cabal! --- Cabal.hs | 43 ++++++++++++++++++++----------------------- ghc-mod.cabal | 3 +-- 2 files changed, 21 insertions(+), 25 deletions(-) diff --git a/Cabal.hs b/Cabal.hs index d7307a9..fb5ac78 100644 --- a/Cabal.hs +++ b/Cabal.hs @@ -1,14 +1,14 @@ {-# LANGUAGE OverloadedStrings #-} + module Cabal (initializeGHC) where import Control.Applicative import Control.Monad import CoreMonad -import Data.Attoparsec.ByteString.Char8 -import Data.Attoparsec.Enumerator -import Data.Enumerator (run, ($$)) -import Data.Enumerator.Binary (enumFile) import Data.List +import Distribution.PackageDescription +import Distribution.PackageDescription.Parse (readPackageDescription) +import Distribution.Verbosity (silent) import ErrMsg import GHC import System.Directory @@ -31,31 +31,28 @@ initializeGHC opt fileName ghcOptions logging = do midirs <- parseCabalFile cfile changeToCabalDirectory cdir let idirs = case midirs of - Nothing -> [cdir,owdir] - Just dirs -> dirs ++ [owdir] + [] -> [cdir,owdir] + dirs -> dirs ++ [owdir] file = ajustFileName fileName owdir cdir logReader <- initSession opt ghcOptions idirs logging return (file,logReader) ---------------------------------------------------------------- -parseCabalFile :: FilePath -> Ghc (Maybe [String]) -parseCabalFile file = liftIO $ do - res <- run (enumFile file $$ iterParser findTarget) - case res of - Right x -> return x - Left e -> error (show e) - -findTarget :: Parser (Maybe [String]) -findTarget = Just <$> hs_source_dirs - <|> (anyChar >> findTarget) - <|> Nothing <$ endOfInput - -hs_source_dirs :: Parser [String] -hs_source_dirs = do - stringCI "hs-source-dirs:" - many (char ' ') - sepBy1 (many . satisfy $ notInClass " ,\n") (many1 . satisfy $ inClass " ,") +parseCabalFile :: FilePath -> Ghc [String] +parseCabalFile file = do + cabal <- liftIO $ readPackageDescription silent file + return $ fromLibrary cabal ||| fromExecutable cabal + where + [] ||| y = y + x ||| _ = x + fromLibrary c = case condLibrary c of + Nothing -> [] + Just lib -> libHsSourceDir lib + libHsSourceDir = hsSourceDirs . libBuildInfo . condTreeData + fromExecutable = execHsSrouceDir . condExecutables + execHsSrouceDir [] = [] + execHsSrouceDir (x:_) = hsSourceDirs . buildInfo . condTreeData . snd $ x ---------------------------------------------------------------- diff --git a/ghc-mod.cabal b/ghc-mod.cabal index 04966b8..6c916c7 100644 --- a/ghc-mod.cabal +++ b/ghc-mod.cabal @@ -30,8 +30,7 @@ Executable ghc-mod GHC-Options: -Wall Build-Depends: base >= 4.0 && < 5, ghc, ghc-paths, transformers, process, directory, filepath, old-time, - hlint >= 1.7.1, regex-posix, - attoparsec >= 0.10 , enumerator, attoparsec-enumerator + hlint >= 1.7.1, regex-posix, Cabal Source-Repository head Type: git Location: git://github.com/kazu-yamamoto/ghc-mod.git