1 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 2 // -*- Mode: C++ -*- 3 // 4 // Copyright (C) 2017-2023 Red Hat, Inc. 5 // 6 // Author: Dodji Seketeli 7 8 /// @file 9 /// 10 /// The declaration of the reporting types of libabigail's diff 11 /// engine. 12 13 #ifndef __ABG_REPORTER_H__ 14 #define __ABG_REPORTER_H__ 15 16 #include <memory> 17 #include <ostream> 18 #include <string> 19 20 namespace abigail 21 { 22 23 using std::shared_ptr; 24 25 namespace comparison 26 { 27 class diff; 28 class type_decl_diff; 29 class enum_diff; 30 class typedef_diff; 31 class qualified_type_diff; 32 class distinct_diff; 33 class pointer_diff; 34 class reference_diff; 35 class subrange_diff; 36 class array_diff; 37 class base_diff; 38 class class_or_union_diff; 39 class class_diff; 40 class union_diff; 41 class scope_diff; 42 class fn_parm_diff; 43 class function_type_diff; 44 class function_decl_diff; 45 class var_diff; 46 class translation_unit_diff; 47 class corpus_diff; 48 class diff_maps; 49 class reporter_base; 50 51 /// A convenience typedef for a shared pointer to a @ref 52 /// reporter_base. 53 typedef shared_ptr<reporter_base> reporter_base_sptr; 54 55 /// The base class of all the reporting classes. 56 class reporter_base 57 { 58 public: 59 60 virtual bool diff_to_be_reported(const diff *d) const; 61 62 virtual bool diff_has_net_changes(const corpus_diff *d) const = 0; 63 64 virtual void 65 report(const type_decl_diff& d, std::ostream& out, 66 const std::string& indent = "") const = 0; 67 68 virtual void 69 report(const enum_diff& d, std::ostream& out, 70 const std::string& indent = "") const = 0; 71 72 virtual void 73 report(const typedef_diff& d, std::ostream& out, 74 const std::string& indent = "") const = 0; 75 76 virtual void 77 report(const qualified_type_diff& d, std::ostream& out, 78 const std::string& indent = "") const = 0; 79 80 virtual void 81 report(const distinct_diff& d, std::ostream& out, 82 const std::string& indent = "") const = 0; 83 84 virtual void 85 report(const pointer_diff& d, std::ostream& out, 86 const std::string& indent = "") const = 0; 87 88 virtual void 89 report(const reference_diff& d, std::ostream& out, 90 const std::string& indent = "") const = 0; 91 92 virtual void 93 report(const array_diff& d, std::ostream& out, 94 const std::string& indent = "") const = 0; 95 96 virtual void 97 report(const subrange_diff& d, std::ostream& out, 98 const std::string& indent = "") const = 0; 99 100 virtual void 101 report(const base_diff& d, std::ostream& out, 102 const std::string& indent = "") const = 0; 103 104 virtual void 105 report(const class_or_union_diff& d, std::ostream& out, 106 const std::string& indent = "") const = 0; 107 108 virtual void 109 report(const class_diff& d, std::ostream& out, 110 const std::string& indent = "") const = 0; 111 112 virtual void 113 report(const union_diff& d, std::ostream& out, 114 const std::string& indent = "") const = 0; 115 116 virtual void 117 report(const scope_diff& d, std::ostream& out, 118 const std::string& indent = "") const = 0; 119 120 virtual void 121 report(const fn_parm_diff& d, std::ostream& out, 122 const std::string& indent = "") const = 0; 123 124 virtual void 125 report(const function_type_diff& d, std::ostream& out, 126 const std::string& indent = "") const = 0; 127 128 virtual void 129 report(const function_decl_diff& d, std::ostream& out, 130 const std::string& indent = "") const = 0; 131 132 virtual void 133 report(const var_diff& d, std::ostream& out, 134 const std::string& indent = "") const = 0; 135 136 virtual void 137 report(const translation_unit_diff& d, std::ostream& out, 138 const std::string& indent = "") const = 0; 139 140 virtual void 141 report(const corpus_diff& d, std::ostream& out, 142 const std::string& indent = "") const = 0; 143 ~reporter_base()144 virtual ~reporter_base() {} 145 }; //end class reporter_base 146 147 class default_reporter; 148 149 /// A convenience typedef for a shared_ptr to a @ref default_reporter. 150 typedef shared_ptr<default_reporter> default_reporter_sptr; 151 152 /// The default, initial, reporter of the libabigail comparison engine. 153 class default_reporter : public reporter_base 154 { 155 public: 156 157 virtual bool diff_has_net_changes(const corpus_diff *d) const; 158 159 virtual void 160 report(const type_decl_diff& d, std::ostream& out, 161 const std::string& indent = "") const; 162 163 virtual void 164 report(const enum_diff& d, std::ostream& out, 165 const std::string& indent = "") const; 166 167 void 168 report_non_type_typedef_changes(const typedef_diff &d, 169 std::ostream& out, 170 const std::string& indent) const; 171 172 virtual void 173 report(const typedef_diff& d, std::ostream& out, 174 const std::string& indent = "") const; 175 176 bool 177 report_local_qualified_type_changes(const qualified_type_diff& d, 178 std::ostream& out, 179 const std::string& indent) const; 180 181 void 182 report_underlying_changes_of_qualified_type (const qualified_type_diff& d, 183 ostream& out, 184 const string& indent) const; 185 186 virtual void 187 report(const qualified_type_diff& d, std::ostream& out, 188 const std::string& indent = "") const; 189 190 virtual void 191 report(const pointer_diff& d, std::ostream& out, 192 const std::string& indent = "") const; 193 194 void 195 report_local_reference_type_changes(const reference_diff& d, 196 std::ostream& out, 197 const std::string& indent) const; 198 199 virtual void 200 report(const reference_diff& d, std::ostream& out, 201 const std::string& indent = "") const; 202 203 virtual void 204 report(const fn_parm_diff& d, std::ostream& out, 205 const std::string& indent = "") const; 206 207 void 208 report_local_function_type_changes(const function_type_diff& d, 209 std::ostream& out, 210 const std::string& indent) const; 211 212 virtual void 213 report(const function_type_diff& d, std::ostream& out, 214 const std::string& indent = "") const; 215 216 virtual void 217 report(const subrange_diff& d, std::ostream& out, 218 const std::string& indent = "") const; 219 220 virtual void 221 report(const array_diff& d, std::ostream& out, 222 const std::string& indent = "") const; 223 224 virtual void 225 report(const base_diff& d, std::ostream& out, 226 const std::string& indent = "") const; 227 228 virtual void 229 report(const scope_diff& d, std::ostream& out, 230 const std::string& indent = "") const; 231 232 virtual void 233 report(const class_or_union_diff& d, std::ostream& out, 234 const std::string& indent = "") const; 235 236 virtual void 237 report(const class_diff& d, std::ostream& out, 238 const std::string& indent = "") const; 239 240 virtual void 241 report(const union_diff& d, std::ostream& out, 242 const std::string& indent = "") const; 243 244 virtual void 245 report(const distinct_diff& d, std::ostream& out, 246 const std::string& indent = "") const; 247 248 virtual void 249 report(const function_decl_diff& d, std::ostream& out, 250 const std::string& indent = "") const; 251 252 virtual void 253 report(const var_diff& d, std::ostream& out, 254 const std::string& indent = "") const; 255 256 virtual void 257 report(const translation_unit_diff& d, std::ostream& out, 258 const std::string& indent = "") const; 259 260 virtual void 261 report(const corpus_diff& d, std::ostream& out, 262 const std::string& indent = "") const; 263 }; // end class default_reporter 264 265 /// A reporter that only reports leaf changes 266 class leaf_reporter : public default_reporter 267 { 268 public: 269 270 virtual bool diff_to_be_reported(const diff *d) const; 271 272 virtual bool diff_has_net_changes(const corpus_diff *d) const; 273 274 void 275 report_changes_from_diff_maps(const diff_maps&, std::ostream& out, 276 const std::string& indent) const; 277 278 virtual void 279 report(const typedef_diff& d, std::ostream& out, 280 const std::string& indent = "") const; 281 282 virtual void 283 report(const qualified_type_diff& d, std::ostream& out, 284 const std::string& indent = "") const; 285 286 virtual void 287 report(const pointer_diff& d, std::ostream& out, 288 const std::string& indent = "") const; 289 290 virtual void 291 report(const reference_diff& d, std::ostream& out, 292 const std::string& indent = "") const; 293 294 virtual void 295 report(const fn_parm_diff& d, std::ostream& out, 296 const std::string& indent = "") const; 297 298 virtual void 299 report(const function_type_diff& d, std::ostream& out, 300 const std::string& indent = "") const; 301 302 virtual void 303 report(const subrange_diff& d, std::ostream& out, 304 const std::string& indent = "") const; 305 306 virtual void 307 report(const array_diff& d, std::ostream& out, 308 const std::string& indent = "") const; 309 310 virtual void 311 report(const scope_diff& d, std::ostream& out, 312 const std::string& indent = "") const; 313 314 virtual void 315 report(const class_or_union_diff& d, std::ostream& out, 316 const std::string& indent = "") const; 317 318 virtual void 319 report(const class_diff& d, std::ostream& out, 320 const std::string& indent = "") const; 321 322 virtual void 323 report(const union_diff& d, std::ostream& out, 324 const std::string& indent = "") const; 325 326 virtual void 327 report(const distinct_diff& d, std::ostream& out, 328 const std::string& indent = "") const; 329 330 virtual void 331 report(const function_decl_diff& d, std::ostream& out, 332 const std::string& indent = "") const; 333 334 virtual void 335 report(const var_diff& d, std::ostream& out, 336 const std::string& indent = "") const; 337 338 virtual void 339 report(const translation_unit_diff& d, std::ostream& out, 340 const std::string& indent = "") const; 341 342 virtual void 343 report(const corpus_diff& d, std::ostream& out, 344 const std::string& indent = "") const; 345 }; // end class leaf_reporter 346 347 } // end namespace comparison 348 } // end namespace abigail 349 350 #endif // __ABG_REPORTER_H__ 351