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:
parent
7926969afc
commit
551092bc3d
|
@ -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> "
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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
|
||||
------------
|
||||
|
|
|
@ -67,7 +67,7 @@ public:
|
|||
private:
|
||||
ASTContext &ASTCtx;
|
||||
class ParentMap;
|
||||
TraversalKind Traversal = TK_IgnoreUnlessSpelledInSource;
|
||||
TraversalKind Traversal = TK_AsIs;
|
||||
std::unique_ptr<ParentMap> Parents;
|
||||
};
|
||||
|
||||
|
|
|
@ -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()));
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue