Skip to content
/ sift Public

Sift through Haskell code for analysis purposes

Notifications You must be signed in to change notification settings

fpco/sift

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

31 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

sift

Sift through Haskell code for analysis purposes

Install

Install so it's available for any projects using this version of GHC:

stack install --copy-compiler-tool

Example use

Use the bindings in sift-bindings/base-4.9.0.0/ to seed the base package. Now you can use the sift trace command and flag up direct or indirect uses of a given binding.

$ sift trace sift-bindings/*/* --flag-binding "ghc-prim GHC.Prim raise#"
Flagged binding: ghc-prim:GHC.Prim.raise#
  Used by aeson:Data.Aeson.Encoding.Builder.day
  Used by aeson:Data.Aeson.Encoding.Builder.digit
  Used by aeson:Data.Aeson.Encoding.Builder.scientific
  Used by aeson:Data.Aeson.Encoding.Builder.timeOfDay64
  Used by aeson:Data.Aeson.Encoding.Builder.timeZone
  Used by aeson:Data.Aeson.Encoding.Builder.twoDigits
  Used by aeson:Data.Aeson.Internal.Time.diffTimeOfDay64
  Used by aeson:Data.Aeson.Parser.Time.seconds
  Used by aeson:Data.Aeson.Parser.Time.timeZone
  Used by aeson:Data.Aeson.Parser.Unescape.unescapeText'
  [snip]
  Used by base:Control.Exception.Base.noMethodBindingError
  Used by base:Control.Exception.Base.nonExhaustiveGuardsError
  Used by base:Control.Exception.Base.patError
  Used by base:Control.Exception.Base.recConError
  Used by base:Control.Exception.Base.recSelError
  Used by base:Control.Exception.Base.runtimeError
  Used by base:Control.Exception.Base.typeError
  Used by base:Control.Monad.Fix.mfix
  [snip]

See full gist for full output.

Discovery

If you're not sure what the proper location for a binding is, search by identifier:

$ sift find sift-bindings/base-4.9.0.0/*.json --ident "fork#"
Binding id: ghc-prim:GHC.Prim.fork#

Generate bindings

For e.g. the aeson package, use sift-compiler in the aeson package directory:

$ SIFT_PACKAGE=aeson stack ghci --with-ghc sift-compiler aeson:lib

(cabal repl should also work similarly!)

That will generate a bunch of files in the current directory for each module:

bindings_main_Data.Aeson.Encode.json
bindings_main_Data.Aeson.Parser.Time.json
bindings_main_Data.Aeson.Encoding.Builder.json
bindings_main_Data.Aeson.Parser.Unescape.json
...

Use this to seed sift as above.

About

Sift through Haskell code for analysis purposes

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published