31 lines
860 B
Haskell
31 lines
860 B
Haskell
-- Metadata types
|
|
|
|
module Metadata where
|
|
|
|
import Data.Generics
|
|
import Data.List
|
|
|
|
type Meta = [Metadatum]
|
|
|
|
data Metadatum =
|
|
SourcePos String Int Int
|
|
deriving (Show, Eq, Typeable, Data)
|
|
|
|
findSourcePos :: Meta -> Maybe Metadatum
|
|
findSourcePos ms = find (\x -> case x of SourcePos _ _ _ -> True
|
|
otherwise -> False) ms
|
|
|
|
formatSourcePos :: Meta -> String
|
|
formatSourcePos m = case findSourcePos m of
|
|
Just (SourcePos f l c) -> "<@" ++ show l ++ ":" ++ show c ++ ">"
|
|
Nothing -> "<?>"
|
|
|
|
die :: Monad m => String -> m a
|
|
die s = error $ "error: " ++ s
|
|
|
|
dieP :: Monad m => Meta -> String -> m a
|
|
dieP m s = case findSourcePos m of
|
|
Just (SourcePos f l c) -> die $ f ++ ":" ++ (show l) ++ ":" ++ (show c) ++ ": " ++ s
|
|
Nothing -> die $ "unknown position: " ++ s
|
|
|