Files
xemu/scripts/qapi/source.py
T

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

74 lines
2.2 KiB
Python
Raw Normal View History

2019-10-18 09:43:44 +02: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 12:15:46 -04:00
from typing import List, Optional, TypeVar
2019-10-18 09:43:44 +02:00
class QAPISchemaPragma:
2020-10-09 12:15:47 -04:00
# Replace with @dataclass in Python 3.7+
# pylint: disable=too-few-public-methods
2020-10-09 12:15:46 -04:00
def __init__(self) -> None:
2019-10-18 09:43:44 +02:00
# Are documentation comments required?
self.doc_required = False
2021-03-23 10:40:21 +01:00
# 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, commands, and events with undocumented members
self.documentation_exceptions: List[str] = []
# Types whose member names may violate case conventions
self.member_name_exceptions: List[str] = []
2019-10-18 09:43:44 +02:00
class QAPISourceInfo:
2020-10-09 12:15:46 -04:00
T = TypeVar('T', bound='QAPISourceInfo')
def __init__(self, fname: str, parent: Optional['QAPISourceInfo']):
2019-10-18 09:43:44 +02:00
self.fname = fname
self.line = 1
2019-10-18 09:43:44 +02:00
self.parent = parent
2020-10-09 12:15:46 -04: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 09:43:44 +02:00
2020-10-09 12:15:46 -04:00
def set_defn(self, meta: str, name: str) -> None:
2019-10-18 09:43:44 +02:00
self.defn_meta = meta
self.defn_name = name
2020-10-09 12:15:46 -04:00
def next_line(self: T) -> T:
2019-10-18 09:43:44 +02:00
info = copy.copy(self)
info.line += 1
return info
2020-10-09 12:15:46 -04:00
def loc(self) -> str:
return f"{self.fname}:{self.line}"
2019-10-18 09:43:44 +02:00
2020-10-09 12:15:46 -04:00
def in_defn(self) -> str:
2019-10-18 09:43:44 +02:00
if self.defn_name:
return "%s: In %s '%s':\n" % (self.fname,
self.defn_meta, self.defn_name)
return ''
2020-10-09 12:15:46 -04:00
def include_path(self) -> str:
2019-10-18 09:43:44 +02: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 12:15:46 -04:00
def __str__(self) -> str:
2019-10-18 09:43:44 +02:00
return self.include_path() + self.in_defn() + self.loc()