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