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 from __future__ import annotations
import inspect
from . import source, tokenizer from . import source, tokenizer
@ -19,3 +21,18 @@ class UnexpectedTokenError(CompilationError):
class SemanticAnalysisError(CompilationError): class SemanticAnalysisError(CompilationError):
pass 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 beartype import beartype
from .errors import OverrideMandatoryError
from .logger import Logger from .logger import Logger
from .source import SourceLocation from .source import SourceLocation
@ -17,11 +18,11 @@ class IRItem:
@abstractmethod @abstractmethod
def codegen(self) -> str: def codegen(self) -> str:
raise NotImplementedError(f"Please override {self.__class__.__name__}.{__name__}") raise OverrideMandatoryError()
@abstractmethod @abstractmethod
def destination(self) -> IRValue: def destination(self) -> IRValue:
raise NotImplementedError(f"Please override {self.__class__.__name__}.{__name__}") raise OverrideMandatoryError()
def __repr__(self): def __repr__(self):
return f"{self.codegen()}" return f"{self.codegen()}"

View file

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