errors.py 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. import ast
  2. from typing import Optional
  3. from ..errors import TritonError
  4. class CompilationError(TritonError):
  5. """Base class for all errors raised during compilation"""
  6. source_line_count_max_in_message = 12
  7. def _format_message(self) -> str:
  8. node = self.node
  9. if self.src is None:
  10. source_excerpt = " <source unavailable>"
  11. else:
  12. if hasattr(node, 'lineno'):
  13. source_excerpt = self.src.split('\n')[:node.lineno][-self.source_line_count_max_in_message:]
  14. if source_excerpt:
  15. source_excerpt.append(' ' * node.col_offset + '^')
  16. source_excerpt = '\n'.join(source_excerpt)
  17. else:
  18. source_excerpt = " <source empty>"
  19. else:
  20. source_excerpt = self.src
  21. message = "at {}:{}:\n{}".format(node.lineno, node.col_offset, source_excerpt) if hasattr(
  22. node, 'lineno') else source_excerpt
  23. if self.error_message:
  24. message += '\n' + self.error_message
  25. return message
  26. def __init__(self, src: Optional[str], node: ast.AST, error_message: Optional[str] = None):
  27. self.src = src
  28. self.node = node
  29. self.error_message = error_message
  30. self.message = self._format_message()
  31. def __str__(self):
  32. return self.message
  33. def __reduce__(self):
  34. # this is necessary to make CompilationError picklable
  35. return type(self), (self.src, self.node, self.error_message)
  36. class CompileTimeAssertionFailure(CompilationError):
  37. """Specific exception for failed tests in `static_assert` invocations"""
  38. pass
  39. class UnsupportedLanguageConstruct(CompilationError):
  40. pass