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