elm/compiler/SourceSyntax/Location.hs

56 lines
1.7 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
Span start end _ -> show start ++ " to " ++ show end
NoSpan str -> str
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