2019-10-18 10:43:44 +03:00
|
|
|
#
|
|
|
|
# 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
|
2020-10-09 19:15:46 +03:00
|
|
|
from typing import List, Optional, TypeVar
|
2019-10-18 10:43:44 +03:00
|
|
|
|
|
|
|
|
2020-03-04 18:59:29 +03:00
|
|
|
class QAPISchemaPragma:
|
2020-10-09 19:15:47 +03:00
|
|
|
# Replace with @dataclass in Python 3.7+
|
|
|
|
# pylint: disable=too-few-public-methods
|
|
|
|
|
2020-10-09 19:15:46 +03:00
|
|
|
def __init__(self) -> None:
|
2019-10-18 10:43:44 +03:00
|
|
|
# Are documentation comments required?
|
|
|
|
self.doc_required = False
|
2021-03-23 12:40:21 +03:00
|
|
|
# Commands whose names may use '_'
|
|
|
|
self.command_name_exceptions: List[str] = []
|
2021-03-23 12:40:16 +03:00
|
|
|
# Commands allowed to return a non-dictionary
|
|
|
|
self.command_returns_exceptions: List[str] = []
|
qapi: Require member documentation (with loophole)
The QAPI generator forces you to document your stuff. Except for
command arguments, event data, and members of enum and object types:
these the generator silently "documents" as "Not documented".
We can't require proper documentation there without first fixing all
the offenders. We've always had too many offenders to pull that off.
Right now, we have more than 500. Worse, we seem to fix old ones no
faster than we add new ones: in the past year, we fixed 22 ones, but
added 26 new ones.
To help arrest the backsliding, make missing documentation an error
unless the command, type, or event is in listed in new pragma
documentation-exceptions.
List all the current offenders: 117 commands and types in qapi/, and 9
in qga/.
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Message-ID: <20240205074709.3613229-7-armbru@redhat.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
2024-02-05 10:47:00 +03:00
|
|
|
# Types, commands, and events with undocumented members
|
|
|
|
self.documentation_exceptions: List[str] = []
|
2021-03-23 12:40:16 +03:00
|
|
|
# Types whose member names may violate case conventions
|
|
|
|
self.member_name_exceptions: List[str] = []
|
2019-10-18 10:43:44 +03:00
|
|
|
|
|
|
|
|
2020-03-04 18:59:29 +03:00
|
|
|
class QAPISourceInfo:
|
2020-10-09 19:15:46 +03:00
|
|
|
T = TypeVar('T', bound='QAPISourceInfo')
|
|
|
|
|
2021-05-19 21:39:39 +03:00
|
|
|
def __init__(self, fname: str, parent: Optional['QAPISourceInfo']):
|
2019-10-18 10:43:44 +03:00
|
|
|
self.fname = fname
|
2021-05-19 21:39:39 +03:00
|
|
|
self.line = 1
|
2019-10-18 10:43:44 +03:00
|
|
|
self.parent = parent
|
2020-10-09 19:15:46 +03:00
|
|
|
self.pragma: QAPISchemaPragma = (
|
|
|
|
parent.pragma if parent else QAPISchemaPragma()
|
|
|
|
)
|
|
|
|
self.defn_meta: Optional[str] = None
|
|
|
|
self.defn_name: Optional[str] = None
|
2019-10-18 10:43:44 +03:00
|
|
|
|
2020-10-09 19:15:46 +03:00
|
|
|
def set_defn(self, meta: str, name: str) -> None:
|
2019-10-18 10:43:44 +03:00
|
|
|
self.defn_meta = meta
|
|
|
|
self.defn_name = name
|
|
|
|
|
2020-10-09 19:15:46 +03:00
|
|
|
def next_line(self: T) -> T:
|
2019-10-18 10:43:44 +03:00
|
|
|
info = copy.copy(self)
|
|
|
|
info.line += 1
|
|
|
|
return info
|
|
|
|
|
2020-10-09 19:15:46 +03:00
|
|
|
def loc(self) -> str:
|
2021-05-19 21:39:39 +03:00
|
|
|
return f"{self.fname}:{self.line}"
|
2019-10-18 10:43:44 +03:00
|
|
|
|
2020-10-09 19:15:46 +03:00
|
|
|
def in_defn(self) -> str:
|
2019-10-18 10:43:44 +03:00
|
|
|
if self.defn_name:
|
|
|
|
return "%s: In %s '%s':\n" % (self.fname,
|
|
|
|
self.defn_meta, self.defn_name)
|
|
|
|
return ''
|
|
|
|
|
2020-10-09 19:15:46 +03:00
|
|
|
def include_path(self) -> str:
|
2019-10-18 10:43:44 +03:00
|
|
|
ret = ''
|
|
|
|
parent = self.parent
|
|
|
|
while parent:
|
|
|
|
ret = 'In file included from %s:\n' % parent.loc() + ret
|
|
|
|
parent = parent.parent
|
|
|
|
return ret
|
|
|
|
|
2020-10-09 19:15:46 +03:00
|
|
|
def __str__(self) -> str:
|
2019-10-18 10:43:44 +03:00
|
|
|
return self.include_path() + self.in_defn() + self.loc()
|