1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
// -*- Mode: C++ -*-
//
// Copyright (C) 2013-2025 Red Hat, Inc.
//
// Author: Dodji Seketeli
/// @file
///
/// This header declares filters for the diff trees resulting from
/// comparing ABI Corpora.
#ifndef __ABG_COMP_FILTER_H__
#define __ABG_COMP_FILTER_H__
#include "abg-comparison.h"
namespace abigail
{
namespace comparison
{
/// Facilities to walk, categorize and possibly filter nodes of the
/// diff tree.
namespace filtering
{
bool
has_harmless_name_change(const decl_base_sptr& f,
const decl_base_sptr& s,
const diff_context_sptr& ctxt);
bool union_diff_has_harmless_changes(const diff *d);
bool
has_harmful_name_change(const decl_base_sptr& f,
const decl_base_sptr& s,
const diff_context_sptr& ctxt);
bool
has_harmful_name_change(const diff* dif);
bool
has_virtual_mem_fn_change(const function_decl_diff* diff);
bool
is_decl_only_class_with_size_change(const class_or_union& first,
const class_or_union& second);
bool
is_decl_only_class_with_size_change(const class_or_union_sptr& first,
const class_or_union_sptr& second);
bool
is_decl_only_class_with_size_change(const diff *diff);
bool
has_decl_only_def_change(const decl_base_sptr& first,
const decl_base_sptr& second);
bool
has_decl_only_def_change(const diff *d);
bool
has_class_decl_only_def_change(const class_or_union_sptr& first,
const class_or_union_sptr& second);
bool
has_enum_decl_only_def_change(const enum_type_decl_sptr& first,
const enum_type_decl_sptr& second);
bool
has_class_decl_only_def_change(const diff *diff);
bool
has_enum_decl_only_def_change(const diff *diff);
bool
has_basic_type_name_change(const diff *);
bool
has_class_or_union_type_name_change(const diff *d);
bool
has_basic_or_class_type_name_change(const diff *d);
bool
is_mostly_distinct_diff(const diff *d);
bool
has_anonymous_data_member_change(const diff *d);
bool
has_anonymous_data_member_change(const diff_sptr &d);
bool
has_data_member_replaced_by_anon_dm(const diff* diff);
bool
is_var_1_dim_unknown_size_array_change(const diff*);
bool
is_var_1_dim_unknown_size_array_change(const var_decl_sptr& var1,
const var_decl_sptr& var2);
bool
has_strict_fam_conversion(const class_decl_sptr& first,
const class_decl_sptr& second);
bool
has_strict_fam_conversion(const diff *d);
bool
has_lvalue_reference_ness_change(const diff *d);
bool
has_void_ptr_to_ptr_change(const diff* d);
bool
has_void_to_non_void_change(const diff* d);
bool
has_void_to_non_void_change(const diff_sptr& d);
bool
has_harmless_enum_to_int_change(const diff* d);
bool
has_benign_array_of_unknown_size_change(const diff* dif);
diff_category
has_fn_return_or_parm_harmful_change(const diff* d);
diff_category
has_var_harmful_local_change(const diff* d);
diff_category
has_var_harmful_local_change(const diff_sptr& d);
bool
has_fn_with_virtual_offset_change(const diff* d);
bool
has_fn_with_virtual_offset_change(const diff_sptr& d);
bool
has_incompatible_fn_or_var_change(const diff* d);
bool
has_incompatible_fn_or_var_change(const diff_sptr& d);
bool
is_type_to_compatible_anonymous_type_change(const diff* d);
bool
is_type_to_compatible_anonymous_type_change(const diff_sptr& d);
bool
is_type_to_compatible_anonymous_type_change(const type_base_sptr&,
const type_base_sptr&);
bool
is_data_member_to_compatible_anonymous_dm_change(const diff* d);
bool
is_data_member_to_compatible_anonymous_dm_change(const diff_sptr& d);
bool
is_data_member_to_compatible_anonymous_dm_change(const decl_base_sptr&,
const decl_base_sptr&);
struct filter_base;
/// Convenience typedef for a shared pointer to filter_base
typedef shared_ptr<filter_base> filter_base_sptr;
/// Convenience typedef for a vector of filter_base_sptr
typedef std::vector<filter_base_sptr> filters;
/// The base class for the diff tree node filter.
///
/// It's intended to walk a tree of diff nodes and tag each relevant
/// name into one or several categories depending on well choosen
/// properties of the diff nodes.
struct filter_base : public diff_node_visitor
{
friend void
apply_filter(filter_base_sptr f, diff_sptr deef);
}; //end class filter_base
void
apply_filter(filter_base& filter, diff_sptr d);
void
apply_filter(filter_base& filter, corpus_diff_sptr d);
void
apply_filter(filter_base_sptr filter, diff_sptr d);
class harmless_filter;
/// Convenience typedef for a shared pointer to a harmless_filter.
typedef shared_ptr<harmless_filter> harmless_filter_sptr;
/// A filter that walks the diff nodes tree and tags relevant diff
/// nodes into categories considered to represent harmless changes.
class harmless_filter : public filter_base
{
virtual bool
visit(diff*, bool);
virtual void
visit_end(diff*);
}; // end class harmless_filter
class harmless_harmful_filter;
/// A convenience typedef for a shared pointer to harmful_filter.
typedef shared_ptr<harmless_harmful_filter> harmful_harmless_filter_sptr;
/// A filter that walks the diff nodes tree and tags relevant diff
/// nodes into categories considered to represent potentially harmless
/// or harmful changes.
class harmless_harmful_filter : public filter_base
{
virtual bool
visit(diff*, bool);
virtual void
visit_end(diff*);
}; // end class harmless_harmful_filter
} // end namespace filtering
} // end namespace comparison
} // end namespace abigail
#endif // __ABG_COMP_FILTER_H__
|