on 516c3fe help sign in
elk/src/AST/Annotation.hs
73 lines 2.1 kB history raw
1module AST.Annotation where
3import qualified Text.Parsec.Pos as Parsec
4import qualified Text.PrettyPrint as P
5import AST.PrettyPrint
7data Annotated annotation expr = A annotation expr
8 deriving (Show)
10data Region
11 = Span Position Position P.Doc
12 | None P.Doc
13 deriving (Show)
15data Position = Position
16 { line :: Int
17 , column :: Int
18 } deriving (Show)
20type Located expr = Annotated Region expr
22none e = A (None (pretty e)) e
23noneNoDocs e = A (None P.empty) e
25at :: (Pretty expr) => Parsec.SourcePos -> Parsec.SourcePos -> expr
26 -> Annotated Region expr
27at start end e =
28 A (Span (position start) (position end) (pretty e)) e
29 where
30 position loc = Position (Parsec.sourceLine loc) (Parsec.sourceColumn loc)
32merge (A s1 _) (A s2 _) e =
33 A (span (pretty e)) e
34 where
35 span = case (s1,s2) of
36 (Span start _ _, Span _ end _) -> Span start end
37 (Span start end _, _) -> Span start end
38 (_, Span start end _) -> Span start end
39 (_, _) -> None
41mergeOldDocs (A s1 _) (A s2 _) e =
42 A span e
43 where
44 span = case (s1,s2) of
45 (Span start _ d1, Span _ end d2) ->
46 Span start end (P.vcat [d1, P.text "\n", d2])
48 (Span _ _ _, _) -> s1
49 (_, Span _ _ _) -> s2
50 (_, _) -> None P.empty
52sameAs :: Annotated a expr -> expr' -> Annotated a expr'
53sameAs (A annotation _) expr = A annotation expr
55getRegionDocs region =
56 case region of
57 Span _ _ doc -> doc
58 None doc -> doc
60instance Pretty Region where
61 pretty span =
62 case span of
63 None _ -> P.empty
64 Span start end _ ->
65 P.text $
66 case line start == line end of
67 False -> "between lines " ++ show (line start) ++ " and " ++ show (line end)
68 True -> "on line " ++ show (line end) ++ ", column " ++
69 show (column start) ++ " to " ++ show (column end)
71instance Pretty e => Pretty (Annotated a e) where
72 pretty (A _ e) = pretty e