c2hs-0.28.6: src/Data/Errors.hs
-- Compiler Toolkit: basic error management
--
-- Author : Manuel M. T. Chakravarty
-- Created: 20 February 95
--
-- Copyright (c) [1995..2000] Manuel M. T. Chakravarty
--
-- This library is free software; you can redistribute it and/or
-- modify it under the terms of the GNU Library General Public
-- License as published by the Free Software Foundation; either
-- version 2 of the License, or (at your option) any later version.
--
-- This library is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-- Library General Public License for more details.
--
--- DESCRIPTION ---------------------------------------------------------------
--
-- This modules exports some auxiliary routines for error handling.
--
--- DOCU ----------------------------------------------------------------------
--
-- language: Haskell 98
--
-- * the single lines of error messages shouldn't be to long as file name
-- and position are prepended at each line
--
--- TODO ----------------------------------------------------------------------
--
module Data.Errors (
-- handling of internal error
--
interr, todo,
--
-- errors in the compiled program (wrapper to Language.C Error type)
--
ErrorLevel(..), Error, makeError, errorLevel, showError, errorAtPos
) where
import Language.C.Data.Error hiding (Error)
import Language.C.Data.Position
type Error = CError
-- internal errors
-- ---------------
-- | raise a fatal internal error; message may have multiple lines
--
interr :: String -> a
interr msg = error ("INTERNAL COMPILER ERROR:\n"
++ indentMultilineString 2 msg
++ "\n")
-- | raise a error due to a implementation restriction; message may have multiple
-- lines
--
todo :: String -> a
todo msg = error ("Feature not yet implemented:\n"
++ indentMultilineString 2 msg
++ "\n")
-- | produce an 'Error', given its level, position, and a list of lines of
-- the error message that must not be empty
--
makeError :: ErrorLevel -> Position -> [String] -> Error
makeError lvl pos msgs = CError $ ErrorInfo lvl pos msgs
errorAtPos :: Position -> [String] -> a
errorAtPos pos = error
--FIXME: should be using show here, but Show instance
-- for CError from language-c is weird
. showErrorInfo "" . errorInfo
. makeError LevelError pos
-- | indent the given multiline text by the given number of spaces
--
indentMultilineString :: Int -> String -> String
indentMultilineString n = unlines . (map (spaces++)) . lines
where
spaces = take n (repeat ' ')