ghc-exactprint-0.6.4: tests/Test/Consistency.hs
{-# LANGUAGE CPP #-}
module Test.Consistency where
import Data.Data
import GHC
import qualified Data.Map as Map
import qualified Data.Set as Set
import Data.Generics (everything, mkQ)
import Language.Haskell.GHC.ExactPrint.Types (AnnSpan)
import Language.Haskell.GHC.ExactPrint.Utils (isPointSrcSpan, rs)
-- import Debug.Trace
checkConsistency :: Data a => GHC.ApiAnns -> a -> [(AnnSpan, (AnnKeywordId, [AnnSpan]))]
checkConsistency anns ast =
let srcspans = Set.fromList $ map rs $ getAllSrcSpans ast
cons (s, (_, vs)) = Set.member s srcspans || (all (isPointSrcSpan) vs)
in filter (\s -> not (cons s)) (getAnnSrcSpans anns)
getAnnSrcSpans :: ApiAnns -> [(AnnSpan,(AnnKeywordId,[AnnSpan]))]
#if __GLASGOW_HASKELL__ >= 900
getAnnSrcSpans anns = map (\((ss,k),v) -> (ss,(k,v))) $ Map.toList (GHC.apiAnnItems anns)
#else
getAnnSrcSpans (anns,_) = map (\((ss,k),v) -> (ss,(k,v))) $ Map.toList anns
#endif
getAllSrcSpans :: (Data t) => t -> [SrcSpan]
getAllSrcSpans ast = everything (++) ([] `mkQ` getSrcSpan) ast
where
getSrcSpan :: SrcSpan -> [SrcSpan]
getSrcSpan ss = [ss]