]> git.proxmox.com Git - mirror_qemu.git/blob - scripts/qapi/source.py
Merge tag 'pull-maintainer-may24-160524-2' of https://gitlab.com/stsquad/qemu into...
[mirror_qemu.git] / scripts / qapi / source.py
1 #
2 # QAPI frontend source file info
3 #
4 # Copyright (c) 2019 Red Hat Inc.
5 #
6 # Authors:
7 # Markus Armbruster <armbru@redhat.com>
8 #
9 # This work is licensed under the terms of the GNU GPL, version 2.
10 # See the COPYING file in the top-level directory.
11
12 import copy
13 from typing import List, Optional, TypeVar
14
15
16 class QAPISchemaPragma:
17 # Replace with @dataclass in Python 3.7+
18 # pylint: disable=too-few-public-methods
19
20 def __init__(self) -> None:
21 # Are documentation comments required?
22 self.doc_required = False
23 # Commands whose names may use '_'
24 self.command_name_exceptions: List[str] = []
25 # Commands allowed to return a non-dictionary
26 self.command_returns_exceptions: List[str] = []
27 # Types, commands, and events with undocumented members
28 self.documentation_exceptions: List[str] = []
29 # Types whose member names may violate case conventions
30 self.member_name_exceptions: List[str] = []
31
32
33 class QAPISourceInfo:
34 T = TypeVar('T', bound='QAPISourceInfo')
35
36 def __init__(self, fname: str, parent: Optional['QAPISourceInfo']):
37 self.fname = fname
38 self.line = 1
39 self.parent = parent
40 self.pragma: QAPISchemaPragma = (
41 parent.pragma if parent else QAPISchemaPragma()
42 )
43 self.defn_meta: Optional[str] = None
44 self.defn_name: Optional[str] = None
45
46 def set_defn(self, meta: str, name: str) -> None:
47 self.defn_meta = meta
48 self.defn_name = name
49
50 def next_line(self: T) -> T:
51 info = copy.copy(self)
52 info.line += 1
53 return info
54
55 def loc(self) -> str:
56 return f"{self.fname}:{self.line}"
57
58 def in_defn(self) -> str:
59 if self.defn_name:
60 return "%s: In %s '%s':\n" % (self.fname,
61 self.defn_meta, self.defn_name)
62 return ''
63
64 def include_path(self) -> str:
65 ret = ''
66 parent = self.parent
67 while parent:
68 ret = 'In file included from %s:\n' % parent.loc() + ret
69 parent = parent.parent
70 return ret
71
72 def __str__(self) -> str:
73 return self.include_path() + self.in_defn() + self.loc()