Revert AST Matchers default to AsIs mode

Reviewers: aaron.ballman, klimek

Subscribers: cfe-commits

Tags: #clang

Differential Revision: https://reviews.llvm.org/D83076
This commit is contained in:
Stephen Kelly 2020-07-02 20:46:27 +01:00
parent 7926969afc
commit 551092bc3d
5 changed files with 12 additions and 44 deletions

View File

@ -46,12 +46,12 @@ bool HelpQuery::run(llvm::raw_ostream &OS, QuerySession &QS) const {
" set traversal <kind> "
"Set traversal kind of clang-query session. Available kinds are:\n"
" AsIs "
"Print and match the AST as clang sees it.\n"
"Print and match the AST as clang sees it. This mode is the "
"default.\n"
" IgnoreImplicitCastsAndParentheses "
"Omit implicit casts and parens in matching and dumping.\n"
" IgnoreUnlessSpelledInSource "
"Omit AST nodes unless spelled in the source. This mode is the "
"default.\n"
"Omit AST nodes unless spelled in the source.\n"
" set output <feature> "
"Set whether to output only <feature> content.\n"
" enable output <feature> "

View File

@ -26,7 +26,7 @@ public:
QuerySession(llvm::ArrayRef<std::unique_ptr<ASTUnit>> ASTs)
: ASTs(ASTs), PrintOutput(false), DiagOutput(true),
DetailedASTOutput(false), BindRoot(true), PrintMatcher(false),
Terminate(false), TK(ast_type_traits::TK_IgnoreUnlessSpelledInSource) {}
Terminate(false), TK(ast_type_traits::TK_AsIs) {}
llvm::ArrayRef<std::unique_ptr<ASTUnit>> ASTs;

View File

@ -258,44 +258,7 @@ release of Clang. Users of the build system should adjust accordingly.
AST Matchers
------------
- Traversal in AST Matchers was simplified to use the
``TK_IgnoreUnlessSpelledInSource`` mode by default, instead of ``TK_AsIs``.
This means that many uses of the ``ignoringImplicit()`` and similar matchers
is no longer necessary. Clients of AST Matchers which wish to match on
implicit AST nodes can wrap their matcher in ``traverse(TK_AsIs, ...)`` or
use ``TraversalKindScope`` if appropriate. The ``clang-query`` tool also
uses ``IgnoreUnlessSpelledInSource`` by default. The mode can be changed
using ``set traversal AsIs`` in the ``clang-query`` environment.
As this change requires downstream tools which use AST Matchers to adapt
to the new default, a porting guide may be useful for downstream tools
needing to adapt.
Note that although there are many steps below, only the first is
non-optional. The steps are intentionally extemely granular to facilitate
understanding of the guide itself. It is reasonable to do some of the
steps at the same time if you understand the guide:
1. Use ``(your ASTContext instance).getParentMapContext().setTraversalKind(TK_AsIs)``
to restore the previous behavior for your tool. All further steps in
this porting guide are optional.
2. Wrap your existing matcher expressions with ``traverse(TK_AsIs, ...)``
before passing them to ``ASTMatchFinder::addMatcher``.
3. Remove ``(your ASTContext instance).getParentMapContext().setTraversalKind(TK_AsIs)``
from your tool so that the default behavior of your tool matches the
default behavior of upstream clang. This is made possible by wrapping
your matchers in ``traverse(TK_AsIs, ...)`` from step (2).
4. Audit your matcher expressions and remove ``traverse(TK_AsIs, ...)``
where not needed.
5. Audit your matcher expressions and remove calls to ``ignoring*()``
matchers where not needed.
6. Audit your matcher expressions and consider whether the matcher is
better using the ``TK_AsIs`` mode or if it can be better expressed in
the default mode. For example, some matchers explicitly match
``has(implicitCastExpr(has(...)))``. Such matchers are sometimes
written by author who were unaware of the existence of the
``ignoring*()`` matchers.
- ...
clang-format
------------

View File

@ -67,7 +67,7 @@ public:
private:
ASTContext &ASTCtx;
class ParentMap;
TraversalKind Traversal = TK_IgnoreUnlessSpelledInSource;
TraversalKind Traversal = TK_AsIs;
std::unique_ptr<ParentMap> Parents;
};

View File

@ -1207,7 +1207,12 @@ TEST_P(ASTMatchersTest, CastExpression_MatchesImplicitCasts) {
}
TEST_P(ASTMatchersTest, CastExpr_DoesNotMatchNonCasts) {
EXPECT_TRUE(notMatches("char c = '0';", castExpr()));
if (GetParam().Language == Lang_C89 || GetParam().Language == Lang_C99) {
// This does have a cast in C
EXPECT_TRUE(matches("char c = '0';", implicitCastExpr()));
} else {
EXPECT_TRUE(notMatches("char c = '0';", castExpr()));
}
EXPECT_TRUE(notMatches("int i = (0);", castExpr()));
EXPECT_TRUE(notMatches("int i = 0;", castExpr()));
}