qemu

FORK: QEMU emulator
git clone https://git.neptards.moe/neptards/qemu.git
Log | Files | Refs | Submodules | LICENSE

source.py (2095B)


      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
     13 from typing import List, Optional, TypeVar
     14 
     15 
     16 class QAPISchemaPragma:
     17     # Replace with @dataclass in Python 3.7+
     18     # pylint: disable=too-few-public-methods
     19 
     20     def __init__(self) -> None:
     21         # Are documentation comments required?
     22         self.doc_required = False
     23         # Commands whose names may use '_'
     24         self.command_name_exceptions: List[str] = []
     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] = []
     29 
     30 
     31 class QAPISourceInfo:
     32     T = TypeVar('T', bound='QAPISourceInfo')
     33 
     34     def __init__(self, fname: str, parent: Optional['QAPISourceInfo']):
     35         self.fname = fname
     36         self.line = 1
     37         self.parent = parent
     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
     43 
     44     def set_defn(self, meta: str, name: str) -> None:
     45         self.defn_meta = meta
     46         self.defn_name = name
     47 
     48     def next_line(self: T) -> T:
     49         info = copy.copy(self)
     50         info.line += 1
     51         return info
     52 
     53     def loc(self) -> str:
     54         return f"{self.fname}:{self.line}"
     55 
     56     def in_defn(self) -> str:
     57         if self.defn_name:
     58             return "%s: In %s '%s':\n" % (self.fname,
     59                                           self.defn_meta, self.defn_name)
     60         return ''
     61 
     62     def include_path(self) -> str:
     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 
     70     def __str__(self) -> str:
     71         return self.include_path() + self.in_defn() + self.loc()