2 # QAPI frontend source file info
4 # Copyright (c) 2019 Red Hat Inc.
7 # Markus Armbruster <armbru@redhat.com>
9 # This work is licensed under the terms of the GNU GPL, version 2.
10 # See the COPYING file in the top-level directory.
14 from typing
import List
, Optional
, TypeVar
17 class QAPISchemaPragma
:
18 # Replace with @dataclass in Python 3.7+
19 # pylint: disable=too-few-public-methods
21 def __init__(self
) -> None:
22 # Are documentation comments required?
23 self
.doc_required
= False
24 # Commands whose names may use '_'
25 self
.command_name_exceptions
: List
[str] = []
26 # Commands allowed to return a non-dictionary
27 self
.command_returns_exceptions
: List
[str] = []
28 # Types whose member names may violate case conventions
29 self
.member_name_exceptions
: List
[str] = []
33 T
= TypeVar('T', bound
='QAPISourceInfo')
35 def __init__(self
, fname
: str, line
: int,
36 parent
: Optional
['QAPISourceInfo']):
40 self
.pragma
: QAPISchemaPragma
= (
41 parent
.pragma
if parent
else QAPISchemaPragma()
43 self
.defn_meta
: Optional
[str] = None
44 self
.defn_name
: Optional
[str] = None
46 def set_defn(self
, meta
: str, name
: str) -> None:
50 def next_line(self
: T
) -> T
:
51 info
= copy
.copy(self
)
56 if self
.fname
is None:
59 if self
.line
is not None:
60 ret
+= ':%d' % self
.line
63 def in_defn(self
) -> str:
65 return "%s: In %s '%s':\n" % (self
.fname
,
66 self
.defn_meta
, self
.defn_name
)
69 def include_path(self
) -> str:
73 ret
= 'In file included from %s:\n' % parent
.loc() + ret
74 parent
= parent
.parent
77 def __str__(self
) -> str:
78 return self
.include_path() + self
.in_defn() + self
.loc()