hiedb 0.4.4.0 → 0.5.0.0
raw patch · 8 files changed
+97/−45 lines, 8 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
- HieDb.Compat: NCU :: (forall c. () => (NameCache -> (NameCache, c)) -> IO c) -> NameCacheUpdater
- HieDb.Compat: [updateNameCache] :: NameCacheUpdater -> forall c. () => (NameCache -> (NameCache, c)) -> IO c
- HieDb.Compat: newtype NameCacheUpdater
- HieDb.Types: instance Database.SQLite.Simple.FromField.FromField GHC.Unit.Module.Name.ModuleName
- HieDb.Types: instance Database.SQLite.Simple.FromRow.FromRow GHC.Unit.Module.Name.ModuleName
- HieDb.Types: instance Database.SQLite.Simple.ToField.ToField GHC.Unit.Module.Name.ModuleName
+ HieDb.Compat: fieldName :: FastString -> NameSpace
+ HieDb.Compat: fieldNameSpace_maybe :: NameSpace -> Maybe FastString
+ HieDb.Compat: mkFastStringByteString :: ByteString -> FastString
+ HieDb.Compat: type NameCacheUpdater = NameCache
+ HieDb.Types: instance Database.SQLite.Simple.FromField.FromField Language.Haskell.Syntax.Module.Name.ModuleName
+ HieDb.Types: instance Database.SQLite.Simple.FromRow.FromRow Language.Haskell.Syntax.Module.Name.ModuleName
+ HieDb.Types: instance Database.SQLite.Simple.ToField.ToField Language.Haskell.Syntax.Module.Name.ModuleName
- HieDb: data h :. t
+ HieDb: data () => h :. t
- HieDb.Compat: (<+>) :: SDoc -> SDoc -> SDoc
+ HieDb.Compat: (<+>) :: IsLine doc => doc -> doc -> doc
- HieDb.Compat: data AvailInfo
+ HieDb.Compat: data () => AvailInfo
- HieDb.Compat: data DynFlags
+ HieDb.Compat: data () => DynFlags
- HieDb.Compat: data FastString
+ HieDb.Compat: data () => FastString
- HieDb.Compat: data Fingerprint
+ HieDb.Compat: data () => Fingerprint
- HieDb.Compat: data IfaceTyCon
+ HieDb.Compat: data () => IfaceTyCon
- HieDb.Compat: data IfaceType
+ HieDb.Compat: data () => IfaceType
- HieDb.Compat: data LlvmConfig
+ HieDb.Compat: data () => LlvmConfig
- HieDb.Compat: data ModuleName
+ HieDb.Compat: data () => ModuleName
- HieDb.Compat: data Name
+ HieDb.Compat: data () => Name
- HieDb.Compat: data NameCache
+ HieDb.Compat: data () => NameCache
- HieDb.Compat: data NameSpace
+ HieDb.Compat: data () => NameSpace
- HieDb.Compat: data OccName
+ HieDb.Compat: data () => OccName
- HieDb.Compat: data RealSrcSpan
+ HieDb.Compat: data () => RealSrcSpan
- HieDb.Compat: data SrcSpan
+ HieDb.Compat: data () => SrcSpan
- HieDb.Compat: defaultDynFlags :: Settings -> LlvmConfig -> DynFlags
+ HieDb.Compat: defaultDynFlags :: Settings -> DynFlags
- HieDb.Compat: field_label :: a -> a
+ HieDb.Compat: field_label :: FieldLabelString -> FastString
- HieDb.Compat: initNameCache :: UniqSupply -> [Name] -> NameCache
+ HieDb.Compat: initNameCache :: Char -> [Name] -> IO NameCache
- HieDb.Compat: nsNames :: NameCache -> OrigNameCache
+ HieDb.Compat: nsNames :: NameCache -> MVar OrigNameCache
- HieDb.Compat: text :: String -> SDoc
+ HieDb.Compat: text :: IsLine doc => String -> doc
- HieDb.Types: fromNsChar :: Char -> Maybe NameSpace
+ HieDb.Types: fromNsChar :: Text -> Maybe NameSpace
- HieDb.Types: toNsChar :: NameSpace -> Char
+ HieDb.Types: toNsChar :: NameSpace -> String
Files
- CHANGELOG.md +4/−0
- hiedb.cabal +1/−1
- src/HieDb/Compat.hs +16/−0
- src/HieDb/Create.hs +3/−2
- src/HieDb/Query.hs +1/−1
- src/HieDb/Types.hs +33/−26
- test/Main.hs +32/−15
- test/data/Sub/Module2.hs +7/−0
CHANGELOG.md view
@@ -1,5 +1,9 @@ # Revision history for hiedb +## 0.5.0.0 -- 2024-01-12++- Handle duplicate record fields in GHC 9.8 instead of crashing+ ## 0.4.4.0 -- 2023-11-13 * Add `--src-base-dir` option allowing for src file indexing in `mods` * 9.8.1 support
hiedb.cabal view
@@ -1,6 +1,6 @@ cabal-version: 2.4 name: hiedb-version: 0.4.4.0+version: 0.5.0.0 synopsis: Generates a references DB from .hie files description: Tool and library to index and query a collection of `.hie` files bug-reports: https://github.com/wz1000/HieDb/issues
src/HieDb/Compat.hs view
@@ -81,6 +81,9 @@ , IfaceTyCon(..) , field_label , dfs+ , fieldNameSpace_maybe+ , fieldName+ , mkFastStringByteString ) where import Compat.HieTypes@@ -228,4 +231,17 @@ dfs = Graph.dfs #else dfs = flip Graph.dfs+#endif++fieldNameSpace_maybe :: NameSpace -> Maybe FastString+#if __GLASGOW_HASKELL__ >= 907+-- This is horrible, we can improve it once+-- https://gitlab.haskell.org/ghc/ghc/-/issues/24244 is addressed+fieldNameSpace_maybe ns = fieldOcc_maybe (mkOccName ns "")+#endif+fieldNameSpace_maybe _ = Nothing++#if __GLASGOW_HASKELL__ < 907+fieldName :: FastString -> NameSpace+fieldName _ = varName #endif
src/HieDb/Create.hs view
@@ -35,7 +35,7 @@ import HieDb.Utils sCHEMA_VERSION :: Integer-sCHEMA_VERSION = 6+sCHEMA_VERSION = 7 dB_VERSION :: Integer dB_VERSION = read (show sCHEMA_VERSION ++ "999" ++ show hieVersion)@@ -285,7 +285,8 @@ executeMany conn "INSERT INTO decls VALUES (?,?,?,?,?,?,?)" decls let defs = genDefRow path smod refmap- executeMany conn "INSERT INTO defs VALUES (?,?,?,?,?,?)" defs+ forM defs $ \def -> do+ execute conn "INSERT INTO defs VALUES (?,?,?,?,?,?)" def let exports = generateExports path $ hie_exports hf executeMany conn "INSERT INTO exports VALUES (?,?,?,?,?,?,?,?)" exports
src/HieDb/Query.hs view
@@ -224,7 +224,7 @@ one :: Symbol -> IO [Vertex] one s = do- let n = toNsChar (occNameSpace $ symName s) : occNameString (symName s)+ let n = symName s m = moduleNameString $ moduleName $ symModule s u = unitString (moduleUnit $ symModule s) query conn "SELECT mods.mod, decls.hieFile, decls.occ, decls.sl, decls.sc, decls.el, decls.ec \
src/HieDb/Types.hs view
@@ -15,6 +15,7 @@ import Data.IORef import qualified Data.Text as T+import qualified Data.Text.Encoding as T import Control.Monad.IO.Class import Control.Monad.Reader@@ -90,32 +91,37 @@ instance FromField Fingerprint where fromField fld = readHexFingerprint . T.unpack <$> fromField fld -toNsChar :: NameSpace -> Char+toNsChar :: NameSpace -> String toNsChar ns- | isVarNameSpace ns = 'v'- | isDataConNameSpace ns = 'c'- | isTcClsNameSpace ns = 't'- | isTvNameSpace ns = 'z'+ | Just fld_par <- fieldNameSpace_maybe ns+ = ('f':unpackFS fld_par) ++ ":"+ | isVarNameSpace ns = "v:"+ | isDataConNameSpace ns = "c:"+ | isTcClsNameSpace ns = "t:"+ | isTvNameSpace ns = "z:" | otherwise = error "namespace not recognized" -fromNsChar :: Char -> Maybe NameSpace-fromNsChar 'v' = Just varName-fromNsChar 'c' = Just dataName-fromNsChar 't' = Just tcClsName-fromNsChar 'z' = Just tvName-fromNsChar _ = Nothing+fromNsChar :: T.Text -> Maybe NameSpace+fromNsChar ns+ | Just ('f',fieldNameSpace) <- T.uncons ns+ = Just (fieldName $ mkFastStringByteString $ T.encodeUtf8 fieldNameSpace)+fromNsChar "v" = Just varName+fromNsChar "c" = Just dataName+fromNsChar "t" = Just tcClsName+fromNsChar "z" = Just tvName+fromNsChar _ = Nothing instance ToField OccName where- toField occ = SQLText $ T.pack $ toNsChar (occNameSpace occ) : occNameString occ+ toField occ = SQLText $ T.pack $ toNsChar (occNameSpace occ) ++ occNameString occ instance FromField OccName where fromField fld = case fieldData fld of SQLText t ->- case T.uncons t of- Just (nsChar,occ)- | Just ns <- fromNsChar nsChar ->- return $ mkOccName ns (T.unpack occ)- _ -> returnError ConversionFailed fld "OccName encoding invalid"+ case T.break (== ':') t of+ (nsText,occ)+ | Just ns <- fromNsChar nsText ->+ return $ mkOccName ns (T.unpack $ T.tail occ)+ _ -> returnError ConversionFailed fld ("OccName encoding invalid: " ++ show t) _ -> returnError Incompatible fld "Expected a SQL string representing an OccName" data HieModuleRow@@ -266,21 +272,22 @@ instance Show Symbol where show s = toNsChar (occNameSpace $ symName s)- : ':'- : occNameString (symName s)- <> ":"- <> moduleNameString (moduleName $ symModule s)- <> ":"- -- <> unitIdString (moduleUnit $ symModule s)- <> unitString (moduleUnit $ symModule s)+ <> ( ':'+ : occNameString (symName s)+ <> ":"+ <> moduleNameString (moduleName $ symModule s)+ <> ":"+ -- <> unitIdString (moduleUnit $ symModule s)+ <> unitString (moduleUnit $ symModule s)+ ) instance Read Symbol where readsPrec = const $ R.readP_to_S readSymbol readNameSpace :: R.ReadP NameSpace readNameSpace = do- c <- R.get- maybe R.pfail return (fromNsChar c)+ c <- R.many1 R.get+ maybe R.pfail return (fromNsChar $ T.pack c) readColon :: R.ReadP () readColon = () <$ R.char ':'
test/Main.hs view
@@ -180,7 +180,7 @@ it "outputs the location of symbol when definition site can be found is indexed" $ runHieDbCli ["point-defs", "Module1", "13", "29"] `succeedsWithStdin` unlines- [ "Sub.Module2:7:1-7:8"+ [ "Sub.Module2:8:1-8:8" ] it "Fails with informative error message when there's no symbol at given point" $ do (exitCode, actualStdout, actualStderr) <- runHieDbCli ["point-defs", "Module1", "13", "13"]@@ -196,39 +196,56 @@ describe "point-info" $ do it "gives information about symbol at specified location" $- runHieDbCli ["point-info", "Sub.Module2", "10", "10"]+ runHieDbCli ["point-info", "Sub.Module2", "11", "11"] `succeedsWithStdin` unlines- [ "Span: test/data/Sub/Module2.hs:10:7-23"+ [ "Span: test/data/Sub/Module2.hs:11:7-23" , "Constructors: {(ConDeclH98, ConDecl)}" , "Identifiers:"- , "Symbol:c:Data1Constructor1:Sub.Module2:main"- , "Data1Constructor1 defined at test/data/Sub/Module2.hs:10:7-23"+ , "Symbol:c::Data1Constructor1:Sub.Module2:main"+ , "Data1Constructor1 defined at test/data/Sub/Module2.hs:11:7-23" #if __GLASGOW_HASKELL__ >= 900- , " Details: Nothing {declaration of constructor bound at: test/data/Sub/Module2.hs:10:7-23}"+ , " Details: Nothing {declaration of constructor bound at: test/data/Sub/Module2.hs:11:7-23}" #else- , " IdentifierDetails Nothing {Decl ConDec (Just SrcSpanOneLine \"test/data/Sub/Module2.hs\" 10 7 24)}"+ , " IdentifierDetails Nothing {Decl ConDec (Just SrcSpanOneLine \"test/data/Sub/Module2.hs\" 11 7 24)}" #endif , "Types:\n" ] it "correctly prints type signatures" $ runHieDbCli ["point-info", "Module1", "10", "10"] `succeedsWithStdin` unlines+#if __GLASGOW_HASKELL__ >= 904 [ "Span: test/data/Module1.hs:10:8-11"-#if __GLASGOW_HASKELL__ >= 902+ , "Constructors: {(HsVar, HsExpr), (XExpr, HsExpr)}"+ , "Identifiers:"+ , "$dIntegral defined at <no location info>"+ , " Details: Just Integral Int {usage of evidence variable}"+ , "Symbol:v::even:GHC.Real:base"+ , "even defined at <no location info>"+ , " Details: Just forall a. Integral a => a -> Bool {usage}"+#elif __GLASGOW_HASKELL__ >= 902+ [ "Span: test/data/Module1.hs:10:8-11" , "Constructors: {(XExpr, HsExpr), (HsVar, HsExpr)}"+ , "Identifiers:"+ , "Symbol:v::even:GHC.Real:base"+ , "even defined at <no location info>"+ , " Details: Just forall a. Integral a => a -> Bool {usage}"+ , "$dIntegral defined at <no location info>"+ , " Details: Just Integral Int {usage of evidence variable}" #elif __GLASGOW_HASKELL__ >= 900+ [ "Span: test/data/Module1.hs:10:8-11" , "Constructors: {(HsVar, HsExpr), (XExpr, HsExpr)}"-#else- , "Constructors: {(HsVar, HsExpr), (HsWrap, HsExpr)}"-#endif , "Identifiers:"- , "Symbol:v:even:GHC.Real:base"+ , "Symbol:v::even:GHC.Real:base" , "even defined at <no location info>"-#if __GLASGOW_HASKELL__ >= 900 , " Details: Just forall a. Integral a => a -> Bool {usage}" , "$dIntegral defined at <no location info>" , " Details: Just Integral Int {usage of evidence variable}" #else+ [ "Span: test/data/Module1.hs:10:8-11"+ , "Constructors: {(HsVar, HsExpr), (HsWrap, HsExpr)}"+ , "Identifiers:"+ , "Symbol:v::even:GHC.Real:base"+ , "even defined at <no location info>" , " IdentifierDetails Just forall a. Integral a => a -> Bool {Use}" #endif , "Types:"@@ -240,12 +257,12 @@ describe "name-def" $ it "lookup definition of name" $ runHieDbCli ["name-def", "showInt"]- `succeedsWithStdin` "Sub.Module2:7:1-7:8\n"+ `succeedsWithStdin` "Sub.Module2:8:1-8:8\n" describe "type-def" $ it "lookup definition of type" $ runHieDbCli ["type-def", "Data1"]- `succeedsWithStdin` "Sub.Module2:9:1-11:28\n"+ `succeedsWithStdin` "Sub.Module2:10:1-12:28\n" describe "cat" $ describe "dumps module source stored in .hie file" $ do
test/data/Sub/Module2.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE DuplicateRecordFields #-} module Sub.Module2 ( showInt , Data1(..)@@ -9,3 +10,9 @@ data Data1 = Data1Constructor1 | Data1Constructor2 Int++data Data2+ = Data2C { foo :: Int, bar :: String }++data Data3+ = Data3C { foo :: Int, baz :: Bool }