diff options
author | 2023-10-10 11:40:56 +0000 | |
---|---|---|
committer | 2023-10-10 11:40:56 +0000 | |
commit | e02cda008591317b1625707ff8e115a4841aa889 (patch) | |
tree | aee302e3cf8b59ec2d32ec481be3d1afddfc8968 /scripts/qapi/source.py | |
parent | cc668e6b7e0ffd8c9d130513d12053cf5eda1d3b (diff) |
Introduce Virtio-loopback epsilon release:
Epsilon release introduces a new compatibility layer which make virtio-loopback
design to work with QEMU and rust-vmm vhost-user backend without require any
changes.
Signed-off-by: Timos Ampelikiotis <t.ampelikiotis@virtualopensystems.com>
Change-Id: I52e57563e08a7d0bdc002f8e928ee61ba0c53dd9
Diffstat (limited to 'scripts/qapi/source.py')
-rw-r--r-- | scripts/qapi/source.py | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/scripts/qapi/source.py b/scripts/qapi/source.py new file mode 100644 index 000000000..04193cc96 --- /dev/null +++ b/scripts/qapi/source.py @@ -0,0 +1,71 @@ +# +# QAPI frontend source file info +# +# Copyright (c) 2019 Red Hat Inc. +# +# Authors: +# Markus Armbruster <armbru@redhat.com> +# +# This work is licensed under the terms of the GNU GPL, version 2. +# See the COPYING file in the top-level directory. + +import copy +from typing import List, Optional, TypeVar + + +class QAPISchemaPragma: + # Replace with @dataclass in Python 3.7+ + # pylint: disable=too-few-public-methods + + def __init__(self) -> None: + # Are documentation comments required? + self.doc_required = False + # Commands whose names may use '_' + self.command_name_exceptions: List[str] = [] + # Commands allowed to return a non-dictionary + self.command_returns_exceptions: List[str] = [] + # Types whose member names may violate case conventions + self.member_name_exceptions: List[str] = [] + + +class QAPISourceInfo: + T = TypeVar('T', bound='QAPISourceInfo') + + def __init__(self, fname: str, parent: Optional['QAPISourceInfo']): + self.fname = fname + self.line = 1 + self.parent = parent + self.pragma: QAPISchemaPragma = ( + parent.pragma if parent else QAPISchemaPragma() + ) + self.defn_meta: Optional[str] = None + self.defn_name: Optional[str] = None + + def set_defn(self, meta: str, name: str) -> None: + self.defn_meta = meta + self.defn_name = name + + def next_line(self: T) -> T: + info = copy.copy(self) + info.line += 1 + return info + + def loc(self) -> str: + return f"{self.fname}:{self.line}" + + def in_defn(self) -> str: + if self.defn_name: + return "%s: In %s '%s':\n" % (self.fname, + self.defn_meta, self.defn_name) + return '' + + def include_path(self) -> str: + ret = '' + parent = self.parent + while parent: + ret = 'In file included from %s:\n' % parent.loc() + ret + parent = parent.parent + return ret + + def __str__(self) -> str: + return self.include_path() + self.in_defn() + self.loc() |