hhp 0.0.3 → 0.0.4
raw patch · 12 files changed
+121/−53 lines, 12 filesdep +extraPVP ok
version bump matches the API change (PVP)
Dependencies added: extra
API changes (from Hackage documentation)
+ Hhp: cProjectVersion :: String
+ Hhp.Ghc: data Ghc a
+ Hhp.Ghc: getMainFileToBeDeleted :: FilePath -> Ghc (Maybe FilePath)
+ Hhp.Ghc: liftIO :: MonadIO m => IO a -> m a
+ Hhp.Ghc: runGhc :: Maybe FilePath -> Ghc a -> IO a
Files
- ChangeLog +16/−0
- hhp.cabal +3/−3
- lib/Hhp.hs +4/−0
- lib/Hhp/CabalApi.hs +24/−8
- lib/Hhp/Gap.hs +17/−0
- lib/Hhp/Ghc.hs +26/−0
- src/hhpc.hs +0/−2
- src/hhpi.hs +3/−33
- test/CabalApiSpec.hs +20/−0
- test/InfoSpec.hs +3/−6
- test/LintSpec.hs +4/−1
- test/data/hlint.hs +1/−0
ChangeLog view
@@ -1,2 +1,18 @@+2022-05-30 v0.0.4+ * Injecting cabal flags via environment variable. [#13](https://github.com/kazu-yamamoto/hhp/pull/13)+ * Update to handle sub-libraries in .cabal file. [#14](https://github.com/kazu-yamamoto/hhp/pull/14)++2022-07-21 v0.0.3+ * fixing test due to hlint change.+ * supporting GHC 8.10++2019-10-03 v0.0.2+ * supporting Cabal 3.0 and GHC 8.8.++2019-06-21 v0.0.1+ * setting PartialTypeSignatures and NamedWildCards for check+ * Remap save-buffer to hhp-save-buffer [#6](https://github.com/kazu-yamamoto/hhp/pull/6)+ * using "-fdefer-typed-holes" for check.+ 2018-12-18 v0.0.0 * First release
hhp.cabal view
@@ -1,5 +1,5 @@ Name: hhp-Version: 0.0.3+Version: 0.0.4 Author: Kazu Yamamoto <kazu@iij.ad.jp> Maintainer: Kazu Yamamoto <kazu@iij.ad.jp> License: BSD3@@ -90,7 +90,6 @@ Build-Depends: base >= 4.9 && < 5 , directory , filepath- , ghc , hhp Executable hhpi@@ -103,7 +102,6 @@ , containers , directory , filepath- , ghc , hhp Test-Suite doctest@@ -161,6 +159,7 @@ , containers , deepseq , directory+ , extra , filepath , ghc , hspec >= 1.7.1@@ -168,6 +167,7 @@ , syb , hlint >= 1.7.1 , ghc-boot+ build-tool-depends: hspec-discover:hspec-discover Source-Repository head Type: git
lib/Hhp.hs view
@@ -28,6 +28,8 @@ , rootInfo , packageDoc , findSymbol+ -- * Misc+ , cProjectVersion ) where import Hhp.Boot@@ -43,3 +45,5 @@ import Hhp.List import Hhp.PkgDoc import Hhp.Types++import Config (cProjectVersion)
lib/Hhp/CabalApi.hs view
@@ -27,21 +27,23 @@ import Distribution.PackageDescription.Configuration (finalizePD) import Distribution.PackageDescription.Parsec (readGenericPackageDescription) import Distribution.Types.ComponentRequestedSpec (defaultComponentRequestedSpec)-import Distribution.Types.Flag (mkFlagAssignment)+import Distribution.Types.Flag (mkFlagAssignment, mkFlagName) import Distribution.Types.PackageName (unPackageName) #elif MIN_VERSION_Cabal(2,2,0) import Distribution.PackageDescription.Configuration (finalizePD) import Distribution.PackageDescription.Parsec (readGenericPackageDescription) import Distribution.Types.ComponentRequestedSpec (defaultComponentRequestedSpec)-import Distribution.Types.GenericPackageDescription (mkFlagAssignment)+import Distribution.Types.GenericPackageDescription (mkFlagAssignment, mkFlagName) import Distribution.Types.PackageName (unPackageName) #elif MIN_VERSION_Cabal(2,0,0) import Distribution.PackageDescription.Configuration (finalizePD) import Distribution.PackageDescription.Parse (readPackageDescription) import Distribution.Types.ComponentRequestedSpec (defaultComponentRequestedSpec)+import Distribution.Types.GenericPackageDescription (mkFlagName) import Distribution.Types.PackageName (unPackageName) #else import Distribution.Package (PackageName(PackageName))+import Distribution.PackageDescription (FlagName (FlagName)) import Distribution.PackageDescription.Configuration (finalizePackageDescription) import Distribution.PackageDescription.Parse (readPackageDescription) #endif@@ -52,6 +54,7 @@ import Data.Maybe (maybeToList, mapMaybe) import Data.Set (fromList, toList) import System.Directory (doesFileExist)+import System.Environment (lookupEnv) import System.FilePath (dropExtension, takeFileName, (</>)) import Hhp.Types@@ -125,25 +128,33 @@ #else epgd <- readPackageDescription silent file #endif- case toPkgDesc cid' epgd of+ flags <- getFlags+ case toPkgDesc cid' flags epgd of Left deps -> throwIO $ userError $ show deps ++ " are not installed" Right (pd,_) -> if nullPkg pd then throwIO $ userError $ file ++ " is broken" else return pd where+ envFlags = do+ let parseF [] = []+ parseF ccs@(c:cs)+ | c == '-' = [(mkFlagName cs, False)]+ | otherwise = [(mkFlagName ccs, True)]+ maybe [] (concatMap parseF . words) `fmap` lookupEnv "HHP_CABAL_FLAGS" #if MIN_VERSION_Cabal(2,2,0)- none = mkFlagAssignment []+ getFlags = mkFlagAssignment `fmap` envFlags #else- none = []+ getFlags = envFlags #endif #if MIN_VERSION_Cabal(2,0,0) nullPkg pd = unPackageName (C.pkgName (P.package pd)) == ""- toPkgDesc cid = finalizePD none defaultComponentRequestedSpec (const True) buildPlatform cid []+ toPkgDesc cid flags = finalizePD flags defaultComponentRequestedSpec (const True) buildPlatform cid [] #else+ mkFlagName = FlagName nullPkg pd = name == "" where PackageName name = C.pkgName (P.package pd)- toPkgDesc cid = finalizePackageDescription none (const True) buildPlatform cid []+ toPkgDesc cid flags = finalizePackageDescription flags (const True) buildPlatform cid [] #endif ----------------------------------------------------------------@@ -174,9 +185,14 @@ -- | Extracting all 'BuildInfo' for libraries, executables, and tests. cabalAllBuildInfo :: PackageDescription -> [BuildInfo]-cabalAllBuildInfo pd = libBI ++ execBI ++ testBI ++ benchBI+cabalAllBuildInfo pd = libBI ++ subBI ++ execBI ++ testBI ++ benchBI where libBI = map P.libBuildInfo $ maybeToList $ P.library pd+#if MIN_VERSION_Cabal(2,0,0)+ subBI = map P.libBuildInfo $ P.subLibraries pd+#else+ subBI = []+#endif execBI = map P.buildInfo $ P.executables pd testBI = map P.testBuildInfo $ P.testSuites pd #if __GLASGOW_HASKELL__ >= 704
lib/Hhp/Gap.hs view
@@ -17,9 +17,14 @@ , languagesAndExtensions , mkFunTy , mkFunTys+ , getModSummaryForMain ) where +import Data.List (find)+ import DynFlags (DynFlags, supportedLanguagesAndExtensions)+import GHC(Ghc,getModuleGraph,moduleNameString,moduleName,ms_mod)+ import GHC (LHsBind, LHsExpr, Type) #if __GLASGOW_HASKELL__ >= 808 import GHC (Located, Pat)@@ -47,6 +52,7 @@ import GHC (mgModSummaries, ModSummary, ModuleGraph) #else import qualified Data.IntSet as I (IntSet, empty)+import GHC (ModSummary) #endif #if __GLASGOW_HASKELL__ >= 810@@ -179,3 +185,14 @@ mkFunTys :: [Type] -> Type -> Type mkFunTys = mkVisFunTys #endif++----------------------------------------------------------------++getModSummaryForMain :: Ghc (Maybe ModSummary)+#if __GLASGOW_HASKELL__ >= 804+getModSummaryForMain = find isMain . mgModSummaries <$> getModuleGraph+#else+getModSummaryForMain = find isMain <$> getModuleGraph+#endif+ where+ isMain m = moduleNameString (moduleName (ms_mod m)) == "Main"
lib/Hhp/Ghc.hs view
@@ -21,6 +21,10 @@ , lookupSym -- * Misc , getSystemLibDir+ , liftIO+ , runGhc+ , getMainFileToBeDeleted+ , Ghc ) where import Hhp.Boot@@ -28,5 +32,27 @@ import Hhp.Check import Hhp.Find import Hhp.GHCApi+import Hhp.Gap import Hhp.Info import Hhp.List++import GHC (runGhc)+import CoreMonad (liftIO)+import GHC (Ghc)+import qualified GHC as G++import Data.Maybe (fromMaybe)++getMainFileToBeDeleted :: FilePath -> Ghc (Maybe FilePath)+getMainFileToBeDeleted file = isSameMainFile file <$> getModSummaryForMain++isSameMainFile :: FilePath -> Maybe G.ModSummary -> Maybe FilePath+isSameMainFile _ Nothing = Nothing+isSameMainFile file (Just x)+ | mainfile == file = Nothing+ | otherwise = Just mainfile+ where+ mmainfile = G.ml_hs_file (G.ms_location x)+ -- G.ms_hspp_file x is a temporary file with CPP.+ -- this is a just fake.+ mainfile = fromMaybe (G.ms_hspp_file x) mmainfile
src/hhpc.hs view
@@ -2,8 +2,6 @@ module Main where -import Config (cProjectVersion)- import Control.Exception (Exception, Handler(..), ErrorCall(..)) import qualified Control.Exception as E import Data.Typeable (Typeable)
src/hhpi.hs view
@@ -18,20 +18,10 @@ module Main where -import Config (cProjectVersion)-import CoreMonad (liftIO)-import GHC (Ghc)-#if __GLASGOW_HASKELL__ >= 804-import GHC (mgModSummaries)-#endif-import qualified GHC as G- import Control.Concurrent (forkIO, MVar, newEmptyMVar, putMVar, readMVar) import Control.Exception (SomeException(..), Exception) import qualified Control.Exception as E import Control.Monad (when, void)-import Data.List (find)-import Data.Maybe (fromMaybe) import Data.Set (Set) import qualified Data.Set as S import Data.Typeable (Typeable)@@ -120,7 +110,7 @@ ---------------------------------------------------------------- run :: Cradle -> Maybe FilePath -> Options -> Ghc a -> IO a-run cradle mlibdir opt body = G.runGhc mlibdir $ do+run cradle mlibdir opt body = runGhc mlibdir $ do initializeFlagsWithCradle opt cradle body @@ -178,30 +168,10 @@ let set1 | S.member file set = set | otherwise = S.insert file set- mx <- isSameMainFile file <$> getModSummaryForMain- return $ case mx of+ mf <- getMainFileToBeDeleted file+ return $ case mf of Nothing -> set1 Just mainfile -> S.delete mainfile set1--getModSummaryForMain :: Ghc (Maybe G.ModSummary)-#if __GLASGOW_HASKELL__ >= 804-getModSummaryForMain = find isMain . mgModSummaries <$> G.getModuleGraph-#else-getModSummaryForMain = find isMain <$> G.getModuleGraph-#endif- where- isMain m = G.moduleNameString (G.moduleName (G.ms_mod m)) == "Main"--isSameMainFile :: FilePath -> Maybe G.ModSummary -> Maybe FilePath-isSameMainFile _ Nothing = Nothing-isSameMainFile file (Just x)- | mainfile == file = Nothing- | otherwise = Just mainfile- where- mmainfile = G.ml_hs_file (G.ms_location x)- -- G.ms_hspp_file x is a temporary file with CPP.- -- this is a just fake.- mainfile = fromMaybe (G.ms_hspp_file x) mmainfile ----------------------------------------------------------------
test/CabalApiSpec.hs view
@@ -5,6 +5,7 @@ import Control.Exception import Data.Maybe import System.Directory+import System.Environment (unsetEnv, setEnv) import System.FilePath import Test.Hspec @@ -56,6 +57,25 @@ it "extracts all hs-source-dirs including \".\"" $ do dirs <- cabalSourceDirs . cabalAllBuildInfo <$> parseCabalFile "test/data/cabalapi.cabal" dirs `shouldBe` [".", "test"]++ describe "cabal-subLibraries" $ do+ it "dependent packages with sublib" $ do+ pkgs <- cabalDependPackages . cabalAllBuildInfo <$> parseCabalFile "test/data/check-sublib/check-sublib.cabal"+ pkgs `shouldBe` ["array", "base", "bytestring"]++ describe "HHP_CABAL_FLAGS" $ do+ it "dependent packages without flags" $ do+ unsetEnv "HHP_CABAL_FLAGS"+ pkgs <- cabalDependPackages . cabalAllBuildInfo <$> parseCabalFile "test/data/check-flags/check-flags.cabal"+ pkgs `shouldBe` ["base", "directory"]+ it "dependent packages with foo flag" $ do+ setEnv "HHP_CABAL_FLAGS" "foo"+ pkgs <- cabalDependPackages . cabalAllBuildInfo <$> parseCabalFile "test/data/check-flags/check-flags.cabal"+ pkgs `shouldBe` ["base", "directory", "filepath"]+ it "dependent packages with foo and -bar flag" $ do+ setEnv "HHP_CABAL_FLAGS" "foo -bar"+ pkgs <- cabalDependPackages . cabalAllBuildInfo <$> parseCabalFile "test/data/check-flags/check-flags.cabal"+ pkgs `shouldBe` ["base", "filepath"] {- describe "cabalAllBuildInfo" $ do
test/InfoSpec.hs view
@@ -1,9 +1,9 @@ module InfoSpec where import Data.List (isPrefixOf)+import Data.List.Extra (replace) import System.Environment (getExecutablePath) import System.Exit-import System.FilePath import System.Process import Test.Hspec @@ -53,9 +53,6 @@ res `shouldSatisfy` ("bar :: [Char]" `isPrefixOf`) it "doesn't fail on unicode output" $ do- dir <- getDistDir- code <- rawSystem (dir </> "build/hhpc/hhpc") ["info", "test/data/Unicode.hs", "unicode"]+ hhpcPath <- replace "/t/" "/x/" . replace "spec" "hhpc" <$> getExecutablePath+ code <- rawSystem hhpcPath ["info", "test/data/Unicode.hs", "unicode"] code `shouldSatisfy` (== ExitSuccess)--getDistDir :: IO FilePath-getDistDir = takeDirectory . takeDirectory . takeDirectory <$> getExecutablePath
test/LintSpec.hs view
@@ -1,5 +1,6 @@ module LintSpec where +import Data.List.Extra import Test.Hspec import Hhp@@ -9,7 +10,9 @@ describe "lintSyntax" $ do it "check syntax with HLint" $ do res <- lintSyntax defaultOptions "test/data/hlint.hs"- res `shouldBe` "test/data/hlint.hs:5:16-26: Warning: Use sum\NULFound:\NUL foldr (+) 0\NULPerhaps:\NUL sum\n"+ -- hlint displays additional line infomation+ -- since unknown version (:5:16-26:)+ replace "16-26" "16" res `shouldBe` "test/data/hlint.hs:5:16: Warning: Use sum\NULFound:\NUL foldr (+) 0\NULPerhaps:\NUL sum\n" context "without suggestions" $ do it "doesn't output empty line" $ do
test/data/hlint.hs view
@@ -3,3 +3,4 @@ main :: IO () main = do putStrLn $ foldr (+) 0 [0..10]+ putStrLn "Hello"