errors: add a OverrideMandatoryError

Use introspection and reflexion to automatically generate the error message.
This commit is contained in:
Antoine Viallon 2023-05-10 01:19:42 +02:00
parent 855e86022b
commit 3e9d308e40
Signed by: aviallon
GPG key ID: D126B13AB555E16F
3 changed files with 23 additions and 5 deletions

View file

@ -1,5 +1,7 @@
from __future__ import annotations
import inspect
from . import source, tokenizer
@ -19,3 +21,18 @@ class UnexpectedTokenError(CompilationError):
class SemanticAnalysisError(CompilationError):
pass
class OverrideMandatoryError(NotImplementedError):
def __init__(self, klass: object = None, function_name: str = None):
if klass is None or function_name is None:
frame = inspect.currentframe()
assert frame is not None
prev_frame = frame.f_back
assert prev_frame is not None
if klass is None:
klass = prev_frame.f_locals.get("self", None)
if function_name is None:
function_name = prev_frame.f_code.co_name
super().__init__(f"Please override {klass.__class__.__name__}.{function_name}")

View file

@ -5,6 +5,7 @@ from abc import abstractmethod
from beartype import beartype
from .errors import OverrideMandatoryError
from .logger import Logger
from .source import SourceLocation
@ -17,11 +18,11 @@ class IRItem:
@abstractmethod
def codegen(self) -> str:
raise NotImplementedError(f"Please override {self.__class__.__name__}.{__name__}")
raise OverrideMandatoryError()
@abstractmethod
def destination(self) -> IRValue:
raise NotImplementedError(f"Please override {self.__class__.__name__}.{__name__}")
raise OverrideMandatoryError()
def __repr__(self):
return f"{self.codegen()}"

View file

@ -7,7 +7,7 @@ from typing import Any, Iterable
from beartype import beartype
from . import ir, semantic
from .errors import SemanticAnalysisError
from .errors import SemanticAnalysisError, OverrideMandatoryError
from .logger import Logger
from .source import SourceLocation
@ -21,7 +21,7 @@ class Node:
@abstractmethod
def _values(self) -> list[Node | Any]:
raise NotImplementedError(f"Please override {__name__}")
raise OverrideMandatoryError()
@functools.cache
def location(self) -> SourceLocation:
@ -66,7 +66,7 @@ class Node:
@abstractmethod
def intermediate_representation(self) -> list[ir.IRItem]:
raise NotImplementedError(f"Please implement {self.__class__.__name__}.{__name__}")
raise OverrideMandatoryError()
def semantic_analysis(self, context: semantic.Context):
logger.debug(f"Doing semantic analysis in {self}")