gh-113317, AC: Move warn() and fail() to libclinic.errors (#116770)

This commit is contained in:
Victor Stinner 2024-03-14 09:07:01 +01:00 committed by GitHub
parent 3a25d9c5a9
commit a18c9854e8
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 51 additions and 47 deletions

View file

@ -44,14 +44,13 @@
Protocol,
TypeVar,
cast,
overload,
)
# Local imports.
import libclinic
import libclinic.cpp
from libclinic import ClinicError
from libclinic import ClinicError, fail, warn
# TODO:
@ -94,51 +93,6 @@ def __repr__(self) -> str:
TemplateDict = dict[str, str]
@overload
def warn_or_fail(
*args: object,
fail: Literal[True],
filename: str | None = None,
line_number: int | None = None,
) -> NoReturn: ...
@overload
def warn_or_fail(
*args: object,
fail: Literal[False] = False,
filename: str | None = None,
line_number: int | None = None,
) -> None: ...
def warn_or_fail(
*args: object,
fail: bool = False,
filename: str | None = None,
line_number: int | None = None,
) -> None:
joined = " ".join([str(a) for a in args])
error = ClinicError(joined, filename=filename, lineno=line_number)
if fail:
raise error
else:
print(error.report(warn_only=True))
def warn(
*args: object,
filename: str | None = None,
line_number: int | None = None,
) -> None:
return warn_or_fail(*args, filename=filename, line_number=line_number, fail=False)
def fail(
*args: object,
filename: str | None = None,
line_number: int | None = None,
) -> NoReturn:
warn_or_fail(*args, filename=filename, line_number=line_number, fail=True)
class CRenderData:
def __init__(self) -> None:

View file

@ -2,6 +2,8 @@
from .errors import (
ClinicError,
warn,
fail,
)
from .formatting import (
SIG_END_MARKER,
@ -32,6 +34,8 @@
__all__ = [
# Error handling
"ClinicError",
"warn",
"fail",
# Formatting helpers
"SIG_END_MARKER",

View file

@ -1,4 +1,5 @@
import dataclasses as dc
from typing import Literal, NoReturn, overload
@dc.dataclass
@ -24,3 +25,48 @@ def report(self, *, warn_only: bool = False) -> str:
class ParseError(ClinicError):
pass
@overload
def warn_or_fail(
*args: object,
fail: Literal[True],
filename: str | None = None,
line_number: int | None = None,
) -> NoReturn: ...
@overload
def warn_or_fail(
*args: object,
fail: Literal[False] = False,
filename: str | None = None,
line_number: int | None = None,
) -> None: ...
def warn_or_fail(
*args: object,
fail: bool = False,
filename: str | None = None,
line_number: int | None = None,
) -> None:
joined = " ".join([str(a) for a in args])
error = ClinicError(joined, filename=filename, lineno=line_number)
if fail:
raise error
else:
print(error.report(warn_only=True))
def warn(
*args: object,
filename: str | None = None,
line_number: int | None = None,
) -> None:
return warn_or_fail(*args, filename=filename, line_number=line_number, fail=False)
def fail(
*args: object,
filename: str | None = None,
line_number: int | None = None,
) -> NoReturn:
warn_or_fail(*args, filename=filename, line_number=line_number, fail=True)