haskell-stack-trace-plugin: haskell-stack-trace-plugin

This is a package candidate release! Here you can preview how this package release will appear once published to the main package index (which can be accomplished via the 'maintain' link below). Please note that once a package has been published to the main package index it cannot be undone! Please consult the package uploading documentation for more information.

[maintain]

This plugin allow implicitly add HasCallStack class to every top-level function for all module. Hence, we can to get completely continuous call stack.


[Skip to ReadMe]

Properties

Versions0.1.0.0, 0.1.0.0
Change logCHANGELOG.md
Dependenciesbase (==4.12.*), ghc (==8.6.2), haskell-stack-trace-plugin [details]
LicenseMIT
Copyright2018 Shinya Yamaguchi
AuthorShinya Yamaguchi
Maintaineringronze@gmail.com
CategoryCompiler Plugin, Development, Debug
Home pagehttps://github.com/waddlaw/haskell-stack-trace-plugin
Bug trackerhttps://github.com/waddlaw/haskell-stack-trace-plugin/issues
Source repositoryhead: git clone git://github.com/waddlaw/haskell-stack-trace-plugin
Executablesexample
UploadedFri Dec 7 06:28:36 UTC 2018 by waddlaw

Modules

Downloads

Maintainers' corner

For package maintainers and hackage trustees


Readme for haskell-stack-trace-plugin-0.1.0.0

[back to package description]

haskell-stack-trace-plugin

This plugin allow implicitly add HasCallStack class to every top-level function for all module. Hence, we can to get completely continuous call stack.

  1. (implicitly) Import GHC.Stack for all modules.
  2. Add HasCallStack constraint for all top-level functions.

Requirement: (8.6 <= on GHC)

Synopsis

module Main where

import Data.Maybe (fromJust)

main :: IO ()
main = print f1

f1 :: Int
f1 = f2

f2 :: Int
f2 = f3

-- HsQualTy
f3 :: HasCallStack => Int
f3 = f4 0

-- HsQualTy
f4 :: Show a => a -> Int
f4 _ = f5 0 0

-- HsFunTy
f5 :: Int -> Int -> Int
f5 _ _ = head f6

-- HsListTy
f6 :: [Int]
f6 = [fst f7]

-- HsTupleTy
f7 :: (Int, Int)
f7 = (fromJust f8, fromJust f8)

-- HsAppTy
f8 :: Maybe Int
f8 = Just fError

-- HsTyVar
fError :: Int
fError = error "fError"

This example get error:

$ cabal new-build
example/Main.hs:15:7: error:
    Not in scope: type constructor or class ‘HasCallStack’
   |
15 | f3 :: HasCallStack => Int
   |       ^^^^^^^^^^^^

Yes, add import GHC.Stack to above example.

Fix and rebuild!

$ cabal new-run
example: fError
CallStack (from HasCallStack):
  error, called at example/Main.hs:41:10 in main:Main

Hmm, it is not useful. But, you will to be happy when enable this plugin.

  ghc-options:
    -fplugin=StackTrace.Plugin
$ cabal new-run
...

example: fError
CallStack (from HasCallStack):
  error, called at example/Main.hs:40:10 in main:Main
  fError, called at example/Main.hs:36:11 in main:Main
  f8, called at example/Main.hs:32:16 in main:Main
  f7, called at example/Main.hs:28:11 in main:Main
  f6, called at example/Main.hs:24:15 in main:Main
  f5, called at example/Main.hs:20:8 in main:Main
  f4, called at example/Main.hs:16:6 in main:Main
  f3, called at example/Main.hs:12:6 in main:Main
  f2, called at example/Main.hs:9:6 in main:Main
  f1, called at example/Main.hs:6:14 in main:Main
  main, called at example/Main.hs:6:1 in main:Main

Great!!!