# DExTer : Debugging Experience Tester
# ~~~~~~   ~         ~~         ~   ~~
#
# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
# See https://llvm.org/LICENSE.txt for license information.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
"""Provides Dexter-specific exception types."""


class Dexception(Exception):
    """All dexter-specific exceptions derive from this."""
    pass


class Error(Dexception):
    """Error.  Prints 'error: <message>' without a traceback."""
    pass


class DebuggerException(Dexception):
    """Any error from using the debugger."""

    def __init__(self, msg, orig_exception=None):
        super(DebuggerException, self).__init__(msg)
        self.msg = msg
        self.orig_exception = orig_exception

    def __str__(self):
        return str(self.msg)


class LoadDebuggerException(DebuggerException):
    """If specified debugger cannot be loaded."""
    pass


class NotYetLoadedDebuggerException(LoadDebuggerException):
    """If specified debugger has not yet been attempted to load."""

    def __init__(self):
        super(NotYetLoadedDebuggerException,
              self).__init__('not loaded', orig_exception=None)


class CommandParseError(Dexception):
    """If a command instruction cannot be successfully parsed."""

    def __init__(self, *args, **kwargs):
        super(CommandParseError, self).__init__(*args, **kwargs)
        self.filename = None
        self.lineno = None
        self.info = None
        self.src = None
        self.caret = None


class ToolArgumentError(Dexception):
    """If a tool argument is invalid."""
    pass


class BuildScriptException(Dexception):
    """If there is an error in a build script file."""

    def __init__(self, *args, **kwargs):
        self.script_error = kwargs.pop('script_error', None)
        super(BuildScriptException, self).__init__(*args, **kwargs)


class HeuristicException(Dexception):
    """If there was a problem with the heuristic."""
    pass
