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