on master help sign in
style: modern indentation and more type signatures
6398333Evan Czaplicki
src/AST/Annotation.hs+62−24
@@ -4,59 +4,97 @@ import qualified Text.Parsec.Pos as Parsec
4import qualified Text.PrettyPrint as P
4import qualified Text.PrettyPrint as P
5import AST.PrettyPrint
5import AST.PrettyPrint
6
6
7+
7−data Annotated annotation expr = A annotation expr
8+data Annotated annotation expr
9+ = A annotation expr
8 deriving (Show)
10 deriving (Show)
9
11
12+
10data Region
13data Region
11 = Span Position Position P.Doc
14 = Span Position Position P.Doc
12 | None P.Doc
15 | None P.Doc
13 deriving (Show)
16 deriving (Show)
14
17
18+
15data Position = Position
19data Position = Position
16 { line :: Int
20 { line :: Int
17 , column :: Int
21 , column :: Int
22+ }
18− } deriving (Show)
23+ deriving (Show)
24+
25+
26+type Located expr =
27+ Annotated Region expr
19
28
20−type Located expr = Annotated Region expr
21
29
30+none :: (Pretty expr) => expr -> Located expr
31+none e =
22−none e = A (None (pretty e)) e
32+ A (None (pretty e)) e
23−noneNoDocs e = A (None P.empty) e
24
33
34+
35+noneNoDocs :: a -> Located a
36+noneNoDocs e =
37+ A (None P.empty) e
38+
39+
40+at :: (Pretty expr)
25−at :: (Pretty expr) => Parsec.SourcePos -> Parsec.SourcePos -> expr
41+ => Parsec.SourcePos
42+ -> Parsec.SourcePos
43+ -> expr
26− -> Annotated Region expr
44+ -> Annotated Region expr
27at start end e =
45at start end e =
28 A (Span (position start) (position end) (pretty e)) e
46 A (Span (position start) (position end) (pretty e)) e
29− where
47+ where
48+ position loc =
30− position loc = Position (Parsec.sourceLine loc) (Parsec.sourceColumn loc)
49+ Position (Parsec.sourceLine loc) (Parsec.sourceColumn loc)
31
50
51+
52+merge :: (Pretty expr) => Located a -> Located b -> expr -> Located expr
32merge (A s1 _) (A s2 _) e =
53merge (A s1 _) (A s2 _) e =
33 A (span (pretty e)) e
54 A (span (pretty e)) e
34− where
55+ where
56+ span =
35− span = case (s1,s2) of
57+ case (s1,s2) of
36− (Span start _ _, Span _ end _) -> Span start end
58+ (Span start _ _, Span _ end _) ->
59+ Span start end
60+
37− (Span start end _, _) -> Span start end
61+ (Span start end _, _) ->
38− (_, Span start end _) -> Span start end
62+ Span start end
39− (_, _) -> None
40
63
64+ (_, Span start end _) ->
65+ Span start end
66+
67+ (_, _) -> None
68+
69+
70+mergeOldDocs :: Located a -> Located b -> c -> Located c
41mergeOldDocs (A s1 _) (A s2 _) e =
71mergeOldDocs (A s1 _) (A s2 _) e =
42 A span e
72 A span e
43− where
73+ where
74+ span =
44− span = case (s1,s2) of
75+ case (s1,s2) of
45− (Span start _ d1, Span _ end d2) ->
76+ (Span start _ d1, Span _ end d2) ->
46− Span start end (P.vcat [d1, P.text "\n", d2])
77+ Span start end (P.vcat [d1, P.text "\n", d2])
78+
79+ (Span _ _ _, _) -> s1
80+
81+ (_, Span _ _ _) -> s2
82+
83+ (_, _) -> None P.empty
47
84
48− (Span _ _ _, _) -> s1
49− (_, Span _ _ _) -> s2
50− (_, _) -> None P.empty
51
85
52sameAs :: Annotated a expr -> expr' -> Annotated a expr'
86sameAs :: Annotated a expr -> expr' -> Annotated a expr'
53−sameAs (A annotation _) expr = A annotation expr
87+sameAs (A annotation _) expr =
88+ A annotation expr
89+
54
90
91+getRegionDocs :: Region -> P.Doc
55getRegionDocs region =
92getRegionDocs region =
56 case region of
93 case region of
57 Span _ _ doc -> doc
94 Span _ _ doc -> doc
58 None doc -> doc
95 None doc -> doc
59
96
97+
60instance Pretty Region where
98instance Pretty Region where
61 pretty span =
99 pretty span =
62 case span of
100 case span of
@@ -68,6 +106,6 @@ instance Pretty Region where
68 True -> "on line " ++ show (line end) ++ ", column " ++
106 True -> "on line " ++ show (line end) ++ ", column " ++
69 show (column start) ++ " to " ++ show (column end)
107 show (column start) ++ " to " ++ show (column end)
70
108
109+
71instance Pretty e => Pretty (Annotated a e) where
110instance Pretty e => Pretty (Annotated a e) where
72 pretty (A _ e) = pretty e
111 pretty (A _ e) = pretty e
73−