60 lines
2 KiB
Haskell
60 lines
2 KiB
Haskell
{-# LANGUAGE DeriveDataTypeable #-}
|
|
module SourceSyntax.Location where
|
|
|
|
import Data.Data
|
|
import Text.PrettyPrint
|
|
import SourceSyntax.PrettyPrint
|
|
import qualified Text.Parsec.Pos as Parsec
|
|
|
|
data SrcPos = Pos { line :: Int, column :: Int }
|
|
deriving (Eq, Ord, Data, Typeable)
|
|
|
|
data SrcSpan = Span SrcPos SrcPos String | NoSpan String
|
|
deriving (Eq, Ord, Data, Typeable)
|
|
|
|
data Located e = L SrcSpan e
|
|
deriving (Eq, Ord, Data, Typeable)
|
|
|
|
none e = L (NoSpan (render $ pretty e)) e
|
|
noneNoDocs = L (NoSpan "")
|
|
|
|
at start end e = L (Span (Pos (Parsec.sourceLine start) (Parsec.sourceColumn start))
|
|
(Pos (Parsec.sourceLine end ) (Parsec.sourceColumn end ))
|
|
(render $ pretty e)) e
|
|
|
|
merge (L s1 _) (L s2 _) e = L (span (render $ pretty e)) e
|
|
where span = case (s1,s2) of
|
|
(Span start _ _, Span _ end _) -> Span start end
|
|
(Span start end _, _) -> Span start end
|
|
(_, Span start end _) -> Span start end
|
|
(_, _) -> NoSpan
|
|
|
|
mergeOldDocs (L s1 _) (L s2 _) e = L span e
|
|
where span = case (s1,s2) of
|
|
(Span start _ d1, Span _ end d2) -> Span start end (d1 ++ "\n\n" ++ d2)
|
|
(Span _ _ _, _) -> s1
|
|
(_, Span _ _ _) -> s2
|
|
(_, _) -> NoSpan ""
|
|
|
|
sameAs (L s _) = L s
|
|
|
|
|
|
instance Show SrcPos where
|
|
show (Pos r c) = show r ++ "," ++ show c
|
|
|
|
instance Show SrcSpan where
|
|
show span =
|
|
case span of
|
|
NoSpan _ -> ""
|
|
Span start end _ ->
|
|
case line start == line end of
|
|
False -> "between lines " ++ show (line start) ++ " and " ++ show (line end)
|
|
True -> "on line " ++ show (line end) ++ ", column " ++
|
|
show (column start) ++ " to " ++ show (column end)
|
|
|
|
instance Show e => Show (Located e) where
|
|
show (L s e) = "L (" ++ show s ++ ") (" ++ show e ++ ")"
|
|
|
|
instance Pretty a => Pretty (Located a) where
|
|
pretty (L _ e) = pretty e
|
|
|