Path: blob/main/Tools/c-analyzer/c_parser/preprocessor/errors.py
12 views
import sys123OS = sys.platform456def _as_tuple(items):7if isinstance(items, str):8return tuple(items.strip().replace(',', ' ').split())9elif items:10return tuple(items)11else:12return ()131415class PreprocessorError(Exception):16"""Something preprocessor-related went wrong."""1718@classmethod19def _msg(cls, filename, reason, **ignored):20msg = 'failure while preprocessing'21if reason:22msg = f'{msg} ({reason})'23return msg2425def __init__(self, filename, preprocessor=None, reason=None):26if isinstance(reason, str):27reason = reason.strip()2829self.filename = filename30self.preprocessor = preprocessor or None31self.reason = str(reason) if reason else None3233msg = self._msg(**vars(self))34msg = f'({filename}) {msg}'35if preprocessor:36msg = f'[{preprocessor}] {msg}'37super().__init__(msg)383940class PreprocessorFailure(PreprocessorError):41"""The preprocessor command failed."""4243@classmethod44def _msg(cls, error, **ignored):45msg = 'preprocessor command failed'46if error:47msg = f'{msg} {error}'48return msg4950def __init__(self, filename, argv, error=None, preprocessor=None):51exitcode = -152if isinstance(error, tuple):53if len(error) == 2:54error, exitcode = error55else:56error = str(error)57if isinstance(error, str):58error = error.strip()5960self.argv = _as_tuple(argv) or None61self.error = error if error else None62self.exitcode = exitcode6364reason = str(self.error)65super().__init__(filename, preprocessor, reason)666768class ErrorDirectiveError(PreprocessorFailure):69"""The file hit a #error directive."""7071@classmethod72def _msg(cls, error, **ignored):73return f'#error directive hit ({error})'7475def __init__(self, filename, argv, error, *args, **kwargs):76super().__init__(filename, argv, error, *args, **kwargs)777879class MissingDependenciesError(PreprocessorFailure):80"""The preprocessor did not have access to all the target's dependencies."""8182@classmethod83def _msg(cls, missing, **ignored):84msg = 'preprocessing failed due to missing dependencies'85if missing:86msg = f'{msg} ({", ".join(missing)})'87return msg8889def __init__(self, filename, missing=None, *args, **kwargs):90self.missing = _as_tuple(missing) or None9192super().__init__(filename, *args, **kwargs)939495class OSMismatchError(MissingDependenciesError):96"""The target is not compatible with the host OS."""9798@classmethod99def _msg(cls, expected, **ignored):100return f'OS is {OS} but expected {expected or "???"}'101102def __init__(self, filename, expected=None, *args, **kwargs):103if isinstance(expected, str):104expected = expected.strip()105106self.actual = OS107self.expected = expected if expected else None108109super().__init__(filename, None, *args, **kwargs)110111112