@@ -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
7−data Annotated annotation expr = A annotation expr
8+data Annotated annotation expr
8 deriving (Show)
10 deriving (Show)
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)
15data Position = Position
19data Position = Position
16 { line :: Int
20 { line :: Int
17 , column :: Int
21 , column :: Int
18− } deriving (Show)
23+ deriving (Show)
27+ Annotated Region expr
20−type Located expr = Annotated Region expr
30+none :: (Pretty expr) => expr -> Located expr
22−none e = A (None (pretty e)) e
32+ A (None (pretty e)) e
23−noneNoDocs e = A (None P.empty) e
35+noneNoDocs :: a -> Located a
25−at :: (Pretty expr) => Parsec.SourcePos -> Parsec.SourcePos -> expr
41+ => Parsec.SourcePos
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
30− position loc = Position (Parsec.sourceLine loc) (Parsec.sourceColumn loc)
49+ Position (Parsec.sourceLine loc) (Parsec.sourceColumn loc)
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
35− span = case (s1,s2) of
57+ case (s1,s2) of
36− (Span start _ _, Span _ end _) -> Span start end
58+ (Span start _ _, Span _ end _) ->
37− (Span start end _, _) -> Span start end
61+ (Span start end _, _) ->
38− (_, Span start end _) -> Span start end
62+ Span start end
64+ (_, Span start end _) ->
70+mergeOldDocs :: Located a -> Located b -> c -> Located c
41mergeOldDocs (A s1 _) (A s2 _) e =
71mergeOldDocs (A s1 _) (A s2 _) e =
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])
79+ (Span _ _ _, _) -> s1
81+ (_, Span _ _ _) -> s2
83+ (_, _) -> None P.empty
48− (Span _ _ _, _) -> s1
49− (_, Span _ _ _) -> s2
50− (_, _) -> None P.empty
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 =
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
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)
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