Skip to content

Commit

Permalink
gh-104050: Argument clinic: Annotate the Destination class (#106655)
Browse files Browse the repository at this point in the history
Co-authored-by: Nikita Sobolev <mail@sobolevn.me>
  • Loading branch information
AlexWaygood and sobolevn authored Jul 12, 2023
1 parent 357e9e9 commit a180e7a
Showing 1 changed file with 22 additions and 17 deletions.
39 changes: 22 additions & 17 deletions Tools/clinic/clinic.py
Original file line number Diff line number Diff line change
Expand Up @@ -1954,27 +1954,32 @@ def dump(self):
return "".join(texts)


@dc.dataclass(slots=True, repr=False)
class Destination:
def __init__(self, name, type, clinic, *args):
self.name = name
self.type = type
self.clinic = clinic
self.buffers = BufferSeries()
name: str
type: str
clinic: Clinic
buffers: BufferSeries = dc.field(init=False, default_factory=BufferSeries)
filename: str = dc.field(init=False) # set in __post_init__

args: dc.InitVar[tuple[str, ...]] = ()

def __post_init__(self, args: tuple[str, ...]) -> None:
valid_types = ('buffer', 'file', 'suppress')
if type not in valid_types:
if self.type not in valid_types:
fail(
f"Invalid destination type {type!r} for {name}, "
f"Invalid destination type {self.type!r} for {self.name}, "
f"must be {', '.join(valid_types)}"
)
extra_arguments = 1 if type == "file" else 0
extra_arguments = 1 if self.type == "file" else 0
if len(args) < extra_arguments:
fail(f"Not enough arguments for destination {name} new {type}")
fail(f"Not enough arguments for destination {self.name} new {self.type}")
if len(args) > extra_arguments:
fail(f"Too many arguments for destination {name} new {type}")
if type =='file':
fail(f"Too many arguments for destination {self.name} new {self.type}")
if self.type =='file':
d = {}
filename = clinic.filename
filename = self.clinic.filename
assert filename is not None
d['path'] = filename
dirname, basename = os.path.split(filename)
if not dirname:
Expand All @@ -1984,19 +1989,19 @@ def __init__(self, name, type, clinic, *args):
d['basename_root'], d['basename_extension'] = os.path.splitext(filename)
self.filename = args[0].format_map(d)

def __repr__(self):
def __repr__(self) -> str:
if self.type == 'file':
file_repr = " " + repr(self.filename)
else:
file_repr = ''
return "".join(("<Destination ", self.name, " ", self.type, file_repr, ">"))

def clear(self):
def clear(self) -> None:
if self.type != 'buffer':
fail("Can't clear destination" + self.name + " , it's not of type buffer")
self.buffers.clear()

def dump(self):
def dump(self) -> str:
return self.buffers.dump()


Expand Down Expand Up @@ -2164,11 +2169,11 @@ def add_destination(
self,
name: str,
type: str,
*args
*args: str
) -> None:
if name in self.destinations:
fail("Destination already exists: " + repr(name))
self.destinations[name] = Destination(name, type, self, *args)
self.destinations[name] = Destination(name, type, self, args)

def get_destination(self, name: str) -> Destination:
d = self.destinations.get(name)
Expand Down

0 comments on commit a180e7a

Please sign in to comment.