on fcf5cef help sign in
elk/src/Reporting/Region.hs
70 lines 1.3 kB history raw
1{-# LANGUAGE OverloadedStrings #-}
2module Reporting.Region where
4import Data.Aeson ((.=))
5import qualified Data.Aeson as Json
6import qualified Text.Parsec.Pos as Parsec
9data Region =
10 Region
11 { start :: !Position
12 , end :: !Position
13 }
14 deriving (Eq, Show)
17data Position =
18 Position
19 { line :: {-# UNPACK #-} !Int
20 , column :: {-# UNPACK #-} !Int
21 }
22 deriving (Eq, Show)
25fromSourcePos :: Parsec.SourcePos -> Position
26fromSourcePos sourcePos =
27 Position
28 (Parsec.sourceLine sourcePos)
29 (Parsec.sourceColumn sourcePos)
32merge :: Region -> Region -> Region
33merge (Region start _) (Region _ end) =
34 Region start end
38-- TO STRING
41toString :: Region -> String
42toString (Region (Position startLine startColumn) (Position endLine endColumn)) =
43 case startLine == endLine of
44 False ->
45 "between lines " ++ show startLine
46 ++ " and " ++ show endLine
48 True ->
49 "on line " ++ show endLine ++ ", column "
50 ++ show startColumn ++ " to " ++ show endColumn
54-- JSON
57instance Json.ToJSON Region where
58 toJSON (Region start end) =
59 Json.object
60 [ "start" .= start
61 , "end" .= end
62 ]
65instance Json.ToJSON Position where
66 toJSON (Position line column) =
67 Json.object
68 [ "line" .= line
69 , "column" .= column
70 ]