@@ -1,40 +1,56 @@
1{-# LANGUAGE DeriveDataTypeable #-}
1{-# LANGUAGE DeriveDataTypeable #-}
2module SourceSyntax.Location where
2module SourceSyntax.Location where
4−import qualified Text.Parsec.Pos as Parsec
5import Data.Data
4import Data.Data
5+import Text.PrettyPrint
6+import SourceSyntax.PrettyPrint
7+import qualified Text.Parsec.Pos as Parsec
7data SrcPos = Pos { line :: Int, column :: Int }
9data SrcPos = Pos { line :: Int, column :: Int }
8 deriving (Eq, Ord, Data, Typeable)
10 deriving (Eq, Ord, Data, Typeable)
10−data SrcSpan = Span SrcPos SrcPos | NoSpan
12+data SrcSpan = Span SrcPos SrcPos String | NoSpan String
11 deriving (Eq, Ord, Data, Typeable)
13 deriving (Eq, Ord, Data, Typeable)
13data Located e = L SrcSpan e
15data Located e = L SrcSpan e
14 deriving (Eq, Ord, Data, Typeable)
16 deriving (Eq, Ord, Data, Typeable)
18+none e = L (NoSpan (render $ pretty e)) e
19+noneNoDocs = L (NoSpan "")
21+at start end e = L (Span (Pos (Parsec.sourceLine start) (Parsec.sourceColumn start))
22+ (Pos (Parsec.sourceLine end ) (Parsec.sourceColumn end ))
23+ (render $ pretty e)) e
25+merge (L s1 _) (L s2 _) e = L (span (render $ pretty e)) e
26+ where span = case (s1,s2) of
27+ (Span start _ _, Span _ end _) -> Span start end
28+ (Span start end _, _) -> Span start end
29+ (_, Span start end _) -> Span start end
32+mergeOldDocs (L s1 _) (L s2 _) e = L span e
33+ where span = case (s1,s2) of
34+ (Span start _ d1, Span _ end d2) -> Span start end (d1 ++ "\n\n" ++ d2)
35+ (Span _ _ _, _) -> s1
36+ (_, Span _ _ _) -> s2
17instance Show SrcPos where
42instance Show SrcPos where
18− show (Pos r c) = "Line " ++ show r ++ ", Column " ++ show c
43+ show (Pos r c) = show r ++ "," ++ show c
20instance Show SrcSpan where
45instance Show SrcSpan where
21 show span =
46 show span =
22 case span of
47 case span of
23− Span start end -> show start
48+ Span start end _ -> show start ++ " to " ++ show end
24− NoSpan -> ""
49+ NoSpan str -> str
26instance Show e => Show (Located e) where
51instance Show e => Show (Located e) where
27− show (L _ e) = show e
52+ show (L s e) = "L (" ++ show s ++ ") (" ++ show e ++ ")"
29−none = L NoSpan
54+instance Pretty a => Pretty (Located a) where
30−
55+ pretty (L _ e) = pretty e
31−at start end = L (Span (Pos (Parsec.sourceLine start) (Parsec.sourceColumn start))
32− (Pos (Parsec.sourceLine end ) (Parsec.sourceColumn end )))
34−merge (L s1 _) (L s2 _) = L span
35− where span = case (s1,s2) of
36− (Span start _, Span _ end) -> Span start end