# SPDX-License-Identifier: GPL-2.0
#
# A class that will, eventually, encapsulate all of the parsed data that we
# then pass into the output modules.
#

"""
Data class to store a kernel-doc Item.
"""

class KdocItem:
    """
    A class that will, eventually, encapsulate all of the parsed data that we
    then pass into the output modules.
    """

    def __init__(self, name, fname, type, start_line, **other_stuff):
        self.name = name
        self.fname = fname
        self.type = type
        self.declaration_start_line = start_line
        self.sections = {}
        self.sections_start_lines = {}
        self.parameterlist = []
        self.parameterdesc_start_lines = []
        self.parameterdescs = {}
        self.parametertypes = {}
        #
        # Just save everything else into our own dict so that the output
        # side can grab it directly as before.  As we move things into more
        # structured data, this will, hopefully, fade away.
        #
        self.other_stuff = other_stuff

    def get(self, key, default = None):
        """
        Get a value from optional keys.
        """
        return self.other_stuff.get(key, default)

    def __getitem__(self, key):
        return self.get(key)

    #
    # Tracking of section and parameter information.
    #
    def set_sections(self, sections, start_lines):
        """
        Set sections and start lines.
        """
        self.sections = sections
        self.section_start_lines = start_lines

    def set_params(self, names, descs, types, starts):
        """
        Set parameter list: names, descriptions, types and start lines.
        """
        self.parameterlist = names
        self.parameterdescs = descs
        self.parametertypes = types
        self.parameterdesc_start_lines = starts
