argon-0.4.1.0: src/Argon/Loc.hs
module Argon.Loc (Loc, srcSpanToLoc, locToString, tagMsg)
where
import Text.Printf (printf)
import Control.Arrow ((&&&))
import qualified SrcLoc as GHC
import qualified FastString as GHC
-- | Type synonym representing a location in the source code. The tuple
-- represents the following: @(start line, start col)@.
type Loc = (Int, Int)
-- | Convert a GHC's 'SrcSpan' to a @(line, column)@ pair. In case of a GHC's
-- "bad span" the resulting pair is @(0, 0)@.
srcSpanToLoc :: GHC.SrcSpan -> Loc
srcSpanToLoc ss = lloc $ GHC.srcSpanStart ss
where lloc = (GHC.srcLocLine &&& GHC.srcLocCol) . toRealSrcLoc
toRealSrcLoc (GHC.RealSrcLoc z) = z
toRealSrcLoc _ = GHC.mkRealSrcLoc (GHC.mkFastString "no info") 0 0
-- | Convert a location to a string of the form "line:col"
locToString :: Loc -> String
locToString = uncurry $ printf "%d:%d"
-- | Add the location to a string message
tagMsg :: Loc -> String -> String
tagMsg s msg = locToString s ++ " " ++ msg