Initial implementation of diff tree node filtering
* include/abg-comp-filter.h: New file.
* include/Makefile.am: Add the new include/abg-comp-filter.h to
the source distribution.
* include/abg-comparison.h (enum visiting_kind, diff_category): New enums.
(operator|): Declare new operator declaration for the new
visiting_kind enum.
(operator{|,^,&,~}): Declare new operator decl for the new
diff_category enum.
(diff_context::{get_allowed_category, set_allowed_category,
switch_categories_on, switch_categories_off, diff_filters,
add_diff_filter, maybe_apply_filters}): Declare new member functions.
(diff::{parent_, category_}): New members.
(diff::diff): Adjust.
(diff::{get_parent, set_parent, get_category, add_to_category,
is_filtered_out, to_be_reported}): New members.
(diff_node_visitor::{get_visiting_kind, set_visiting_kind}): New
members.
(diff_node_visitor::visit): Add a new flag to saying if the
visitor is being called in post or pre children traversing mode.
* src/abg-comparison.cc (operator|): Declare new operator
declaration for the new visiting_kind enum.
(operator{|,^,&,~}): Declare new operator decl for the new
diff_category enum.
(diff_context::priv::{allowed_category_, filters_}): New members.
(diff_context::diff_context): Add all known filters.
(diff_context::{get_allowed_category, set_allowed_category,
switch_categories_on, switch_categories_off, diff_filters,
add_diff_filter, maybe_apply_filters}): Define new member
functions.
(diff::{is_filtered_out, to_be_reported}): Define new members.
(*::report): Use the new diff::to_be_reported function.
(*::traverse): Adjust for pre/post visiting.
(var_diff::var_diff): Chain the type diff node to its parent.
({pointer_diff, reference_diff, qualified_type_diff,
typedef_diff}::underlying_type_diff): Chain the underlying type
diff node to its parent.
(enum_diff::enum_diff): Likewise.
(base_diff::underlying_class_diff): Likewise.
({class_diff, corpus_diff}::report): Do not report changed
(member) functions that have been filtered out. Rather report
that they have been filtered out.
({function_decl_diff, class_diff}::traverse): Chain underlying
type diff nodes to their parent.
(diff_node_visitor::visit): Add a new flag to saying if the
visitor is being called in post or pre children traversing mode.
Make sure to call the default diff::visit overload.
* src/abg-comp-filter.cc: New file.
* src/Makefile.am: Add the new abg-comp-filter.cc to the source
distribution.
* tools/bidiff.cc (options::show_harm{ful,less}_changes): New
members.
(display_usage): Add usage strings for --no-harmless and
--no-harmful options.
(parse_command_line): Parse --no-harmless and --no-harmful command
line options.
(set_diff_context_from_opts): Populate the diff context
accordingly.
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2014-03-27 10:03:53 +00:00
|
|
|
// -*- Mode: C++ -*-
|
|
|
|
//
|
2014-06-23 08:17:50 +00:00
|
|
|
// Copyright (C) 2013-2014 Red Hat, Inc.
|
Initial implementation of diff tree node filtering
* include/abg-comp-filter.h: New file.
* include/Makefile.am: Add the new include/abg-comp-filter.h to
the source distribution.
* include/abg-comparison.h (enum visiting_kind, diff_category): New enums.
(operator|): Declare new operator declaration for the new
visiting_kind enum.
(operator{|,^,&,~}): Declare new operator decl for the new
diff_category enum.
(diff_context::{get_allowed_category, set_allowed_category,
switch_categories_on, switch_categories_off, diff_filters,
add_diff_filter, maybe_apply_filters}): Declare new member functions.
(diff::{parent_, category_}): New members.
(diff::diff): Adjust.
(diff::{get_parent, set_parent, get_category, add_to_category,
is_filtered_out, to_be_reported}): New members.
(diff_node_visitor::{get_visiting_kind, set_visiting_kind}): New
members.
(diff_node_visitor::visit): Add a new flag to saying if the
visitor is being called in post or pre children traversing mode.
* src/abg-comparison.cc (operator|): Declare new operator
declaration for the new visiting_kind enum.
(operator{|,^,&,~}): Declare new operator decl for the new
diff_category enum.
(diff_context::priv::{allowed_category_, filters_}): New members.
(diff_context::diff_context): Add all known filters.
(diff_context::{get_allowed_category, set_allowed_category,
switch_categories_on, switch_categories_off, diff_filters,
add_diff_filter, maybe_apply_filters}): Define new member
functions.
(diff::{is_filtered_out, to_be_reported}): Define new members.
(*::report): Use the new diff::to_be_reported function.
(*::traverse): Adjust for pre/post visiting.
(var_diff::var_diff): Chain the type diff node to its parent.
({pointer_diff, reference_diff, qualified_type_diff,
typedef_diff}::underlying_type_diff): Chain the underlying type
diff node to its parent.
(enum_diff::enum_diff): Likewise.
(base_diff::underlying_class_diff): Likewise.
({class_diff, corpus_diff}::report): Do not report changed
(member) functions that have been filtered out. Rather report
that they have been filtered out.
({function_decl_diff, class_diff}::traverse): Chain underlying
type diff nodes to their parent.
(diff_node_visitor::visit): Add a new flag to saying if the
visitor is being called in post or pre children traversing mode.
Make sure to call the default diff::visit overload.
* src/abg-comp-filter.cc: New file.
* src/Makefile.am: Add the new abg-comp-filter.cc to the source
distribution.
* tools/bidiff.cc (options::show_harm{ful,less}_changes): New
members.
(display_usage): Add usage strings for --no-harmless and
--no-harmful options.
(parse_command_line): Parse --no-harmless and --no-harmful command
line options.
(set_diff_context_from_opts): Populate the diff context
accordingly.
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2014-03-27 10:03:53 +00:00
|
|
|
//
|
|
|
|
// This file is part of the GNU Application Binary Interface Generic
|
|
|
|
// Analysis and Instrumentation Library (libabigail). This library is
|
|
|
|
// free software; you can redistribute it and/or modify it under the
|
|
|
|
// terms of the GNU Lesser General Public License as published by the
|
|
|
|
// Free Software Foundation; either version 3, or (at your option) any
|
|
|
|
// later version.
|
|
|
|
|
|
|
|
// This library is distributed in the hope that it will be useful, but
|
|
|
|
// WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
// General Lesser Public License for more details.
|
|
|
|
|
|
|
|
// You should have received a copy of the GNU Lesser General Public
|
|
|
|
// License along with this program; see the file COPYING-LGPLV3. If
|
|
|
|
// not, see <http://www.gnu.org/licenses/>.
|
|
|
|
//
|
|
|
|
// 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
|
|
|
|
{
|
|
|
|
|
|
|
|
class 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_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);
|
|
|
|
}; // end class harmless_filter
|
|
|
|
|
|
|
|
class harmful_filter;
|
|
|
|
/// A convenience typedef for a shared pointer to harmful_filter.
|
|
|
|
typedef shared_ptr<harmful_filter> harmful_filter_sptr;
|
|
|
|
|
|
|
|
/// A filter that walks the diff nodes tree tags relevant diff nodes
|
|
|
|
/// into categories considered to represent potentially harmful
|
|
|
|
/// changes.
|
|
|
|
class harmful_filter : public filter_base
|
|
|
|
{
|
|
|
|
virtual bool
|
|
|
|
visit(diff*, bool);
|
|
|
|
}; // end class harmful_filter
|
|
|
|
|
|
|
|
} // end namespace filtering
|
|
|
|
} // end namespace comparison
|
|
|
|
} // end namespace abigail
|
|
|
|
|
|
|
|
#endif // __ABG_COMP_FILTER_H__
|