xref: /llvm-project/cross-project-tests/debuginfo-tests/dexter/dex/command/CommandBase.py (revision f98ee40f4b5d7474fc67e82824bf6abbaedb7b1c)
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"""Base class for all DExTer commands, where a command is a specific Python
81364750dSJames Hendersonfunction that can be embedded into a comment in the source code under test
91364750dSJames Hendersonwhich will then be executed by DExTer during debugging.
101364750dSJames Henderson"""
111364750dSJames Henderson
121364750dSJames Hendersonimport abc
137e46a721SStephen Tozerfrom collections import namedtuple
141364750dSJames Hendersonfrom typing import List
151364750dSJames Henderson
16*f98ee40fSTobias HietaStepExpectInfo = namedtuple("StepExpectInfo", "expression, path, frame_idx, line_range")
17*f98ee40fSTobias Hieta
187e46a721SStephen Tozer
191364750dSJames Hendersonclass CommandBase(object, metaclass=abc.ABCMeta):
201364750dSJames Henderson    def __init__(self):
211364750dSJames Henderson        self.path = None
221364750dSJames Henderson        self.lineno = None
23*f98ee40fSTobias Hieta        self.raw_text = ""
241364750dSJames Henderson
251364750dSJames Henderson    def get_label_args(self):
261364750dSJames Henderson        return list()
271364750dSJames Henderson
281364750dSJames Henderson    def has_labels(self):
291364750dSJames Henderson        return False
301364750dSJames Henderson
311364750dSJames Henderson    @abc.abstractstaticmethod
321364750dSJames Henderson    def get_name():
331364750dSJames Henderson        """This abstract method is usually implemented in subclasses as:
341364750dSJames Henderson        return __class__.__name__
351364750dSJames Henderson        """
361364750dSJames Henderson
371364750dSJames Henderson    def get_watches(self) -> List[str]:
381364750dSJames Henderson        return []
391364750dSJames Henderson
401364750dSJames Henderson    @abc.abstractmethod
411364750dSJames Henderson    def eval(self):
421364750dSJames Henderson        """Evaluate the command.
431364750dSJames Henderson
441364750dSJames Henderson        This will be called when constructing a Heuristic object to determine
451364750dSJames Henderson        the debug score.
461364750dSJames Henderson
471364750dSJames Henderson        Returns:
481364750dSJames Henderson            The logic for handling the result of CommandBase.eval() must be
491364750dSJames Henderson            defined in Heuristic.__init__() so a consitent return type between
501364750dSJames Henderson            commands is not enforced.
511364750dSJames Henderson        """
521364750dSJames Henderson
531364750dSJames Henderson    @staticmethod
541364750dSJames Henderson    def get_subcommands() -> dict:
551364750dSJames Henderson        """Returns a dictionary of subcommands in the form {name: command} or
561364750dSJames Henderson        None if no subcommands are required.
571364750dSJames Henderson        """
581364750dSJames Henderson        return None
59