diff options
Diffstat (limited to 'llvm/utils/UpdateTestChecks/common.py')
-rw-r--r-- | llvm/utils/UpdateTestChecks/common.py | 71 |
1 files changed, 59 insertions, 12 deletions
diff --git a/llvm/utils/UpdateTestChecks/common.py b/llvm/utils/UpdateTestChecks/common.py index 0700486..274614c 100644 --- a/llvm/utils/UpdateTestChecks/common.py +++ b/llvm/utils/UpdateTestChecks/common.py @@ -74,13 +74,17 @@ class Filter(Regex): """ - def __init__(self, regex, is_filter_out): + def __init__(self, regex, is_filter_out, is_filter_out_after): super(Filter, self).__init__(regex) + if is_filter_out and is_filter_out_after: + raise ValueError("cannot use both --filter-out and --filter-out-after") self.is_filter_out = is_filter_out + self.is_filter_out_after = is_filter_out_after def __deepcopy__(self, memo): result = copy.deepcopy(super(Filter, self), memo) result.is_filter_out = copy.deepcopy(self.is_filter_out, memo) + result.is_filter_out_after = copy.deepcopy(self.is_filter_out_after, memo) return result @@ -127,7 +131,11 @@ def parse_commandline_args(parser): is_filter_out = option_string == "--filter-out" - value_list[-1] = Filter(value_list[-1].regex, is_filter_out) + is_filter_out_after = option_string == "--filter-out-after" + + value_list[-1] = Filter( + value_list[-1].regex, is_filter_out, is_filter_out_after + ) setattr(namespace, self.dest, value_list) @@ -151,6 +159,13 @@ def parse_commandline_args(parser): metavar="REGEX", help="Exclude lines matching REGEX", ) + filter_group.add_argument( + "--filter-out-after", + action=FilterAction, + dest="filters", + metavar="REGEX", + help="Exclude all lines within a given function after line matching REGEX", + ) parser.add_argument( "--include-generated-funcs", @@ -671,6 +686,8 @@ def get_globals_name_prefix(raw_tool_output): def apply_filters(line, filters): has_filter = False for f in filters: + if f.is_filter_out_after: + continue if not f.is_filter_out: has_filter = True if f.search(line): @@ -680,14 +697,34 @@ def apply_filters(line, filters): return False if has_filter else True +def has_filter_out_after(filters): + for f in filters: + if f.is_filter_out_after: + return True + return False + + +def filter_out_after(body, filters): + lines = [] + for line in body.splitlines(): + lines.append(line) + for f in filters: + if f.is_filter_out_after: + if f.search(line): + return lines + return lines + + def do_filter(body, filters): - return ( - body - if not filters - else "\n".join( - filter(lambda line: apply_filters(line, filters), body.splitlines()) - ) - ) + if not filters: + return body + filter_out_after_flag = has_filter_out_after(filters) + lines = [] + if filter_out_after_flag: + lines = filter_out_after(body, filters) + else: + lines = body.splitlines() + return "\n".join(filter(lambda line: apply_filters(line, filters), lines)) def scrub_body(body): @@ -788,7 +825,9 @@ class FunctionTestBuilder: list( map( lambda f: Filter( - re.compile(f.pattern().strip('"'), f.flags()), f.is_filter_out + re.compile(f.pattern().strip('"'), f.flags()), + f.is_filter_out, + f.is_filter_out_after, ), flags.filters, ) @@ -831,7 +870,10 @@ class FunctionTestBuilder: return self._global_var_dict def is_filtered(self): - return bool(self._filters) + for f in self._filters: + if not f.is_filter_out_after: + return True + return False def process_run_line(self, function_re, scrubber, raw_tool_output, prefixes): build_global_values_dictionary( @@ -2526,7 +2568,12 @@ def get_autogennote_suffix(parser, args): # Create a separate option for each filter element. The value is a list # of Filter objects. for elem in value: - opt_name = "filter-out" if elem.is_filter_out else "filter" + if elem.is_filter_out: + opt_name = "filter-out" + elif elem.is_filter_out_after: + opt_name = "filter-out-after" + else: + opt_name = "filter" opt_value = elem.pattern() new_arg = '--%s "%s" ' % (opt_name, opt_value.strip('"')) if new_arg not in autogenerated_note_args: |