feat(checker): add reporter class
This commit is contained in:
@@ -14,7 +14,7 @@ class DiagnosticType(StrEnum):
|
|||||||
|
|
||||||
@dataclass(frozen=True)
|
@dataclass(frozen=True)
|
||||||
class Diagnostic:
|
class Diagnostic:
|
||||||
file_path: Path
|
file_path: Optional[str | Path]
|
||||||
location: Location
|
location: Location
|
||||||
type: DiagnosticType
|
type: DiagnosticType
|
||||||
message: str
|
message: str
|
||||||
@@ -28,10 +28,16 @@ class Diagnostic:
|
|||||||
and self.location.end_col_offset is not None
|
and self.location.end_col_offset is not None
|
||||||
):
|
):
|
||||||
end_loc = f"L{self.location.end_lineno}:{self.location.end_col_offset+1}"
|
end_loc = f"L{self.location.end_lineno}:{self.location.end_col_offset+1}"
|
||||||
loc: str = (
|
|
||||||
f"at {start_loc}" if end_loc is None else f"from {start_loc} to {end_loc}"
|
loc: str = ""
|
||||||
)
|
if self.file_path is not None:
|
||||||
return f"{self.type} in {self.file_path} {loc}"
|
loc += f" in {self.file_path}"
|
||||||
|
if end_loc is None:
|
||||||
|
loc += f" at {start_loc}"
|
||||||
|
else:
|
||||||
|
loc += f" from {start_loc} to {end_loc}"
|
||||||
|
|
||||||
|
return f"{self.type}{loc}"
|
||||||
|
|
||||||
def __str__(self) -> str:
|
def __str__(self) -> str:
|
||||||
return f"{self.location_str}: {self.message}"
|
return f"{self.location_str}: {self.message}"
|
||||||
|
|||||||
63
midas/checker/reporter.py
Normal file
63
midas/checker/reporter.py
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from typing import Optional
|
||||||
|
|
||||||
|
from midas.ast.location import Location
|
||||||
|
from midas.checker.diagnostic import Diagnostic, DiagnosticType
|
||||||
|
|
||||||
|
|
||||||
|
class Reporter:
|
||||||
|
def __init__(self):
|
||||||
|
self.diagnostics: list[Diagnostic] = []
|
||||||
|
|
||||||
|
def report(
|
||||||
|
self,
|
||||||
|
path: Optional[str],
|
||||||
|
type: DiagnosticType,
|
||||||
|
location: Location,
|
||||||
|
message: str,
|
||||||
|
):
|
||||||
|
self.diagnostics.append(
|
||||||
|
Diagnostic(
|
||||||
|
file_path=path,
|
||||||
|
location=location,
|
||||||
|
type=type,
|
||||||
|
message=message,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
def for_file(self, path: Optional[str]) -> FileReporter:
|
||||||
|
return FileReporter(self, path)
|
||||||
|
|
||||||
|
|
||||||
|
class FileReporter:
|
||||||
|
def __init__(self, base_reporter: Reporter, path: Optional[str]) -> None:
|
||||||
|
self.base_reporter: Reporter = base_reporter
|
||||||
|
self.path: Optional[str] = path
|
||||||
|
|
||||||
|
def for_file(self, path: Optional[str]) -> FileReporter:
|
||||||
|
return FileReporter(self.base_reporter, path)
|
||||||
|
|
||||||
|
def report(self, type: DiagnosticType, location: Location, message: str):
|
||||||
|
self.base_reporter.report(self.path, type, location, message)
|
||||||
|
|
||||||
|
def error(self, location: Location, message: str):
|
||||||
|
self.report(
|
||||||
|
type=DiagnosticType.ERROR,
|
||||||
|
location=location,
|
||||||
|
message=message,
|
||||||
|
)
|
||||||
|
|
||||||
|
def warning(self, location: Location, message: str):
|
||||||
|
self.report(
|
||||||
|
type=DiagnosticType.WARNING,
|
||||||
|
location=location,
|
||||||
|
message=message,
|
||||||
|
)
|
||||||
|
|
||||||
|
def info(self, location: Location, message: str):
|
||||||
|
self.report(
|
||||||
|
type=DiagnosticType.INFO,
|
||||||
|
location=location,
|
||||||
|
message=message,
|
||||||
|
)
|
||||||
Reference in New Issue
Block a user