{-# LANGUAGE CPP, DeriveFunctor #-}
module Location where
import Control.DeepSeq (deepseq, NFData(rnf))
import SrcLoc hiding (Located)
import qualified SrcLoc as GHC
import FastString (unpackFS)
#if __GLASGOW_HASKELL__ < 702
import Outputable (showPpr)
#endif
data Located a = Located Location a
deriving (Eq, Show, Functor)
instance NFData a => NFData (Located a) where
rnf (Located loc a) = loc `deepseq` a `deepseq` ()
toLocated :: GHC.Located a -> Located a
toLocated (L loc a) = Located (toLocation loc) a
unLoc :: Located a -> a
unLoc (Located _ a) = a
noLocation :: a -> Located a
noLocation = Located (UnhelpfulLocation "<no location info>")
type Line = Int
data Location = UnhelpfulLocation String | Location FilePath Line
deriving Eq
instance Show Location where
show (UnhelpfulLocation s) = s
show (Location file line) = file ++ ":" ++ show line
instance NFData Location where
rnf (UnhelpfulLocation str) = str `deepseq` ()
rnf (Location file line) = file `deepseq` line `deepseq` ()
enumerate :: Location -> [Location]
enumerate loc = case loc of
UnhelpfulLocation _ -> repeat loc
Location file line -> map (Location file) [line ..]
toLocation :: SrcSpan -> Location
#if __GLASGOW_HASKELL__ < 702
toLocation loc
| isGoodSrcLoc start = Location (unpackFS $ srcLocFile start) (srcLocLine start)
| otherwise = (UnhelpfulLocation . showPpr) start
where
start = srcSpanStart loc
#else
toLocation loc = case loc of
UnhelpfulSpan str -> UnhelpfulLocation (unpackFS str)
RealSrcSpan sp -> Location (unpackFS . srcSpanFile $ sp) (srcSpanStartLine sp)
#endif