ghc-mod 5.2.1.0 → 5.2.1.1
raw patch · 12 files changed
+95/−21 lines, 12 filesdep ~ghcdep ~mtlPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: ghc, mtl
API changes (from Hackage documentation)
Files
- ChangeLog +3/−0
- Language/Haskell/GhcMod/CaseSplit.hs +13/−4
- Language/Haskell/GhcMod/Cradle.hs +1/−1
- Language/Haskell/GhcMod/Error.hs +2/−1
- Language/Haskell/GhcMod/Monad.hs +4/−3
- Language/Haskell/GhcMod/PathsAndFiles.hs +15/−7
- elisp/ghc-info.el +1/−1
- elisp/ghc.el +1/−1
- ghc-mod.cabal +2/−1
- test/CabalApiSpec.hs +2/−2
- test/PathsAndFilesSpec.hs +12/−0
- test/data/case-split/Vect.hs +39/−0
ChangeLog view
@@ -1,3 +1,6 @@+2014-11-03 v5.2.1.1+ * Fix `findCabalFiles` thinking `$HOME/.cabal` is a cabal file.+ 2014-11-02 v5.2.1.0 * Fix `newTempDir` on Windows * GhcModT's liftIO instance now converts GhcMOdError exceptions
Language/Haskell/GhcMod/CaseSplit.hs view
@@ -71,8 +71,8 @@ getSrcSpanTypeForFnSplit modSum lineNo colNo = do p@ParsedModule{pm_parsed_source = _pms} <- G.parseModule modSum tcm@TypecheckedModule{tm_typechecked_source = tcs} <- G.typecheckModule p- let varPat = find isPatternVar $ listifySpans tcs (lineNo, colNo) :: Maybe (LPat Id)- match:_ = listifySpans tcs (lineNo, colNo) :: [Gap.GLMatchI]+ let varPat = find isPatternVar $ listifySpans tcs (lineNo, colNo) :: Maybe (LPat Id)+ match = last $ listifySpans tcs (lineNo, colNo) :: Gap.GLMatchI case varPat of Nothing -> return Nothing Just varPat' -> do@@ -188,8 +188,11 @@ , sVarSpan = sVS, sTycons = sT }) = let bindingText = getBindingText text sBS difference = srcSpanDifference sBS sVS- replaced = concatMap (replaceVarWithTyCon bindingText difference sVN) sT- in T.unpack $ T.intercalate (T.pack "\n") replaced+ replaced = map (replaceVarWithTyCon bindingText difference sVN) sT+ -- The newly generated bindings need to be indented to align with the+ -- original binding.+ replaced' = head replaced : map (indentBindingTo sBS) (tail replaced)+ in T.unpack $ T.intercalate (T.pack "\n") (concat replaced') getBindingText :: [T.Text] -> SrcSpan -> [T.Text] getBindingText text srcSpan =@@ -220,3 +223,9 @@ then T.take vsc line `T.append` tycon'' `T.append` T.drop vec line else T.replicate spacesToAdd (T.pack " ") `T.append` line) [0 ..] text++indentBindingTo :: SrcSpan -> [T.Text] -> [T.Text]+indentBindingTo bndLoc binds =+ let Just (_,sl,_,_) = Gap.getSrcSpan bndLoc+ indent = (T.replicate (sl - 1) (T.pack " ") `T.append`)+ in indent (head binds) : tail binds
Language/Haskell/GhcMod/Cradle.hs view
@@ -32,7 +32,7 @@ cabalCradle :: FilePath -> IO Cradle cabalCradle wdir = do- Just cabalFile <- findCabalFiles wdir+ Just cabalFile <- findCabalFile wdir let cabalDir = takeDirectory cabalFile pkgDbStack <- getPackageDbStack cabalDir tmpDir <- newTempDir cabalDir
Language/Haskell/GhcMod/Error.hs view
@@ -30,8 +30,9 @@ -- ^ Launching an operating system process failed. The first -- field is the command. | GMENoCabalFile+ -- ^ No cabal file found. | GMETooManyCabalFiles [FilePath]- -- ^ No or too many cabal files found.+ -- ^ Too many cabal files found. deriving (Eq,Show,Typeable) instance Exception GhcModError
Language/Haskell/GhcMod/Monad.hs view
@@ -99,7 +99,7 @@ #endif import Control.Monad.Journal.Class -import Data.Maybe (fromJust, isJust)+import Data.Maybe (isJust) import Data.IORef (IORef, readIORef, writeIORef, newIORef) import System.Directory (getCurrentDirectory) @@ -166,7 +166,7 @@ where fromEx :: Exception e => SomeException -> e- fromEx = fromJust . fromException+ fromEx se = let Just e = fromException se in e isIOError se = case fromException se of Just (_ :: IOError) -> True@@ -221,7 +221,8 @@ cabal = isJust mCabalFile ghcopts = ghcUserOptions opt withCabal = do- pkgDesc <- parseCabalFile c $ fromJust mCabalFile+ let Just cabalFile = mCabalFile+ pkgDesc <- parseCabalFile c cabalFile compOpts <- getCompilerOptions ghcopts c pkgDesc initSession CabalPkg opt compOpts withSandbox = initSession SingleFile opt compOpts
Language/Haskell/GhcMod/PathsAndFiles.hs view
@@ -28,24 +28,32 @@ -- is assumed to be the project directory. If only one cabal file exists in this -- directory it is returned otherwise @findCabalFiles@ throws 'GMENoCabalFile' -- or 'GMETooManyCabalFiles'-findCabalFiles :: FilePath -> IO (Maybe FilePath)-findCabalFiles directory = do- -- Look for cabal files in all parent directories of @dir@+findCabalFile :: FilePath -> IO (Maybe FilePath)+findCabalFile directory = do+ -- Look for cabal files in @dir@ and all it's parent directories dcs <- getCabalFiles `zipMapM` parents directory -- Extract first non-empty list, which represents a directory with cabal -- files.- case find (not . null) $ uncurry makeAbsolute `map` dcs of+ case find (not . null) $ uncurry appendDir `map` dcs of Just [] -> throw $ GMENoCabalFile Just cfs@(_:_:_) -> throw $ GMETooManyCabalFiles cfs a -> return $ head <$> a+ where+ appendDir :: DirPath -> [FileName] -> [FilePath]+ appendDir dir fs = (dir </>) `map` fs -- | @getCabalFiles dir@. Find all files ending in @.cabal@ in @dir@. getCabalFiles :: DirPath -> IO [FileName] getCabalFiles dir =- filter ((==) ".cabal" . takeExtension) <$> getDirectoryContents dir+ filterM isCabalFile =<< getDirectoryContents dir+ where+ isCabalFile f = do+ exists <- doesFileExist $ dir </> f+ return (exists && takeExtension' f == ".cabal") -makeAbsolute :: DirPath -> [FileName] -> [FilePath]-makeAbsolute dir fs = (dir </>) `map` fs+ takeExtension' p = if takeFileName p == takeExtension p+ then ""+ else takeExtension p zipMapM :: Monad m => (a -> m c) -> [a] -> m [(a,c)] zipMapM f as = mapM (\a -> liftM (a,) $ f a) as
elisp/ghc-info.el view
@@ -127,7 +127,7 @@ (defun ghc-expand-th () (interactive) (let* ((file (buffer-file-name))- (cmds (list "expand" file "-b" "\n"))+ (cmds (list "expand" file)) (source (ghc-run-ghc-mod cmds))) (when source (ghc-display
elisp/ghc.el view
@@ -28,7 +28,7 @@ (< emacs-minor-version minor))) (error "ghc-mod requires at least Emacs %d.%d" major minor))) -(defconst ghc-version "5.2.1.0")+(defconst ghc-version "5.2.1.1") ;; (eval-when-compile ;; (require 'haskell-mode))
ghc-mod.cabal view
@@ -1,5 +1,5 @@ Name: ghc-mod-Version: 5.2.1.0+Version: 5.2.1.1 Author: Kazu Yamamoto <kazu@iij.ad.jp> Daniel Gröber <dxld@darkboxed.org> Alejandro Serrano <trupill@gmail.com>@@ -34,6 +34,7 @@ test/data/broken-cabal/cabal.sandbox.config.in test/data/broken-sandbox/*.cabal test/data/broken-sandbox/cabal.sandbox.config+ test/data/case-split/*.hs test/data/cabal-flags/*.cabal test/data/check-test-subdir/*.cabal test/data/check-test-subdir/src/Check/Test/*.hs
test/CabalApiSpec.hs view
@@ -3,7 +3,6 @@ module CabalApiSpec where import Control.Applicative-import Data.Maybe import Language.Haskell.GhcMod.CabalApi import Language.Haskell.GhcMod.Cradle import Language.Haskell.GhcMod.Types@@ -35,7 +34,8 @@ cwd <- getCurrentDirectory withDirectory "test/data/subdir1/subdir2" $ \dir -> do crdl <- findCradle- pkgDesc <- runD $ parseCabalFile crdl $ fromJust $ cradleCabalFile crdl+ let Just cabalFile = cradleCabalFile crdl+ pkgDesc <- runD $ parseCabalFile crdl cabalFile res <- runD $ getCompilerOptions [] crdl pkgDesc let res' = res { ghcOptions = ghcOptions res
test/PathsAndFilesSpec.hs view
@@ -8,6 +8,7 @@ #endif import System.Directory+import System.Environment import System.FilePath ((</>)) import Test.Hspec @@ -28,3 +29,14 @@ it "returns Nothing if the sandbox config file is broken" $ do getSandboxDb "test/data/broken-sandbox" `shouldReturn` Nothing++ describe "getCabalFiles" $ do+ it "doesn't think $HOME/.cabal is a cabal file" $ do+ (getCabalFiles =<< getEnv "HOME") `shouldReturn` []++ describe "findCabalFile" $ do+ it "works" $ do+ findCabalFile "test/data" `shouldReturn` Just "test/data/cabalapi.cabal"++ it "finds cabal files in parent directories" $ do+ findCabalFile "test/data/subdir1/subdir2" `shouldReturn` Just "test/data/cabalapi.cabal"
+ test/data/case-split/Vect.hs view
@@ -0,0 +1,39 @@+{-# LANGUAGE DataKinds, TypeFamilies, TypeOperators, GADTs, KindSignatures #-}++module Vect where++data Nat = Z | S Nat++type family (n :: Nat) :+ (m :: Nat) :: Nat+type instance Z :+ m = m+type instance S n :+ m = S (n :+ m)++data Vect :: Nat -> * -> * where+ VNil :: Vect Z a+ (:::) :: a -> Vect n a -> Vect (S n) a++vAppend :: Vect n a -> Vect m a -> Vect (n :+ m) a+vAppend x y = _vAppend_body++lAppend :: [a] -> [a] -> [a]+lAppend x y = _lAppend_body++data MyList a = Nil | Cons a (MyList a)++mlAppend :: MyList a -> MyList a -> MyList a+mlAppend x y = _mlAppend_body++mlAppend2 :: MyList a -> MyList a -> MyList a+mlAppend2 x y = case x of+ x' -> _mlAppend_body++mlReverse :: MyList a -> MyList a+mlReverse xs = mlReverse' xs Nil+ where+ mlReverse' :: MyList a -> MyList a -> MyList a+ mlReverse' xs' accum = _mlReverse_body++mlReverse2 :: MyList a -> MyList a+mlReverse2 xs = let mlReverse' :: MyList a -> MyList a -> MyList a+ mlReverse' xs' accum = _mlReverse_body+ in mlReverse' xs Nil