#
# 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, 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] = []


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()
