From 39c12a360c843c49b09d1de3c193023d89b7df18 Mon Sep 17 00:00:00 2001 From: Antoine Viallon Date: Fri, 5 Jan 2024 23:17:31 +0100 Subject: [PATCH] source: add IRLocation type specifically for generated IR --- compiler/source.py | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/compiler/source.py b/compiler/source.py index b5fd3a9..90eea04 100644 --- a/compiler/source.py +++ b/compiler/source.py @@ -138,3 +138,46 @@ class SourceLocation: result[i] = "\n".join(lines) return "\n".join(result) + + +@typecheck +class IRLocation: + def __init__(self, line: int = -1, ir: list[str] = None): + if ir is None: + ir = [] + + self.line = line + self.ir = ir + + @typecheck + def __lt__(self, other: IRLocation): + assert self.line >= 0 + + return self.line < other.line + + @typecheck + def __ge__(self, other: IRLocation): + assert self.line >= 0 + + return self.line >= other.line + + @typecheck + def __eq__(self, other: IRLocation): + assert self.line >= 0 + + return self.line == other.line + + def __str__(self) -> str: + assert self.line >= 0 + assert len(self.ir) > self.line + + repr_len = int(math.log10(len(self.ir)) + 1) + + messages = [] + messages += self.ir[self.line - 2:self.line + 1] + messages += ["^" * len(self.ir[self.line])] + messages += self.ir[self.line:self.line + 3] + + messages = [f"{str(self.line + i - 2).zfill(repr_len)}: {m}" for i, m in enumerate(messages)] + + return "\n".join(messages)