Markus Armbruster | e6c42b9 | 2019-10-18 09:43:44 +0200 | [diff] [blame] | 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 |
John Snow | f5d4361 | 2020-10-09 12:15:46 -0400 | [diff] [blame] | 13 | from typing import List, Optional, TypeVar |
Markus Armbruster | e6c42b9 | 2019-10-18 09:43:44 +0200 | [diff] [blame] | 14 | |
| 15 | |
Markus Armbruster | baa310f | 2020-03-04 16:59:29 +0100 | [diff] [blame] | 16 | class QAPISchemaPragma: |
John Snow | 96670e8 | 2020-10-09 12:15:47 -0400 | [diff] [blame] | 17 | # Replace with @dataclass in Python 3.7+ |
| 18 | # pylint: disable=too-few-public-methods |
| 19 | |
John Snow | f5d4361 | 2020-10-09 12:15:46 -0400 | [diff] [blame] | 20 | def __init__(self) -> None: |
Markus Armbruster | e6c42b9 | 2019-10-18 09:43:44 +0200 | [diff] [blame] | 21 | # Are documentation comments required? |
| 22 | self.doc_required = False |
Markus Armbruster | 05ebf84 | 2021-03-23 10:40:21 +0100 | [diff] [blame] | 23 | # Commands whose names may use '_' |
| 24 | self.command_name_exceptions: List[str] = [] |
Markus Armbruster | b86df37 | 2021-03-23 10:40:16 +0100 | [diff] [blame] | 25 | # Commands allowed to return a non-dictionary |
| 26 | self.command_returns_exceptions: List[str] = [] |
| 27 | # Types whose member names may violate case conventions |
| 28 | self.member_name_exceptions: List[str] = [] |
Markus Armbruster | e6c42b9 | 2019-10-18 09:43:44 +0200 | [diff] [blame] | 29 | |
| 30 | |
Markus Armbruster | baa310f | 2020-03-04 16:59:29 +0100 | [diff] [blame] | 31 | class QAPISourceInfo: |
John Snow | f5d4361 | 2020-10-09 12:15:46 -0400 | [diff] [blame] | 32 | T = TypeVar('T', bound='QAPISourceInfo') |
| 33 | |
John Snow | b2b31fd | 2021-05-19 14:39:39 -0400 | [diff] [blame] | 34 | def __init__(self, fname: str, parent: Optional['QAPISourceInfo']): |
Markus Armbruster | e6c42b9 | 2019-10-18 09:43:44 +0200 | [diff] [blame] | 35 | self.fname = fname |
John Snow | b2b31fd | 2021-05-19 14:39:39 -0400 | [diff] [blame] | 36 | self.line = 1 |
Markus Armbruster | e6c42b9 | 2019-10-18 09:43:44 +0200 | [diff] [blame] | 37 | self.parent = parent |
John Snow | f5d4361 | 2020-10-09 12:15:46 -0400 | [diff] [blame] | 38 | self.pragma: QAPISchemaPragma = ( |
| 39 | parent.pragma if parent else QAPISchemaPragma() |
| 40 | ) |
| 41 | self.defn_meta: Optional[str] = None |
| 42 | self.defn_name: Optional[str] = None |
Markus Armbruster | e6c42b9 | 2019-10-18 09:43:44 +0200 | [diff] [blame] | 43 | |
John Snow | f5d4361 | 2020-10-09 12:15:46 -0400 | [diff] [blame] | 44 | def set_defn(self, meta: str, name: str) -> None: |
Markus Armbruster | e6c42b9 | 2019-10-18 09:43:44 +0200 | [diff] [blame] | 45 | self.defn_meta = meta |
| 46 | self.defn_name = name |
| 47 | |
John Snow | f5d4361 | 2020-10-09 12:15:46 -0400 | [diff] [blame] | 48 | def next_line(self: T) -> T: |
Markus Armbruster | e6c42b9 | 2019-10-18 09:43:44 +0200 | [diff] [blame] | 49 | info = copy.copy(self) |
| 50 | info.line += 1 |
| 51 | return info |
| 52 | |
John Snow | f5d4361 | 2020-10-09 12:15:46 -0400 | [diff] [blame] | 53 | def loc(self) -> str: |
John Snow | b2b31fd | 2021-05-19 14:39:39 -0400 | [diff] [blame] | 54 | return f"{self.fname}:{self.line}" |
Markus Armbruster | e6c42b9 | 2019-10-18 09:43:44 +0200 | [diff] [blame] | 55 | |
John Snow | f5d4361 | 2020-10-09 12:15:46 -0400 | [diff] [blame] | 56 | def in_defn(self) -> str: |
Markus Armbruster | e6c42b9 | 2019-10-18 09:43:44 +0200 | [diff] [blame] | 57 | if self.defn_name: |
| 58 | return "%s: In %s '%s':\n" % (self.fname, |
| 59 | self.defn_meta, self.defn_name) |
| 60 | return '' |
| 61 | |
John Snow | f5d4361 | 2020-10-09 12:15:46 -0400 | [diff] [blame] | 62 | def include_path(self) -> str: |
Markus Armbruster | e6c42b9 | 2019-10-18 09:43:44 +0200 | [diff] [blame] | 63 | ret = '' |
| 64 | parent = self.parent |
| 65 | while parent: |
| 66 | ret = 'In file included from %s:\n' % parent.loc() + ret |
| 67 | parent = parent.parent |
| 68 | return ret |
| 69 | |
John Snow | f5d4361 | 2020-10-09 12:15:46 -0400 | [diff] [blame] | 70 | def __str__(self) -> str: |
Markus Armbruster | e6c42b9 | 2019-10-18 09:43:44 +0200 | [diff] [blame] | 71 | return self.include_path() + self.in_defn() + self.loc() |