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] [Publish]

Warnings:

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

Versions 0.1.0.0, 0.1.1.0, 0.1.1.0, 0.1.1.1, 0.1.2.0, 0.1.3.0
Change log CHANGELOG.md
Dependencies base (>=4.12 && <4.13), ghc (>=8.6 && <8.7), haskell-stack-trace-plugin [details]
License MIT
Copyright 2018-2020 Shinya Yamaguchi
Author Shinya Yamaguchi
Maintainer ingronze@gmail.com
Category Compiler Plugin, Development, Debug
Home page https://github.com/waddlaw/haskell-stack-trace-plugin
Bug tracker https://github.com/waddlaw/haskell-stack-trace-plugin/issues
Source repo head: git clone git://github.com/waddlaw/haskell-stack-trace-plugin
Uploaded by waddlaw at 2020-01-18T04:45:53Z

Modules

[Index] [Quick Jump]

Flags

Manual Flags

NameDescriptionDefault
dev

Turn on development settings.

Disabled

Use -f <flag> to enable a flag, or -f -<flag> to disable that flag. More info

Downloads

Maintainer's Corner

Package maintainers

For package maintainers and hackage trustees


Readme for haskell-stack-trace-plugin-0.1.1.0

[back to package description]

haskell-stack-trace-plugin

Hackage

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!!!