b2b31fdf9b
With the QAPISourceInfo(None, None, None) construct gone, there's no longer any reason to have to specify that a file starts on the first line. Remove it from the initializer and default it to 1. Remove the last vestiges where we check for 'line' being unset, that can't happen, now. Signed-off-by: John Snow <jsnow@redhat.com> Message-Id: <20210519183951.3946870-4-jsnow@redhat.com> Reviewed-by: Markus Armbruster <armbru@redhat.com> Signed-off-by: Markus Armbruster <armbru@redhat.com>
72 lines
2.0 KiB
Python
72 lines
2.0 KiB
Python
#
|
|
# 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
|
|
from typing import List, Optional, TypeVar
|
|
|
|
|
|
class QAPISchemaPragma:
|
|
# Replace with @dataclass in Python 3.7+
|
|
# pylint: disable=too-few-public-methods
|
|
|
|
def __init__(self) -> None:
|
|
# Are documentation comments required?
|
|
self.doc_required = False
|
|
# 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 whose member names may violate case conventions
|
|
self.member_name_exceptions: List[str] = []
|
|
|
|
|
|
class QAPISourceInfo:
|
|
T = TypeVar('T', bound='QAPISourceInfo')
|
|
|
|
def __init__(self, fname: str, parent: Optional['QAPISourceInfo']):
|
|
self.fname = fname
|
|
self.line = 1
|
|
self.parent = parent
|
|
self.pragma: QAPISchemaPragma = (
|
|
parent.pragma if parent else QAPISchemaPragma()
|
|
)
|
|
self.defn_meta: Optional[str] = None
|
|
self.defn_name: Optional[str] = None
|
|
|
|
def set_defn(self, meta: str, name: str) -> None:
|
|
self.defn_meta = meta
|
|
self.defn_name = name
|
|
|
|
def next_line(self: T) -> T:
|
|
info = copy.copy(self)
|
|
info.line += 1
|
|
return info
|
|
|
|
def loc(self) -> str:
|
|
return f"{self.fname}:{self.line}"
|
|
|
|
def in_defn(self) -> str:
|
|
if self.defn_name:
|
|
return "%s: In %s '%s':\n" % (self.fname,
|
|
self.defn_meta, self.defn_name)
|
|
return ''
|
|
|
|
def include_path(self) -> str:
|
|
ret = ''
|
|
parent = self.parent
|
|
while parent:
|
|
ret = 'In file included from %s:\n' % parent.loc() + ret
|
|
parent = parent.parent
|
|
return ret
|
|
|
|
def __str__(self) -> str:
|
|
return self.include_path() + self.in_defn() + self.loc()
|