xref: /llvm-project/cross-project-tests/debuginfo-tests/dexter/dex/tools/help/Tool.py (revision 6779376ee917279b16e256839d236cfdf8fd9ab9)
11364750dSJames Henderson# DExTer : Debugging Experience Tester
21364750dSJames Henderson# ~~~~~~   ~         ~~         ~   ~~
31364750dSJames Henderson#
41364750dSJames Henderson# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
51364750dSJames Henderson# See https://llvm.org/LICENSE.txt for license information.
61364750dSJames Henderson# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
71364750dSJames Henderson"""Help tool."""
81364750dSJames Henderson
91364750dSJames Hendersonimport textwrap
101364750dSJames Henderson
111364750dSJames Hendersonfrom dex.tools import ToolBase, get_tool_names, get_tools_directory, tool_main
12*6779376eSStephen Tozerfrom dex.utils.Imports import load_module
131364750dSJames Hendersonfrom dex.utils.ReturnCode import ReturnCode
141364750dSJames Henderson
151364750dSJames Henderson
161364750dSJames Hendersonclass Tool(ToolBase):
171364750dSJames Henderson    """Provides help info on subtools."""
181364750dSJames Henderson
191364750dSJames Henderson    @property
201364750dSJames Henderson    def name(self):
21f98ee40fSTobias Hieta        return "DExTer help"
221364750dSJames Henderson
231364750dSJames Henderson    @property
241364750dSJames Henderson    def _visible_tool_names(self):
25f98ee40fSTobias Hieta        return [t for t in get_tool_names() if not t.endswith("-")]
261364750dSJames Henderson
271364750dSJames Henderson    def add_tool_arguments(self, parser, defaults):
281364750dSJames Henderson        parser.description = Tool.__doc__
291364750dSJames Henderson        parser.add_argument(
30f98ee40fSTobias Hieta            "tool", choices=self._visible_tool_names, nargs="?", help="name of subtool"
31f98ee40fSTobias Hieta        )
321364750dSJames Henderson
331364750dSJames Henderson    def handle_options(self, defaults):
341364750dSJames Henderson        pass
351364750dSJames Henderson
361364750dSJames Henderson    @property
371364750dSJames Henderson    def _default_text(self):
38f98ee40fSTobias Hieta        s = "\n<b>The following subtools are available:</>\n\n"
391364750dSJames Henderson        tools_directory = get_tools_directory()
401364750dSJames Henderson        for tool_name in sorted(self._visible_tool_names):
41f98ee40fSTobias Hieta            internal_name = tool_name.replace("-", "_")
42*6779376eSStephen Tozer            tool_doc = load_module(internal_name, tools_directory).Tool.__doc__
43f98ee40fSTobias Hieta            tool_doc = tool_doc.strip() if tool_doc else ""
44f98ee40fSTobias Hieta            tool_doc = textwrap.fill(" ".join(tool_doc.split()), 80)
45f98ee40fSTobias Hieta            s += "<g>{}</>\n{}\n\n".format(tool_name, tool_doc)
461364750dSJames Henderson        return s
471364750dSJames Henderson
481364750dSJames Henderson    def go(self) -> ReturnCode:
491364750dSJames Henderson        if self.context.options.tool is None:
501364750dSJames Henderson            self.context.o.auto(self._default_text)
511364750dSJames Henderson            return ReturnCode.OK
521364750dSJames Henderson
53f98ee40fSTobias Hieta        tool_name = self.context.options.tool.replace("-", "_")
541364750dSJames Henderson        tools_directory = get_tools_directory()
55*6779376eSStephen Tozer        module = load_module(tool_name, tools_directory)
56f98ee40fSTobias Hieta        return tool_main(self.context, module.Tool(self.context), ["--help"])
57