@@ -5,6 +5,7 @@ module StackTrace.Plugin (plugin) where
6import Control.Arrow (first)
6import Control.Arrow (first)
7import Data.Monoid (Any(Any, getAny))
7import Data.Monoid (Any(Any, getAny))
8+import GHC.Types.SrcLoc
8#if __GLASGOW_HASKELL__ >= 900
9#if __GLASGOW_HASKELL__ >= 900
9import GHC.Plugins
10import GHC.Plugins
@@ -49,9 +50,14 @@ importDeclQualified = QualifiedPre
50ghcStackImport :: Located (ImportDecl (GhcPass p))
51ghcStackImport :: Located (ImportDecl (GhcPass p))
51ghcStackImport =
52ghcStackImport =
52− noLoc $
53+ L srcSpan $
53 (simpleImportDecl $ mkModuleName "GHC.Stack")
54 (simpleImportDecl $ mkModuleName "GHC.Stack")
54− {ideclQualified = importDeclQualified, ideclAs = Just $ noLoc ghcStackModuleName}
55+ { ideclQualified = importDeclQualified, ideclAs = Just $ noLoc ghcStackModuleName }
57+ -- This is for GHC-9 related problems. @noLoc@ causes GHC to throw warnings
58+ -- about unused imports. Even if the import is used
59+ -- See: https://github.com/waddlaw/haskell-stack-trace-plugin/issues/16
60+ srcSpan = RealSrcSpan (realSrcLocSpan $ mkRealSrcLoc "haskell-stack-trace-plugin:very-unique-file-name-to-avoid-collision" 1 1) Nothing
56#if __GLASGOW_HASKELL__ >= 900
62#if __GLASGOW_HASKELL__ >= 900
57updateHsModule :: HsModule -> HsModule
63updateHsModule :: HsModule -> HsModule
@@ -160,15 +166,17 @@ updateLHsType = traverse
161-- Main process
167-- Main process
162updateHsType :: HsType GhcPs -> (Any, HsType GhcPs)
168updateHsType :: HsType GhcPs -> (Any, HsType GhcPs)
163−updateHsType (HsQualTy xty ctxt body) =
169+updateHsType ty@(HsQualTy xty ctxt body) =
170+ if hasHasCallStack (unLoc ctxt)
164− flagASTModified $ HsQualTy xty (fmap appendHSC ctxt) body
172+ else flagASTModified $ HsQualTy xty (fmap appendHSC ctxt) body
165updateHsType ty@HsTyVar {} =
173updateHsType ty@HsTyVar {} =
166 flagASTModified $ HsQualTy xQualTy (noLoc $ appendHSC []) (noLoc ty)
174 flagASTModified $ HsQualTy xQualTy (noLoc $ appendHSC []) (noLoc ty)
167updateHsType ty@HsAppTy {} =
175updateHsType ty@HsAppTy {} =
168 flagASTModified $ HsQualTy xQualTy (noLoc $ appendHSC []) (noLoc ty)
176 flagASTModified $ HsQualTy xQualTy (noLoc $ appendHSC []) (noLoc ty)
169updateHsType ty@HsFunTy {} =
177updateHsType ty@HsFunTy {} =
170 flagASTModified $ HsQualTy xQualTy (noLoc $ appendHSC []) (noLoc ty)
178 flagASTModified $ HsQualTy xQualTy (noLoc $ appendHSC []) (noLoc ty)
171−updateHsType ty@HsListTy {} =
179+updateHsType ty@HsListTy {} =
172 flagASTModified $ HsQualTy xQualTy (noLoc $ appendHSC []) (noLoc ty)
180 flagASTModified $ HsQualTy xQualTy (noLoc $ appendHSC []) (noLoc ty)
173updateHsType ty@HsTupleTy {} =
181updateHsType ty@HsTupleTy {} =
174 flagASTModified $ HsQualTy xQualTy (noLoc $ appendHSC []) (noLoc ty)
182 flagASTModified $ HsQualTy xQualTy (noLoc $ appendHSC []) (noLoc ty)
@@ -188,6 +196,13 @@ flagASTModified a = (Any True, a)
188appendHSC :: HsContext GhcPs -> HsContext GhcPs
196appendHSC :: HsContext GhcPs -> HsContext GhcPs
189appendHSC cs = mkHSC : cs
197appendHSC cs = mkHSC : cs
199+hasHasCallStack :: HsContext GhcPs -> Bool
200+hasHasCallStack = any (checkHsType . unLoc)
202+ checkHsType :: HsType GhcPs -> Bool
203+ checkHsType (HsTyVar _ _ lid) = unLoc lid == (mkRdrUnqual $ mkClsOcc "HasCallStack")
204+ checkHsType _ = False
191-- make HasCallStack => constraint
206-- make HasCallStack => constraint
192mkHSC :: LHsType GhcPs
207mkHSC :: LHsType GhcPs
193mkHSC = noLoc $ HsTyVar xQualTy NotPromoted lId
208mkHSC = noLoc $ HsTyVar xQualTy NotPromoted lId