module Error where import Data.List (sort) import Text.Parsec (SourcePos, errorPos) import Text.Parsec.Error (ParseError, errorMessages, showErrorMessages) data ErrorType = GenericError | TypeError | UnexpectedReturn | AlreadyDefined | NonCallable deriving (Show) instance Enum ErrorType where fromEnum GenericError = 0 fromEnum TypeError = 1 fromEnum UnexpectedReturn = 2 fromEnum AlreadyDefined = 3 fromEnum NonCallable = 4 toEnum _ = error "toEnum is undefined for Error" data Error = Error ErrorType String SourcePos deriving (Eq) instance Show Error where show (Error _ message pos) = show pos ++ " error: " ++ message showParserError :: ParseError -> String showParserError error = show (errorPos error) ++ " error: syntax error" ++ showErrorMessages "or" "unknown parser error" " expected:" " found:" "end of input" (errorMessages error) instance Ord Error where compare (Error _ _ pos1) (Error _ _ pos2) = compare pos1 pos2 instance Eq ErrorType where e1 == e2 = fromEnum e1 == fromEnum e2 showErrorList :: [Error] -> String showErrorList errs = unlines $ map show (sort errs)