2017-11-02 07:09:49 +08:00
|
|
|
//===- Registry.cpp - Matcher registry ------------------------------------===//
|
2013-05-14 17:13:00 +08:00
|
|
|
//
|
2019-01-19 16:50:56 +08:00
|
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
2013-05-14 17:13:00 +08:00
|
|
|
//
|
2017-11-02 07:09:49 +08:00
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
//
|
2013-05-14 17:13:00 +08:00
|
|
|
/// \file
|
2018-05-09 09:00:01 +08:00
|
|
|
/// Registry map populated at static initialization time.
|
2017-11-02 07:09:49 +08:00
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
2013-05-14 17:13:00 +08:00
|
|
|
|
|
|
|
#include "clang/ASTMatchers/Dynamic/Registry.h"
|
|
|
|
#include "Marshallers.h"
|
2017-11-02 07:09:49 +08:00
|
|
|
#include "clang/AST/ASTTypeTraits.h"
|
2013-05-14 17:13:00 +08:00
|
|
|
#include "clang/ASTMatchers/ASTMatchers.h"
|
2017-11-02 07:09:49 +08:00
|
|
|
#include "clang/ASTMatchers/Dynamic/Diagnostics.h"
|
|
|
|
#include "clang/ASTMatchers/Dynamic/VariantValue.h"
|
|
|
|
#include "llvm/ADT/Optional.h"
|
2015-08-13 04:05:18 +08:00
|
|
|
#include "llvm/ADT/STLExtras.h"
|
2013-05-14 17:13:00 +08:00
|
|
|
#include "llvm/ADT/StringMap.h"
|
|
|
|
#include "llvm/ADT/StringRef.h"
|
|
|
|
#include "llvm/Support/ManagedStatic.h"
|
2017-11-02 07:09:49 +08:00
|
|
|
#include "llvm/Support/raw_ostream.h"
|
|
|
|
#include <cassert>
|
|
|
|
#include <iterator>
|
|
|
|
#include <memory>
|
2014-01-24 06:48:38 +08:00
|
|
|
#include <set>
|
2017-11-02 07:09:49 +08:00
|
|
|
#include <string>
|
2014-01-07 19:51:46 +08:00
|
|
|
#include <utility>
|
2017-11-02 07:09:49 +08:00
|
|
|
#include <vector>
|
2013-05-14 17:13:00 +08:00
|
|
|
|
2014-01-24 06:48:38 +08:00
|
|
|
using namespace clang::ast_type_traits;
|
|
|
|
|
2013-05-14 17:13:00 +08:00
|
|
|
namespace clang {
|
|
|
|
namespace ast_matchers {
|
|
|
|
namespace dynamic {
|
2017-11-02 07:09:49 +08:00
|
|
|
|
2013-05-14 17:13:00 +08:00
|
|
|
namespace {
|
|
|
|
|
2013-11-23 09:34:36 +08:00
|
|
|
using internal::MatcherDescriptor;
|
2013-05-14 17:13:00 +08:00
|
|
|
|
2017-11-02 07:09:49 +08:00
|
|
|
using ConstructorMap = llvm::StringMap<std::unique_ptr<const MatcherDescriptor>>;
|
|
|
|
|
2013-05-14 17:13:00 +08:00
|
|
|
class RegistryMaps {
|
|
|
|
public:
|
|
|
|
RegistryMaps();
|
|
|
|
~RegistryMaps();
|
|
|
|
|
|
|
|
const ConstructorMap &constructors() const { return Constructors; }
|
|
|
|
|
|
|
|
private:
|
2016-10-11 00:26:40 +08:00
|
|
|
void registerMatcher(StringRef MatcherName,
|
|
|
|
std::unique_ptr<MatcherDescriptor> Callback);
|
|
|
|
|
2013-05-14 17:13:00 +08:00
|
|
|
ConstructorMap Constructors;
|
|
|
|
};
|
|
|
|
|
2017-11-02 07:09:49 +08:00
|
|
|
} // namespace
|
|
|
|
|
2016-10-11 00:26:40 +08:00
|
|
|
void RegistryMaps::registerMatcher(
|
|
|
|
StringRef MatcherName, std::unique_ptr<MatcherDescriptor> Callback) {
|
2013-06-04 23:46:22 +08:00
|
|
|
assert(Constructors.find(MatcherName) == Constructors.end());
|
2016-10-11 00:26:40 +08:00
|
|
|
Constructors[MatcherName] = std::move(Callback);
|
2013-05-14 17:13:00 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
#define REGISTER_MATCHER(name) \
|
|
|
|
registerMatcher(#name, internal::makeMatcherAutoMarshall( \
|
|
|
|
::clang::ast_matchers::name, #name));
|
|
|
|
|
2017-06-09 06:00:58 +08:00
|
|
|
#define REGISTER_MATCHER_OVERLOAD(name) \
|
|
|
|
registerMatcher(#name, \
|
2019-08-15 07:04:18 +08:00
|
|
|
std::make_unique<internal::OverloadedMatcherDescriptor>(name##Callbacks))
|
2017-06-09 06:00:58 +08:00
|
|
|
|
2013-07-23 00:13:57 +08:00
|
|
|
#define SPECIFIC_MATCHER_OVERLOAD(name, Id) \
|
2016-10-11 00:26:40 +08:00
|
|
|
static_cast<::clang::ast_matchers::name##_Type##Id>( \
|
2013-07-23 00:13:57 +08:00
|
|
|
::clang::ast_matchers::name)
|
|
|
|
|
2017-06-09 06:00:58 +08:00
|
|
|
#define MATCHER_OVERLOAD_ENTRY(name, Id) \
|
|
|
|
internal::makeMatcherAutoMarshall(SPECIFIC_MATCHER_OVERLOAD(name, Id), \
|
|
|
|
#name)
|
|
|
|
|
2013-07-23 00:13:57 +08:00
|
|
|
#define REGISTER_OVERLOADED_2(name) \
|
|
|
|
do { \
|
2017-06-09 06:00:58 +08:00
|
|
|
std::unique_ptr<MatcherDescriptor> name##Callbacks[] = { \
|
|
|
|
MATCHER_OVERLOAD_ENTRY(name, 0), \
|
|
|
|
MATCHER_OVERLOAD_ENTRY(name, 1)}; \
|
|
|
|
REGISTER_MATCHER_OVERLOAD(name); \
|
2017-11-02 07:09:49 +08:00
|
|
|
} while (false)
|
2013-07-24 22:48:01 +08:00
|
|
|
|
2018-05-09 09:00:01 +08:00
|
|
|
/// Generate a registry map with all the known matchers.
|
2019-03-21 01:15:47 +08:00
|
|
|
/// Please keep sorted alphabetically!
|
2013-05-14 17:13:00 +08:00
|
|
|
RegistryMaps::RegistryMaps() {
|
2013-06-04 23:46:22 +08:00
|
|
|
// TODO: Here is the list of the missing matchers, grouped by reason.
|
|
|
|
//
|
|
|
|
// Need Variant/Parser fixes:
|
|
|
|
// ofKind
|
|
|
|
//
|
|
|
|
// Polymorphic + argument overload:
|
|
|
|
// findAll
|
|
|
|
//
|
|
|
|
// Other:
|
|
|
|
// equalsNode
|
2013-05-14 17:13:00 +08:00
|
|
|
|
2013-07-23 00:13:57 +08:00
|
|
|
REGISTER_OVERLOADED_2(callee);
|
|
|
|
REGISTER_OVERLOADED_2(hasPrefix);
|
|
|
|
REGISTER_OVERLOADED_2(hasType);
|
2018-11-10 04:54:06 +08:00
|
|
|
REGISTER_OVERLOADED_2(ignoringParens);
|
2013-07-23 00:13:57 +08:00
|
|
|
REGISTER_OVERLOADED_2(isDerivedFrom);
|
2019-07-25 19:54:13 +08:00
|
|
|
REGISTER_OVERLOADED_2(isDirectlyDerivedFrom);
|
2013-07-23 00:13:57 +08:00
|
|
|
REGISTER_OVERLOADED_2(isSameOrDerivedFrom);
|
2014-03-10 23:40:23 +08:00
|
|
|
REGISTER_OVERLOADED_2(loc);
|
2013-07-23 00:13:57 +08:00
|
|
|
REGISTER_OVERLOADED_2(pointsTo);
|
|
|
|
REGISTER_OVERLOADED_2(references);
|
|
|
|
REGISTER_OVERLOADED_2(thisPointerType);
|
|
|
|
|
2017-06-09 06:00:58 +08:00
|
|
|
std::unique_ptr<MatcherDescriptor> equalsCallbacks[] = {
|
|
|
|
MATCHER_OVERLOAD_ENTRY(equals, 0),
|
|
|
|
MATCHER_OVERLOAD_ENTRY(equals, 1),
|
|
|
|
MATCHER_OVERLOAD_ENTRY(equals, 2),
|
|
|
|
};
|
|
|
|
REGISTER_MATCHER_OVERLOAD(equals);
|
|
|
|
|
2013-06-04 23:46:22 +08:00
|
|
|
REGISTER_MATCHER(accessSpecDecl);
|
Adding new AST matchers for: addrLabelExpr, atomicExpr, binaryConditionalOperator, designatedInitExpr, designatorCountIs, hasSyntacticForm, implicitValueInitExpr, labelDecl, opaqueValueExpr, parenListExpr, predefinedExpr, requiresZeroInitialization, and stmtExpr.
Patch by Aleksei Sidorin.
llvm-svn: 263027
2016-03-10 01:11:51 +08:00
|
|
|
REGISTER_MATCHER(addrLabelExpr);
|
2013-06-04 23:46:22 +08:00
|
|
|
REGISTER_MATCHER(alignOfExpr);
|
2013-08-29 02:42:04 +08:00
|
|
|
REGISTER_MATCHER(allOf);
|
|
|
|
REGISTER_MATCHER(anyOf);
|
2013-06-21 23:51:31 +08:00
|
|
|
REGISTER_MATCHER(anything);
|
|
|
|
REGISTER_MATCHER(argumentCountIs);
|
2013-06-04 23:46:22 +08:00
|
|
|
REGISTER_MATCHER(arraySubscriptExpr);
|
|
|
|
REGISTER_MATCHER(arrayType);
|
2014-10-09 21:06:22 +08:00
|
|
|
REGISTER_MATCHER(asString);
|
2019-03-21 01:15:47 +08:00
|
|
|
REGISTER_MATCHER(asmStmt);
|
Adding new AST matchers for: addrLabelExpr, atomicExpr, binaryConditionalOperator, designatedInitExpr, designatorCountIs, hasSyntacticForm, implicitValueInitExpr, labelDecl, opaqueValueExpr, parenListExpr, predefinedExpr, requiresZeroInitialization, and stmtExpr.
Patch by Aleksei Sidorin.
llvm-svn: 263027
2016-03-10 01:11:51 +08:00
|
|
|
REGISTER_MATCHER(atomicExpr);
|
2013-06-04 23:46:22 +08:00
|
|
|
REGISTER_MATCHER(atomicType);
|
2018-10-04 04:52:45 +08:00
|
|
|
REGISTER_MATCHER(autoType);
|
2019-03-21 01:15:47 +08:00
|
|
|
REGISTER_MATCHER(autoreleasePoolStmt)
|
Adding new AST matchers for: addrLabelExpr, atomicExpr, binaryConditionalOperator, designatedInitExpr, designatorCountIs, hasSyntacticForm, implicitValueInitExpr, labelDecl, opaqueValueExpr, parenListExpr, predefinedExpr, requiresZeroInitialization, and stmtExpr.
Patch by Aleksei Sidorin.
llvm-svn: 263027
2016-03-10 01:11:51 +08:00
|
|
|
REGISTER_MATCHER(binaryConditionalOperator);
|
2018-10-04 04:52:45 +08:00
|
|
|
REGISTER_MATCHER(binaryOperator);
|
2018-05-17 06:47:03 +08:00
|
|
|
REGISTER_MATCHER(blockDecl);
|
2018-12-13 11:35:10 +08:00
|
|
|
REGISTER_MATCHER(blockExpr);
|
2013-06-04 23:46:22 +08:00
|
|
|
REGISTER_MATCHER(blockPointerType);
|
2015-12-23 04:06:40 +08:00
|
|
|
REGISTER_MATCHER(booleanType);
|
2013-06-04 23:46:22 +08:00
|
|
|
REGISTER_MATCHER(breakStmt);
|
|
|
|
REGISTER_MATCHER(builtinType);
|
2019-03-21 01:15:47 +08:00
|
|
|
REGISTER_MATCHER(cStyleCastExpr);
|
2013-05-14 17:13:00 +08:00
|
|
|
REGISTER_MATCHER(callExpr);
|
2013-11-25 23:03:44 +08:00
|
|
|
REGISTER_MATCHER(caseStmt);
|
2013-06-04 23:46:22 +08:00
|
|
|
REGISTER_MATCHER(castExpr);
|
2013-05-14 17:13:00 +08:00
|
|
|
REGISTER_MATCHER(characterLiteral);
|
[ASTImporter] Add support for importing ChooseExpr AST nodes.
Summary:
This allows ASTs to be merged when they contain ChooseExpr (the GNU
__builtin_choose_expr construction). This is needed, for example, for
cross-CTU analysis of C code that makes use of __builtin_choose_expr.
The node is already supported in the AST, but it didn't have a matcher
in ASTMatchers. So, this change adds the matcher and adds support to
ASTImporter.
This was originally reviewed and approved in
https://reviews.llvm.org/D58292 and submitted as r354832. It was
reverted in r354839 due to failures on the Windows CI builds.
This version fixes the test failures on Windows, which were caused by
differences in template expansion between versions of clang on different
OSes. The version of clang built with MSVC and running on Windows never
expands the template in the C++ test in ImportExpr.ImportChooseExpr in
clang/unittests/AST/ASTImporter.cpp, but the version on Linux does for
the empty arguments and -fms-compatibility.
So, this version of the patch drops the C++ test for
__builtin_choose_expr, since that version was written to catch
regressions of the logic for isConditionTrue() in the AST import code
for ChooseExpr, and those regressions are also caught by
ASTImporterOptionSpecificTestBase.ImportChooseExpr, which does work on
Windows.
Reviewers: shafik, a_sidorin, martong, aaron.ballman, rnk, a.sidorin
Subscribers: cfe-commits, jdoerfert, rnkovacs, aaron.ballman
Tags: #clang
Differential Revision: https://reviews.llvm.org/D58663
llvm-svn: 354916
2019-02-27 03:26:41 +08:00
|
|
|
REGISTER_MATCHER(chooseExpr);
|
2013-06-04 23:46:22 +08:00
|
|
|
REGISTER_MATCHER(classTemplateDecl);
|
|
|
|
REGISTER_MATCHER(classTemplateSpecializationDecl);
|
|
|
|
REGISTER_MATCHER(complexType);
|
|
|
|
REGISTER_MATCHER(compoundLiteralExpr);
|
2013-05-14 17:13:00 +08:00
|
|
|
REGISTER_MATCHER(compoundStmt);
|
|
|
|
REGISTER_MATCHER(conditionalOperator);
|
2013-06-04 23:46:22 +08:00
|
|
|
REGISTER_MATCHER(constantArrayType);
|
2018-11-09 08:41:36 +08:00
|
|
|
REGISTER_MATCHER(constantExpr);
|
2013-06-04 23:46:22 +08:00
|
|
|
REGISTER_MATCHER(containsDeclaration);
|
|
|
|
REGISTER_MATCHER(continueStmt);
|
2015-09-17 21:30:52 +08:00
|
|
|
REGISTER_MATCHER(cudaKernelCallExpr);
|
|
|
|
REGISTER_MATCHER(cxxBindTemporaryExpr);
|
|
|
|
REGISTER_MATCHER(cxxBoolLiteral);
|
|
|
|
REGISTER_MATCHER(cxxCatchStmt);
|
|
|
|
REGISTER_MATCHER(cxxConstCastExpr);
|
|
|
|
REGISTER_MATCHER(cxxConstructExpr);
|
|
|
|
REGISTER_MATCHER(cxxConstructorDecl);
|
|
|
|
REGISTER_MATCHER(cxxConversionDecl);
|
|
|
|
REGISTER_MATCHER(cxxCtorInitializer);
|
2019-06-20 02:27:56 +08:00
|
|
|
REGISTER_MATCHER(cxxDeductionGuideDecl);
|
2015-09-17 21:30:52 +08:00
|
|
|
REGISTER_MATCHER(cxxDefaultArgExpr);
|
|
|
|
REGISTER_MATCHER(cxxDeleteExpr);
|
2018-08-13 01:34:36 +08:00
|
|
|
REGISTER_MATCHER(cxxDependentScopeMemberExpr);
|
2015-09-17 21:30:52 +08:00
|
|
|
REGISTER_MATCHER(cxxDestructorDecl);
|
|
|
|
REGISTER_MATCHER(cxxDynamicCastExpr);
|
|
|
|
REGISTER_MATCHER(cxxForRangeStmt);
|
|
|
|
REGISTER_MATCHER(cxxFunctionalCastExpr);
|
|
|
|
REGISTER_MATCHER(cxxMemberCallExpr);
|
|
|
|
REGISTER_MATCHER(cxxMethodDecl);
|
|
|
|
REGISTER_MATCHER(cxxNewExpr);
|
|
|
|
REGISTER_MATCHER(cxxNullPtrLiteralExpr);
|
|
|
|
REGISTER_MATCHER(cxxOperatorCallExpr);
|
|
|
|
REGISTER_MATCHER(cxxRecordDecl);
|
|
|
|
REGISTER_MATCHER(cxxReinterpretCastExpr);
|
|
|
|
REGISTER_MATCHER(cxxStaticCastExpr);
|
2017-05-06 05:01:12 +08:00
|
|
|
REGISTER_MATCHER(cxxStdInitializerListExpr);
|
2015-09-17 21:30:52 +08:00
|
|
|
REGISTER_MATCHER(cxxTemporaryObjectExpr);
|
|
|
|
REGISTER_MATCHER(cxxThisExpr);
|
|
|
|
REGISTER_MATCHER(cxxThrowExpr);
|
|
|
|
REGISTER_MATCHER(cxxTryStmt);
|
|
|
|
REGISTER_MATCHER(cxxUnresolvedConstructExpr);
|
2015-10-13 05:46:07 +08:00
|
|
|
REGISTER_MATCHER(decayedType);
|
2013-06-04 23:46:22 +08:00
|
|
|
REGISTER_MATCHER(decl);
|
|
|
|
REGISTER_MATCHER(declCountIs);
|
2013-05-14 17:13:00 +08:00
|
|
|
REGISTER_MATCHER(declRefExpr);
|
|
|
|
REGISTER_MATCHER(declStmt);
|
2019-03-21 01:15:47 +08:00
|
|
|
REGISTER_MATCHER(declaratorDecl);
|
2018-10-04 04:52:45 +08:00
|
|
|
REGISTER_MATCHER(decltypeType);
|
2013-11-25 23:03:44 +08:00
|
|
|
REGISTER_MATCHER(defaultStmt);
|
2013-06-04 23:46:22 +08:00
|
|
|
REGISTER_MATCHER(dependentSizedArrayType);
|
Adding new AST matchers for: addrLabelExpr, atomicExpr, binaryConditionalOperator, designatedInitExpr, designatorCountIs, hasSyntacticForm, implicitValueInitExpr, labelDecl, opaqueValueExpr, parenListExpr, predefinedExpr, requiresZeroInitialization, and stmtExpr.
Patch by Aleksei Sidorin.
llvm-svn: 263027
2016-03-10 01:11:51 +08:00
|
|
|
REGISTER_MATCHER(designatedInitExpr);
|
|
|
|
REGISTER_MATCHER(designatorCountIs);
|
2013-05-14 17:13:00 +08:00
|
|
|
REGISTER_MATCHER(doStmt);
|
2013-08-29 02:42:04 +08:00
|
|
|
REGISTER_MATCHER(eachOf);
|
2013-06-04 23:46:22 +08:00
|
|
|
REGISTER_MATCHER(elaboratedType);
|
|
|
|
REGISTER_MATCHER(enumConstantDecl);
|
|
|
|
REGISTER_MATCHER(enumDecl);
|
2016-06-30 15:50:01 +08:00
|
|
|
REGISTER_MATCHER(enumType);
|
2013-11-25 23:03:44 +08:00
|
|
|
REGISTER_MATCHER(equalsBoundNode);
|
2014-10-09 21:06:22 +08:00
|
|
|
REGISTER_MATCHER(equalsIntegralValue);
|
2013-05-14 17:13:00 +08:00
|
|
|
REGISTER_MATCHER(explicitCastExpr);
|
|
|
|
REGISTER_MATCHER(expr);
|
2014-04-02 21:12:14 +08:00
|
|
|
REGISTER_MATCHER(exprWithCleanups);
|
2013-05-14 17:13:00 +08:00
|
|
|
REGISTER_MATCHER(fieldDecl);
|
2013-07-27 02:52:58 +08:00
|
|
|
REGISTER_MATCHER(floatLiteral);
|
2013-08-17 00:19:42 +08:00
|
|
|
REGISTER_MATCHER(forEach);
|
2016-01-18 19:20:09 +08:00
|
|
|
REGISTER_MATCHER(forEachArgumentWithParam);
|
2013-11-25 23:03:44 +08:00
|
|
|
REGISTER_MATCHER(forEachConstructorInitializer);
|
2013-08-17 00:19:42 +08:00
|
|
|
REGISTER_MATCHER(forEachDescendant);
|
2017-10-24 00:48:46 +08:00
|
|
|
REGISTER_MATCHER(forEachOverridden);
|
2013-11-25 23:03:44 +08:00
|
|
|
REGISTER_MATCHER(forEachSwitchCase);
|
2013-07-17 22:28:00 +08:00
|
|
|
REGISTER_MATCHER(forField);
|
2016-05-04 19:59:39 +08:00
|
|
|
REGISTER_MATCHER(forFunction);
|
2013-05-14 17:13:00 +08:00
|
|
|
REGISTER_MATCHER(forStmt);
|
2013-11-25 23:03:44 +08:00
|
|
|
REGISTER_MATCHER(friendDecl);
|
2013-05-14 17:13:00 +08:00
|
|
|
REGISTER_MATCHER(functionDecl);
|
2016-02-01 22:11:47 +08:00
|
|
|
REGISTER_MATCHER(functionProtoType);
|
2013-06-04 23:46:22 +08:00
|
|
|
REGISTER_MATCHER(functionTemplateDecl);
|
|
|
|
REGISTER_MATCHER(functionType);
|
2016-02-09 22:04:49 +08:00
|
|
|
REGISTER_MATCHER(gnuNullExpr);
|
2013-06-04 23:46:22 +08:00
|
|
|
REGISTER_MATCHER(gotoStmt);
|
2013-08-17 00:19:42 +08:00
|
|
|
REGISTER_MATCHER(has);
|
|
|
|
REGISTER_MATCHER(hasAncestor);
|
2013-06-21 23:51:31 +08:00
|
|
|
REGISTER_MATCHER(hasAnyArgument);
|
[ASTTypeTraits][ASTMatchers][OpenMP] OMPClause handling
Summary:
`OMPClause` is the base class, it is not descendant from **any**
other class, therefore for it to work with e.g.
`VariadicDynCastAllOfMatcher<>`, it needs to be handled here.
Reviewers: sbenza, bkramer, pcc, klimek, hokein, gribozavr, aaron.ballman, george.karpenkov
Reviewed By: gribozavr, aaron.ballman
Subscribers: guansong, jdoerfert, alexfh, ABataev, cfe-commits
Tags: #openmp, #clang
Differential Revision: https://reviews.llvm.org/D57112
llvm-svn: 356675
2019-03-21 23:33:24 +08:00
|
|
|
REGISTER_MATCHER(hasAnyClause);
|
2013-07-17 22:28:00 +08:00
|
|
|
REGISTER_MATCHER(hasAnyConstructorInitializer);
|
2016-08-09 23:07:52 +08:00
|
|
|
REGISTER_MATCHER(hasAnyDeclaration);
|
2016-02-23 05:13:02 +08:00
|
|
|
REGISTER_MATCHER(hasAnyName);
|
2013-05-14 17:13:00 +08:00
|
|
|
REGISTER_MATCHER(hasAnyParameter);
|
2018-10-04 04:52:45 +08:00
|
|
|
REGISTER_MATCHER(hasAnySelector);
|
2013-05-14 17:13:00 +08:00
|
|
|
REGISTER_MATCHER(hasAnySubstatement);
|
2013-07-17 23:11:30 +08:00
|
|
|
REGISTER_MATCHER(hasAnyTemplateArgument);
|
2013-06-04 23:46:22 +08:00
|
|
|
REGISTER_MATCHER(hasAnyUsingShadowDecl);
|
2013-06-21 23:51:31 +08:00
|
|
|
REGISTER_MATCHER(hasArgument);
|
2013-06-04 23:46:22 +08:00
|
|
|
REGISTER_MATCHER(hasArgumentOfType);
|
2017-11-23 20:43:20 +08:00
|
|
|
REGISTER_MATCHER(hasArraySize);
|
2014-08-25 19:23:50 +08:00
|
|
|
REGISTER_MATCHER(hasAttr);
|
2015-11-19 01:56:55 +08:00
|
|
|
REGISTER_MATCHER(hasAutomaticStorageDuration);
|
2013-06-04 23:46:22 +08:00
|
|
|
REGISTER_MATCHER(hasBase);
|
2016-07-07 02:25:16 +08:00
|
|
|
REGISTER_MATCHER(hasBitWidth);
|
2013-06-21 23:51:31 +08:00
|
|
|
REGISTER_MATCHER(hasBody);
|
2013-06-04 23:46:22 +08:00
|
|
|
REGISTER_MATCHER(hasCanonicalType);
|
2013-11-25 23:03:44 +08:00
|
|
|
REGISTER_MATCHER(hasCaseConstant);
|
2016-05-14 03:36:55 +08:00
|
|
|
REGISTER_MATCHER(hasCastKind);
|
2013-06-21 23:51:31 +08:00
|
|
|
REGISTER_MATCHER(hasCondition);
|
2013-05-14 17:13:00 +08:00
|
|
|
REGISTER_MATCHER(hasConditionVariableStatement);
|
2015-10-13 05:46:07 +08:00
|
|
|
REGISTER_MATCHER(hasDecayedType);
|
2014-10-09 21:06:22 +08:00
|
|
|
REGISTER_MATCHER(hasDeclContext);
|
2019-03-21 01:15:47 +08:00
|
|
|
REGISTER_MATCHER(hasDeclaration);
|
2013-07-16 03:25:06 +08:00
|
|
|
REGISTER_MATCHER(hasDeducedType);
|
2017-11-22 03:22:34 +08:00
|
|
|
REGISTER_MATCHER(hasDefaultArgument);
|
2017-11-30 05:21:51 +08:00
|
|
|
REGISTER_MATCHER(hasDefinition);
|
2013-08-17 00:19:42 +08:00
|
|
|
REGISTER_MATCHER(hasDescendant);
|
2013-05-14 17:13:00 +08:00
|
|
|
REGISTER_MATCHER(hasDestinationType);
|
2016-05-17 00:49:01 +08:00
|
|
|
REGISTER_MATCHER(hasDynamicExceptionSpec);
|
2013-05-14 17:13:00 +08:00
|
|
|
REGISTER_MATCHER(hasEitherOperand);
|
2013-07-16 03:25:06 +08:00
|
|
|
REGISTER_MATCHER(hasElementType);
|
2014-08-16 03:13:27 +08:00
|
|
|
REGISTER_MATCHER(hasElse);
|
2019-06-20 02:27:56 +08:00
|
|
|
REGISTER_MATCHER(hasExplicitSpecifier);
|
2016-08-17 21:10:42 +08:00
|
|
|
REGISTER_MATCHER(hasExternalFormalLinkage);
|
2013-05-14 17:13:00 +08:00
|
|
|
REGISTER_MATCHER(hasFalseExpression);
|
2014-06-06 02:22:14 +08:00
|
|
|
REGISTER_MATCHER(hasGlobalStorage);
|
2013-05-14 17:13:00 +08:00
|
|
|
REGISTER_MATCHER(hasImplicitDestinationType);
|
2016-12-24 21:35:14 +08:00
|
|
|
REGISTER_MATCHER(hasInClassInitializer);
|
2013-06-04 23:46:22 +08:00
|
|
|
REGISTER_MATCHER(hasIncrement);
|
|
|
|
REGISTER_MATCHER(hasIndex);
|
2019-01-07 22:14:36 +08:00
|
|
|
REGISTER_MATCHER(hasInit);
|
2013-05-14 17:13:00 +08:00
|
|
|
REGISTER_MATCHER(hasInitializer);
|
2015-03-12 23:48:15 +08:00
|
|
|
REGISTER_MATCHER(hasKeywordSelector);
|
2013-05-14 17:13:00 +08:00
|
|
|
REGISTER_MATCHER(hasLHS);
|
2013-06-04 23:46:22 +08:00
|
|
|
REGISTER_MATCHER(hasLocalQualifiers);
|
2014-06-06 02:22:14 +08:00
|
|
|
REGISTER_MATCHER(hasLocalStorage);
|
2013-06-04 23:46:22 +08:00
|
|
|
REGISTER_MATCHER(hasLoopInit);
|
2014-08-16 03:13:27 +08:00
|
|
|
REGISTER_MATCHER(hasLoopVariable);
|
2013-06-04 23:46:22 +08:00
|
|
|
REGISTER_MATCHER(hasMethod);
|
2013-05-14 17:13:00 +08:00
|
|
|
REGISTER_MATCHER(hasName);
|
2015-03-12 23:48:15 +08:00
|
|
|
REGISTER_MATCHER(hasNullSelector);
|
2013-05-14 17:13:00 +08:00
|
|
|
REGISTER_MATCHER(hasObjectExpression);
|
2013-06-21 23:51:31 +08:00
|
|
|
REGISTER_MATCHER(hasOperatorName);
|
|
|
|
REGISTER_MATCHER(hasOverloadedOperatorName);
|
2013-06-04 23:46:22 +08:00
|
|
|
REGISTER_MATCHER(hasParameter);
|
2013-08-17 00:19:42 +08:00
|
|
|
REGISTER_MATCHER(hasParent);
|
2013-06-04 23:46:22 +08:00
|
|
|
REGISTER_MATCHER(hasQualifier);
|
2019-03-21 01:15:47 +08:00
|
|
|
REGISTER_MATCHER(hasRHS);
|
2014-08-16 03:13:27 +08:00
|
|
|
REGISTER_MATCHER(hasRangeInit);
|
2018-07-17 04:22:12 +08:00
|
|
|
REGISTER_MATCHER(hasReceiver);
|
2015-03-12 23:48:15 +08:00
|
|
|
REGISTER_MATCHER(hasReceiverType);
|
2016-12-08 19:46:22 +08:00
|
|
|
REGISTER_MATCHER(hasReplacementType);
|
2016-03-22 19:03:03 +08:00
|
|
|
REGISTER_MATCHER(hasReturnValue);
|
2015-03-12 23:48:15 +08:00
|
|
|
REGISTER_MATCHER(hasSelector);
|
2013-06-04 23:46:22 +08:00
|
|
|
REGISTER_MATCHER(hasSingleDecl);
|
|
|
|
REGISTER_MATCHER(hasSize);
|
|
|
|
REGISTER_MATCHER(hasSizeExpr);
|
2013-05-14 17:13:00 +08:00
|
|
|
REGISTER_MATCHER(hasSourceExpression);
|
2018-10-04 04:52:51 +08:00
|
|
|
REGISTER_MATCHER(hasSpecializedTemplate);
|
2015-11-19 01:56:55 +08:00
|
|
|
REGISTER_MATCHER(hasStaticStorageDuration);
|
2019-03-21 23:33:35 +08:00
|
|
|
REGISTER_MATCHER(hasStructuredBlock);
|
Adding new AST matchers for: addrLabelExpr, atomicExpr, binaryConditionalOperator, designatedInitExpr, designatorCountIs, hasSyntacticForm, implicitValueInitExpr, labelDecl, opaqueValueExpr, parenListExpr, predefinedExpr, requiresZeroInitialization, and stmtExpr.
Patch by Aleksei Sidorin.
llvm-svn: 263027
2016-03-10 01:11:51 +08:00
|
|
|
REGISTER_MATCHER(hasSyntacticForm);
|
2013-06-04 23:46:22 +08:00
|
|
|
REGISTER_MATCHER(hasTargetDecl);
|
2013-07-17 23:11:30 +08:00
|
|
|
REGISTER_MATCHER(hasTemplateArgument);
|
2014-08-16 03:13:27 +08:00
|
|
|
REGISTER_MATCHER(hasThen);
|
2015-11-19 01:56:55 +08:00
|
|
|
REGISTER_MATCHER(hasThreadStorageDuration);
|
2018-01-23 06:45:23 +08:00
|
|
|
REGISTER_MATCHER(hasTrailingReturn);
|
2013-05-14 17:13:00 +08:00
|
|
|
REGISTER_MATCHER(hasTrueExpression);
|
2013-11-25 23:03:44 +08:00
|
|
|
REGISTER_MATCHER(hasTypeLoc);
|
2013-05-14 17:13:00 +08:00
|
|
|
REGISTER_MATCHER(hasUnaryOperand);
|
2015-03-12 23:48:15 +08:00
|
|
|
REGISTER_MATCHER(hasUnarySelector);
|
2016-08-09 23:07:52 +08:00
|
|
|
REGISTER_MATCHER(hasUnderlyingDecl);
|
2018-10-04 04:52:51 +08:00
|
|
|
REGISTER_MATCHER(hasUnderlyingType);
|
2016-12-01 23:45:06 +08:00
|
|
|
REGISTER_MATCHER(hasUnqualifiedDesugaredType);
|
2013-07-16 03:25:06 +08:00
|
|
|
REGISTER_MATCHER(hasValueType);
|
2013-05-14 17:13:00 +08:00
|
|
|
REGISTER_MATCHER(ifStmt);
|
2019-06-13 21:48:24 +08:00
|
|
|
REGISTER_MATCHER(ignoringElidableConstructorCall);
|
2013-06-04 23:46:22 +08:00
|
|
|
REGISTER_MATCHER(ignoringImpCasts);
|
2018-10-04 04:52:45 +08:00
|
|
|
REGISTER_MATCHER(ignoringImplicit);
|
2013-06-04 23:46:22 +08:00
|
|
|
REGISTER_MATCHER(ignoringParenCasts);
|
|
|
|
REGISTER_MATCHER(ignoringParenImpCasts);
|
2018-10-09 16:44:28 +08:00
|
|
|
REGISTER_MATCHER(imaginaryLiteral);
|
2013-05-14 17:13:00 +08:00
|
|
|
REGISTER_MATCHER(implicitCastExpr);
|
Adding new AST matchers for: addrLabelExpr, atomicExpr, binaryConditionalOperator, designatedInitExpr, designatorCountIs, hasSyntacticForm, implicitValueInitExpr, labelDecl, opaqueValueExpr, parenListExpr, predefinedExpr, requiresZeroInitialization, and stmtExpr.
Patch by Aleksei Sidorin.
llvm-svn: 263027
2016-03-10 01:11:51 +08:00
|
|
|
REGISTER_MATCHER(implicitValueInitExpr);
|
2013-06-04 23:46:22 +08:00
|
|
|
REGISTER_MATCHER(incompleteArrayType);
|
2019-03-21 01:15:47 +08:00
|
|
|
REGISTER_MATCHER(indirectFieldDecl);
|
2013-06-04 23:46:22 +08:00
|
|
|
REGISTER_MATCHER(initListExpr);
|
2015-09-11 19:51:24 +08:00
|
|
|
REGISTER_MATCHER(injectedClassNameType);
|
2013-07-16 03:25:06 +08:00
|
|
|
REGISTER_MATCHER(innerType);
|
2013-05-14 17:13:00 +08:00
|
|
|
REGISTER_MATCHER(integerLiteral);
|
[ASTTypeTraits][ASTMatchers][OpenMP] OMPClause handling
Summary:
`OMPClause` is the base class, it is not descendant from **any**
other class, therefore for it to work with e.g.
`VariadicDynCastAllOfMatcher<>`, it needs to be handled here.
Reviewers: sbenza, bkramer, pcc, klimek, hokein, gribozavr, aaron.ballman, george.karpenkov
Reviewed By: gribozavr, aaron.ballman
Subscribers: guansong, jdoerfert, alexfh, ABataev, cfe-commits
Tags: #openmp, #clang
Differential Revision: https://reviews.llvm.org/D57112
llvm-svn: 356675
2019-03-21 23:33:24 +08:00
|
|
|
REGISTER_MATCHER(isAllowedToContainClauseKind);
|
2015-08-19 03:55:20 +08:00
|
|
|
REGISTER_MATCHER(isAnonymous);
|
2016-02-15 12:00:39 +08:00
|
|
|
REGISTER_MATCHER(isAnyCharacter);
|
|
|
|
REGISTER_MATCHER(isAnyPointer);
|
2017-11-23 20:43:20 +08:00
|
|
|
REGISTER_MATCHER(isArray);
|
2013-05-14 17:13:00 +08:00
|
|
|
REGISTER_MATCHER(isArrow);
|
2018-03-27 20:11:46 +08:00
|
|
|
REGISTER_MATCHER(isAssignmentOperator);
|
2015-08-05 20:11:30 +08:00
|
|
|
REGISTER_MATCHER(isBaseInitializer);
|
2016-07-07 02:25:16 +08:00
|
|
|
REGISTER_MATCHER(isBitField);
|
2015-07-02 20:53:22 +08:00
|
|
|
REGISTER_MATCHER(isCatchAll);
|
2015-09-17 21:30:52 +08:00
|
|
|
REGISTER_MATCHER(isClass);
|
2019-04-23 01:54:11 +08:00
|
|
|
REGISTER_MATCHER(isClassMessage);
|
|
|
|
REGISTER_MATCHER(isClassMethod);
|
2013-11-25 23:03:44 +08:00
|
|
|
REGISTER_MATCHER(isConst);
|
2013-05-14 17:13:00 +08:00
|
|
|
REGISTER_MATCHER(isConstQualified);
|
2019-03-21 01:15:47 +08:00
|
|
|
REGISTER_MATCHER(isConstexpr);
|
2016-01-21 04:47:58 +08:00
|
|
|
REGISTER_MATCHER(isCopyAssignmentOperator);
|
2015-08-05 20:11:30 +08:00
|
|
|
REGISTER_MATCHER(isCopyConstructor);
|
|
|
|
REGISTER_MATCHER(isDefaultConstructor);
|
2016-01-19 04:37:44 +08:00
|
|
|
REGISTER_MATCHER(isDefaulted);
|
2013-06-21 23:51:31 +08:00
|
|
|
REGISTER_MATCHER(isDefinition);
|
2018-10-04 04:52:51 +08:00
|
|
|
REGISTER_MATCHER(isDelegatingConstructor);
|
2019-03-21 01:15:47 +08:00
|
|
|
REGISTER_MATCHER(isDeleted);
|
2015-07-16 01:11:21 +08:00
|
|
|
REGISTER_MATCHER(isExceptionVariable);
|
2018-10-04 04:52:45 +08:00
|
|
|
REGISTER_MATCHER(isExpansionInFileMatching);
|
|
|
|
REGISTER_MATCHER(isExpansionInMainFile);
|
|
|
|
REGISTER_MATCHER(isExpansionInSystemHeader);
|
2015-08-12 05:09:52 +08:00
|
|
|
REGISTER_MATCHER(isExplicit);
|
2013-06-21 23:51:31 +08:00
|
|
|
REGISTER_MATCHER(isExplicitTemplateSpecialization);
|
2014-02-21 03:18:03 +08:00
|
|
|
REGISTER_MATCHER(isExpr);
|
2013-06-04 23:46:22 +08:00
|
|
|
REGISTER_MATCHER(isExternC);
|
2015-07-24 20:35:41 +08:00
|
|
|
REGISTER_MATCHER(isFinal);
|
2013-05-14 17:13:00 +08:00
|
|
|
REGISTER_MATCHER(isImplicit);
|
2019-05-03 20:50:00 +08:00
|
|
|
REGISTER_MATCHER(isInStdNamespace);
|
2019-03-21 01:15:47 +08:00
|
|
|
REGISTER_MATCHER(isInTemplateInstantiation);
|
2018-10-04 04:52:45 +08:00
|
|
|
REGISTER_MATCHER(isInline);
|
2018-07-17 04:22:12 +08:00
|
|
|
REGISTER_MATCHER(isInstanceMessage);
|
2019-04-23 01:54:11 +08:00
|
|
|
REGISTER_MATCHER(isInstanceMethod);
|
2014-09-03 20:08:14 +08:00
|
|
|
REGISTER_MATCHER(isInstantiated);
|
2018-10-04 04:52:45 +08:00
|
|
|
REGISTER_MATCHER(isInstantiationDependent);
|
2013-06-04 23:46:22 +08:00
|
|
|
REGISTER_MATCHER(isInteger);
|
2014-10-09 21:06:22 +08:00
|
|
|
REGISTER_MATCHER(isIntegral);
|
2016-06-28 22:08:56 +08:00
|
|
|
REGISTER_MATCHER(isLambda);
|
2014-02-07 05:52:24 +08:00
|
|
|
REGISTER_MATCHER(isListInitialization);
|
2018-07-24 06:29:35 +08:00
|
|
|
REGISTER_MATCHER(isMain);
|
2015-08-12 04:42:00 +08:00
|
|
|
REGISTER_MATCHER(isMemberInitializer);
|
2016-01-23 06:37:09 +08:00
|
|
|
REGISTER_MATCHER(isMoveAssignmentOperator);
|
2015-08-05 20:11:30 +08:00
|
|
|
REGISTER_MATCHER(isMoveConstructor);
|
2018-01-18 03:40:55 +08:00
|
|
|
REGISTER_MATCHER(isNoReturn);
|
2015-12-02 23:23:59 +08:00
|
|
|
REGISTER_MATCHER(isNoThrow);
|
[ASTTypeTraits][ASTMatchers][OpenMP] OMPClause handling
Summary:
`OMPClause` is the base class, it is not descendant from **any**
other class, therefore for it to work with e.g.
`VariadicDynCastAllOfMatcher<>`, it needs to be handled here.
Reviewers: sbenza, bkramer, pcc, klimek, hokein, gribozavr, aaron.ballman, george.karpenkov
Reviewed By: gribozavr, aaron.ballman
Subscribers: guansong, jdoerfert, alexfh, ABataev, cfe-commits
Tags: #openmp, #clang
Differential Revision: https://reviews.llvm.org/D57112
llvm-svn: 356675
2019-03-21 23:33:24 +08:00
|
|
|
REGISTER_MATCHER(isNoneKind);
|
2019-03-21 23:33:35 +08:00
|
|
|
REGISTER_MATCHER(isOMPStructuredBlock);
|
2013-06-04 23:46:22 +08:00
|
|
|
REGISTER_MATCHER(isOverride);
|
|
|
|
REGISTER_MATCHER(isPrivate);
|
|
|
|
REGISTER_MATCHER(isProtected);
|
|
|
|
REGISTER_MATCHER(isPublic);
|
2014-08-16 03:13:27 +08:00
|
|
|
REGISTER_MATCHER(isPure);
|
2018-01-18 17:47:57 +08:00
|
|
|
REGISTER_MATCHER(isScoped);
|
[ASTTypeTraits][ASTMatchers][OpenMP] OMPClause handling
Summary:
`OMPClause` is the base class, it is not descendant from **any**
other class, therefore for it to work with e.g.
`VariadicDynCastAllOfMatcher<>`, it needs to be handled here.
Reviewers: sbenza, bkramer, pcc, klimek, hokein, gribozavr, aaron.ballman, george.karpenkov
Reviewed By: gribozavr, aaron.ballman
Subscribers: guansong, jdoerfert, alexfh, ABataev, cfe-commits
Tags: #openmp, #clang
Differential Revision: https://reviews.llvm.org/D57112
llvm-svn: 356675
2019-03-21 23:33:24 +08:00
|
|
|
REGISTER_MATCHER(isSharedKind);
|
2016-07-12 14:36:00 +08:00
|
|
|
REGISTER_MATCHER(isSignedInteger);
|
2019-03-21 23:33:35 +08:00
|
|
|
REGISTER_MATCHER(isStandaloneDirective);
|
2018-10-29 21:47:56 +08:00
|
|
|
REGISTER_MATCHER(isStaticLocal);
|
2017-04-15 20:53:20 +08:00
|
|
|
REGISTER_MATCHER(isStaticStorageClass);
|
2015-09-17 21:30:52 +08:00
|
|
|
REGISTER_MATCHER(isStruct);
|
2013-06-21 23:51:31 +08:00
|
|
|
REGISTER_MATCHER(isTemplateInstantiation);
|
2018-09-12 00:09:19 +08:00
|
|
|
REGISTER_MATCHER(isTypeDependent);
|
2015-09-17 21:30:52 +08:00
|
|
|
REGISTER_MATCHER(isUnion);
|
2016-07-12 14:36:00 +08:00
|
|
|
REGISTER_MATCHER(isUnsignedInteger);
|
2018-10-04 04:52:51 +08:00
|
|
|
REGISTER_MATCHER(isUserProvided);
|
2018-09-12 00:09:19 +08:00
|
|
|
REGISTER_MATCHER(isValueDependent);
|
2015-10-05 22:41:27 +08:00
|
|
|
REGISTER_MATCHER(isVariadic);
|
2013-06-04 23:46:22 +08:00
|
|
|
REGISTER_MATCHER(isVirtual);
|
2016-01-22 01:56:24 +08:00
|
|
|
REGISTER_MATCHER(isVirtualAsWritten);
|
2015-11-24 01:09:24 +08:00
|
|
|
REGISTER_MATCHER(isVolatileQualified);
|
2013-07-17 22:28:00 +08:00
|
|
|
REGISTER_MATCHER(isWritten);
|
2019-03-21 01:15:47 +08:00
|
|
|
REGISTER_MATCHER(lValueReferenceType);
|
Adding new AST matchers for: addrLabelExpr, atomicExpr, binaryConditionalOperator, designatedInitExpr, designatorCountIs, hasSyntacticForm, implicitValueInitExpr, labelDecl, opaqueValueExpr, parenListExpr, predefinedExpr, requiresZeroInitialization, and stmtExpr.
Patch by Aleksei Sidorin.
llvm-svn: 263027
2016-03-10 01:11:51 +08:00
|
|
|
REGISTER_MATCHER(labelDecl);
|
2013-06-04 23:46:22 +08:00
|
|
|
REGISTER_MATCHER(labelStmt);
|
|
|
|
REGISTER_MATCHER(lambdaExpr);
|
2017-09-01 05:18:27 +08:00
|
|
|
REGISTER_MATCHER(linkageSpecDecl);
|
2013-06-04 23:46:22 +08:00
|
|
|
REGISTER_MATCHER(matchesName);
|
2015-03-12 23:48:15 +08:00
|
|
|
REGISTER_MATCHER(matchesSelector);
|
2013-06-04 23:46:22 +08:00
|
|
|
REGISTER_MATCHER(materializeTemporaryExpr);
|
2013-05-14 17:13:00 +08:00
|
|
|
REGISTER_MATCHER(member);
|
|
|
|
REGISTER_MATCHER(memberExpr);
|
2013-06-04 23:46:22 +08:00
|
|
|
REGISTER_MATCHER(memberPointerType);
|
2013-05-14 17:13:00 +08:00
|
|
|
REGISTER_MATCHER(namedDecl);
|
2019-03-21 01:15:47 +08:00
|
|
|
REGISTER_MATCHER(namesType);
|
2015-08-29 03:39:21 +08:00
|
|
|
REGISTER_MATCHER(namespaceAliasDecl);
|
2013-06-04 23:46:22 +08:00
|
|
|
REGISTER_MATCHER(namespaceDecl);
|
|
|
|
REGISTER_MATCHER(nestedNameSpecifier);
|
|
|
|
REGISTER_MATCHER(nestedNameSpecifierLoc);
|
2018-10-04 04:52:51 +08:00
|
|
|
REGISTER_MATCHER(nonTypeTemplateParmDecl);
|
2016-02-17 05:02:23 +08:00
|
|
|
REGISTER_MATCHER(nullPointerConstant);
|
2013-06-04 23:46:22 +08:00
|
|
|
REGISTER_MATCHER(nullStmt);
|
2015-03-12 23:48:15 +08:00
|
|
|
REGISTER_MATCHER(numSelectorArgs);
|
2017-11-12 06:46:15 +08:00
|
|
|
REGISTER_MATCHER(objcCatchStmt);
|
2017-03-16 04:14:25 +08:00
|
|
|
REGISTER_MATCHER(objcCategoryDecl);
|
2017-10-26 23:53:37 +08:00
|
|
|
REGISTER_MATCHER(objcCategoryImplDecl);
|
2017-11-12 06:46:15 +08:00
|
|
|
REGISTER_MATCHER(objcFinallyStmt);
|
2017-09-11 05:00:15 +08:00
|
|
|
REGISTER_MATCHER(objcImplementationDecl);
|
2015-09-11 19:51:24 +08:00
|
|
|
REGISTER_MATCHER(objcInterfaceDecl);
|
2017-03-16 04:14:25 +08:00
|
|
|
REGISTER_MATCHER(objcIvarDecl);
|
2018-07-28 01:26:11 +08:00
|
|
|
REGISTER_MATCHER(objcIvarRefExpr);
|
2015-03-12 23:48:15 +08:00
|
|
|
REGISTER_MATCHER(objcMessageExpr);
|
2017-03-16 04:14:25 +08:00
|
|
|
REGISTER_MATCHER(objcMethodDecl);
|
2015-09-11 19:51:24 +08:00
|
|
|
REGISTER_MATCHER(objcObjectPointerType);
|
2017-03-16 04:14:25 +08:00
|
|
|
REGISTER_MATCHER(objcPropertyDecl);
|
|
|
|
REGISTER_MATCHER(objcProtocolDecl);
|
2017-11-12 06:46:15 +08:00
|
|
|
REGISTER_MATCHER(objcThrowStmt);
|
|
|
|
REGISTER_MATCHER(objcTryStmt);
|
2018-10-04 04:52:45 +08:00
|
|
|
REGISTER_MATCHER(ofClass);
|
[ASTTypeTraits][ASTMatchers][OpenMP] OMPClause handling
Summary:
`OMPClause` is the base class, it is not descendant from **any**
other class, therefore for it to work with e.g.
`VariadicDynCastAllOfMatcher<>`, it needs to be handled here.
Reviewers: sbenza, bkramer, pcc, klimek, hokein, gribozavr, aaron.ballman, george.karpenkov
Reviewed By: gribozavr, aaron.ballman
Subscribers: guansong, jdoerfert, alexfh, ABataev, cfe-commits
Tags: #openmp, #clang
Differential Revision: https://reviews.llvm.org/D57112
llvm-svn: 356675
2019-03-21 23:33:24 +08:00
|
|
|
REGISTER_MATCHER(ompDefaultClause);
|
2019-03-21 23:33:10 +08:00
|
|
|
REGISTER_MATCHER(ompExecutableDirective);
|
2013-05-14 17:13:00 +08:00
|
|
|
REGISTER_MATCHER(on);
|
|
|
|
REGISTER_MATCHER(onImplicitObjectArgument);
|
Adding new AST matchers for: addrLabelExpr, atomicExpr, binaryConditionalOperator, designatedInitExpr, designatorCountIs, hasSyntacticForm, implicitValueInitExpr, labelDecl, opaqueValueExpr, parenListExpr, predefinedExpr, requiresZeroInitialization, and stmtExpr.
Patch by Aleksei Sidorin.
llvm-svn: 263027
2016-03-10 01:11:51 +08:00
|
|
|
REGISTER_MATCHER(opaqueValueExpr);
|
2013-06-04 23:46:22 +08:00
|
|
|
REGISTER_MATCHER(parameterCountIs);
|
2016-01-21 00:17:39 +08:00
|
|
|
REGISTER_MATCHER(parenExpr);
|
Adding new AST matchers for: addrLabelExpr, atomicExpr, binaryConditionalOperator, designatedInitExpr, designatorCountIs, hasSyntacticForm, implicitValueInitExpr, labelDecl, opaqueValueExpr, parenListExpr, predefinedExpr, requiresZeroInitialization, and stmtExpr.
Patch by Aleksei Sidorin.
llvm-svn: 263027
2016-03-10 01:11:51 +08:00
|
|
|
REGISTER_MATCHER(parenListExpr);
|
2013-06-04 23:46:22 +08:00
|
|
|
REGISTER_MATCHER(parenType);
|
2013-11-25 23:03:44 +08:00
|
|
|
REGISTER_MATCHER(parmVarDecl);
|
2013-07-16 03:25:06 +08:00
|
|
|
REGISTER_MATCHER(pointee);
|
2013-06-04 23:46:22 +08:00
|
|
|
REGISTER_MATCHER(pointerType);
|
Adding new AST matchers for: addrLabelExpr, atomicExpr, binaryConditionalOperator, designatedInitExpr, designatorCountIs, hasSyntacticForm, implicitValueInitExpr, labelDecl, opaqueValueExpr, parenListExpr, predefinedExpr, requiresZeroInitialization, and stmtExpr.
Patch by Aleksei Sidorin.
llvm-svn: 263027
2016-03-10 01:11:51 +08:00
|
|
|
REGISTER_MATCHER(predefinedExpr);
|
2013-06-04 23:46:22 +08:00
|
|
|
REGISTER_MATCHER(qualType);
|
2019-03-21 01:15:47 +08:00
|
|
|
REGISTER_MATCHER(rValueReferenceType);
|
2016-02-19 00:36:01 +08:00
|
|
|
REGISTER_MATCHER(realFloatingPointType);
|
2013-05-14 17:13:00 +08:00
|
|
|
REGISTER_MATCHER(recordDecl);
|
2013-06-04 23:46:22 +08:00
|
|
|
REGISTER_MATCHER(recordType);
|
|
|
|
REGISTER_MATCHER(referenceType);
|
|
|
|
REGISTER_MATCHER(refersToDeclaration);
|
2014-10-09 21:06:22 +08:00
|
|
|
REGISTER_MATCHER(refersToIntegralType);
|
2018-10-04 04:52:51 +08:00
|
|
|
REGISTER_MATCHER(refersToTemplate);
|
2019-03-21 01:15:47 +08:00
|
|
|
REGISTER_MATCHER(refersToType);
|
Adding new AST matchers for: addrLabelExpr, atomicExpr, binaryConditionalOperator, designatedInitExpr, designatorCountIs, hasSyntacticForm, implicitValueInitExpr, labelDecl, opaqueValueExpr, parenListExpr, predefinedExpr, requiresZeroInitialization, and stmtExpr.
Patch by Aleksei Sidorin.
llvm-svn: 263027
2016-03-10 01:11:51 +08:00
|
|
|
REGISTER_MATCHER(requiresZeroInitialization);
|
2014-10-09 21:06:22 +08:00
|
|
|
REGISTER_MATCHER(returnStmt);
|
2019-03-21 01:15:47 +08:00
|
|
|
REGISTER_MATCHER(returns);
|
2013-06-04 23:46:22 +08:00
|
|
|
REGISTER_MATCHER(sizeOfExpr);
|
|
|
|
REGISTER_MATCHER(specifiesNamespace);
|
|
|
|
REGISTER_MATCHER(specifiesType);
|
|
|
|
REGISTER_MATCHER(specifiesTypeLoc);
|
|
|
|
REGISTER_MATCHER(statementCountIs);
|
2015-06-06 06:40:53 +08:00
|
|
|
REGISTER_MATCHER(staticAssertDecl);
|
2013-05-14 17:13:00 +08:00
|
|
|
REGISTER_MATCHER(stmt);
|
Adding new AST matchers for: addrLabelExpr, atomicExpr, binaryConditionalOperator, designatedInitExpr, designatorCountIs, hasSyntacticForm, implicitValueInitExpr, labelDecl, opaqueValueExpr, parenListExpr, predefinedExpr, requiresZeroInitialization, and stmtExpr.
Patch by Aleksei Sidorin.
llvm-svn: 263027
2016-03-10 01:11:51 +08:00
|
|
|
REGISTER_MATCHER(stmtExpr);
|
2013-05-14 17:13:00 +08:00
|
|
|
REGISTER_MATCHER(stringLiteral);
|
2014-08-16 03:13:27 +08:00
|
|
|
REGISTER_MATCHER(substNonTypeTemplateParmExpr);
|
2015-08-27 00:15:59 +08:00
|
|
|
REGISTER_MATCHER(substTemplateTypeParmType);
|
2013-05-14 17:13:00 +08:00
|
|
|
REGISTER_MATCHER(switchCase);
|
2013-06-04 23:46:22 +08:00
|
|
|
REGISTER_MATCHER(switchStmt);
|
2018-10-04 04:52:51 +08:00
|
|
|
REGISTER_MATCHER(tagType);
|
2014-10-09 21:06:22 +08:00
|
|
|
REGISTER_MATCHER(templateArgument);
|
|
|
|
REGISTER_MATCHER(templateArgumentCountIs);
|
2018-10-04 04:52:45 +08:00
|
|
|
REGISTER_MATCHER(templateName);
|
2013-06-04 23:46:22 +08:00
|
|
|
REGISTER_MATCHER(templateSpecializationType);
|
2016-08-12 21:51:00 +08:00
|
|
|
REGISTER_MATCHER(templateTypeParmDecl);
|
2015-09-11 19:51:24 +08:00
|
|
|
REGISTER_MATCHER(templateTypeParmType);
|
2013-06-04 23:46:22 +08:00
|
|
|
REGISTER_MATCHER(throughUsingDecl);
|
2013-05-14 17:13:00 +08:00
|
|
|
REGISTER_MATCHER(to);
|
2015-02-10 22:46:45 +08:00
|
|
|
REGISTER_MATCHER(translationUnitDecl);
|
2013-06-04 23:46:22 +08:00
|
|
|
REGISTER_MATCHER(type);
|
2018-10-04 04:52:45 +08:00
|
|
|
REGISTER_MATCHER(typeAliasDecl);
|
|
|
|
REGISTER_MATCHER(typeAliasTemplateDecl);
|
2019-03-21 01:15:47 +08:00
|
|
|
REGISTER_MATCHER(typeLoc);
|
2014-11-26 01:01:06 +08:00
|
|
|
REGISTER_MATCHER(typedefDecl);
|
2016-04-15 00:05:45 +08:00
|
|
|
REGISTER_MATCHER(typedefNameDecl);
|
2013-06-04 23:46:22 +08:00
|
|
|
REGISTER_MATCHER(typedefType);
|
|
|
|
REGISTER_MATCHER(unaryExprOrTypeTraitExpr);
|
2013-05-14 17:13:00 +08:00
|
|
|
REGISTER_MATCHER(unaryOperator);
|
2013-11-25 23:03:44 +08:00
|
|
|
REGISTER_MATCHER(unaryTransformType);
|
2013-11-22 22:41:48 +08:00
|
|
|
REGISTER_MATCHER(unless);
|
2016-05-18 20:53:59 +08:00
|
|
|
REGISTER_MATCHER(unresolvedLookupExpr);
|
2018-08-13 01:34:36 +08:00
|
|
|
REGISTER_MATCHER(unresolvedMemberExpr);
|
2015-09-11 19:51:24 +08:00
|
|
|
REGISTER_MATCHER(unresolvedUsingTypenameDecl);
|
2013-11-25 23:03:44 +08:00
|
|
|
REGISTER_MATCHER(unresolvedUsingValueDecl);
|
2013-06-04 23:46:22 +08:00
|
|
|
REGISTER_MATCHER(userDefinedLiteral);
|
[AST] Store "UsesADL" information in CallExpr.
Summary:
Currently the Clang AST doesn't store information about how the callee of a CallExpr was found. Specifically if it was found using ADL.
However, this information is invaluable to tooling. Consider a tool which renames usages of a function. If the originally CallExpr was formed using ADL, then the tooling may need to additionally qualify the replacement.
Without information about how the callee was found, the tooling is left scratching it's head. Additionally, we want to be able to match ADL calls as quickly as possible, which means avoiding computing the answer on the fly.
This patch changes `CallExpr` to store whether it's callee was found using ADL. It does not change the size of any AST nodes.
Reviewers: fowles, rsmith, klimek, shafik
Reviewed By: rsmith
Subscribers: aaron.ballman, riccibruno, calabrese, titus, cfe-commits
Differential Revision: https://reviews.llvm.org/D55534
llvm-svn: 348977
2018-12-13 05:50:55 +08:00
|
|
|
REGISTER_MATCHER(usesADL);
|
2013-06-04 23:46:22 +08:00
|
|
|
REGISTER_MATCHER(usingDecl);
|
2014-08-16 03:13:27 +08:00
|
|
|
REGISTER_MATCHER(usingDirectiveDecl);
|
2014-10-28 21:33:58 +08:00
|
|
|
REGISTER_MATCHER(valueDecl);
|
2013-05-14 17:13:00 +08:00
|
|
|
REGISTER_MATCHER(varDecl);
|
2013-06-04 23:46:22 +08:00
|
|
|
REGISTER_MATCHER(variableArrayType);
|
2014-12-15 23:09:22 +08:00
|
|
|
REGISTER_MATCHER(voidType);
|
2013-05-14 17:13:00 +08:00
|
|
|
REGISTER_MATCHER(whileStmt);
|
2013-07-17 22:28:00 +08:00
|
|
|
REGISTER_MATCHER(withInitializer);
|
2013-05-14 17:13:00 +08:00
|
|
|
}
|
|
|
|
|
2017-11-02 07:09:49 +08:00
|
|
|
RegistryMaps::~RegistryMaps() = default;
|
2013-05-14 17:13:00 +08:00
|
|
|
|
|
|
|
static llvm::ManagedStatic<RegistryMaps> RegistryData;
|
|
|
|
|
|
|
|
// static
|
2014-04-14 21:51:21 +08:00
|
|
|
llvm::Optional<MatcherCtor> Registry::lookupMatcherCtor(StringRef MatcherName) {
|
2016-10-11 00:26:40 +08:00
|
|
|
auto it = RegistryData->constructors().find(MatcherName);
|
2014-04-14 21:51:21 +08:00
|
|
|
return it == RegistryData->constructors().end()
|
|
|
|
? llvm::Optional<MatcherCtor>()
|
2016-10-11 00:26:40 +08:00
|
|
|
: it->second.get();
|
2013-11-23 09:13:16 +08:00
|
|
|
}
|
|
|
|
|
2017-11-02 07:09:49 +08:00
|
|
|
static llvm::raw_ostream &operator<<(llvm::raw_ostream &OS,
|
|
|
|
const std::set<ASTNodeKind> &KS) {
|
2014-01-24 06:48:38 +08:00
|
|
|
unsigned Count = 0;
|
|
|
|
for (std::set<ASTNodeKind>::const_iterator I = KS.begin(), E = KS.end();
|
|
|
|
I != E; ++I) {
|
|
|
|
if (I != KS.begin())
|
|
|
|
OS << "|";
|
|
|
|
if (Count++ == 3) {
|
|
|
|
OS << "...";
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
OS << *I;
|
|
|
|
}
|
|
|
|
return OS;
|
|
|
|
}
|
|
|
|
|
2014-08-13 05:11:37 +08:00
|
|
|
std::vector<ArgKind> Registry::getAcceptedCompletionTypes(
|
|
|
|
ArrayRef<std::pair<MatcherCtor, unsigned>> Context) {
|
2014-01-24 06:48:38 +08:00
|
|
|
ASTNodeKind InitialTypes[] = {
|
2014-08-13 05:11:37 +08:00
|
|
|
ASTNodeKind::getFromNodeKind<Decl>(),
|
|
|
|
ASTNodeKind::getFromNodeKind<QualType>(),
|
|
|
|
ASTNodeKind::getFromNodeKind<Type>(),
|
|
|
|
ASTNodeKind::getFromNodeKind<Stmt>(),
|
|
|
|
ASTNodeKind::getFromNodeKind<NestedNameSpecifier>(),
|
|
|
|
ASTNodeKind::getFromNodeKind<NestedNameSpecifierLoc>(),
|
|
|
|
ASTNodeKind::getFromNodeKind<TypeLoc>()};
|
2014-01-24 06:48:38 +08:00
|
|
|
|
|
|
|
// Starting with the above seed of acceptable top-level matcher types, compute
|
|
|
|
// the acceptable type set for the argument indicated by each context element.
|
2014-08-13 05:11:37 +08:00
|
|
|
std::set<ArgKind> TypeSet(std::begin(InitialTypes), std::end(InitialTypes));
|
|
|
|
for (const auto &CtxEntry : Context) {
|
|
|
|
MatcherCtor Ctor = CtxEntry.first;
|
|
|
|
unsigned ArgNumber = CtxEntry.second;
|
|
|
|
std::vector<ArgKind> NextTypeSet;
|
|
|
|
for (const ArgKind &Kind : TypeSet) {
|
|
|
|
if (Kind.getArgKind() == Kind.AK_Matcher &&
|
|
|
|
Ctor->isConvertibleTo(Kind.getMatcherKind()) &&
|
|
|
|
(Ctor->isVariadic() || ArgNumber < Ctor->getNumArgs()))
|
|
|
|
Ctor->getArgKinds(Kind.getMatcherKind(), ArgNumber, NextTypeSet);
|
2014-01-24 06:48:38 +08:00
|
|
|
}
|
|
|
|
TypeSet.clear();
|
2014-08-13 05:11:37 +08:00
|
|
|
TypeSet.insert(NextTypeSet.begin(), NextTypeSet.end());
|
2014-01-24 06:48:38 +08:00
|
|
|
}
|
2014-08-13 05:11:37 +08:00
|
|
|
return std::vector<ArgKind>(TypeSet.begin(), TypeSet.end());
|
|
|
|
}
|
2014-01-24 06:48:38 +08:00
|
|
|
|
2014-08-13 05:11:37 +08:00
|
|
|
std::vector<MatcherCompletion>
|
|
|
|
Registry::getMatcherCompletions(ArrayRef<ArgKind> AcceptedTypes) {
|
|
|
|
std::vector<MatcherCompletion> Completions;
|
2014-01-24 06:48:38 +08:00
|
|
|
|
2014-08-13 05:11:37 +08:00
|
|
|
// Search the registry for acceptable matchers.
|
2015-08-13 03:00:39 +08:00
|
|
|
for (const auto &M : RegistryData->constructors()) {
|
2016-10-11 00:26:40 +08:00
|
|
|
const MatcherDescriptor& Matcher = *M.getValue();
|
2015-08-13 03:00:39 +08:00
|
|
|
StringRef Name = M.getKey();
|
|
|
|
|
2014-01-24 06:48:38 +08:00
|
|
|
std::set<ASTNodeKind> RetKinds;
|
2016-10-11 00:26:40 +08:00
|
|
|
unsigned NumArgs = Matcher.isVariadic() ? 1 : Matcher.getNumArgs();
|
|
|
|
bool IsPolymorphic = Matcher.isPolymorphic();
|
2014-08-13 05:11:37 +08:00
|
|
|
std::vector<std::vector<ArgKind>> ArgsKinds(NumArgs);
|
2014-01-24 06:48:38 +08:00
|
|
|
unsigned MaxSpecificity = 0;
|
2014-08-13 05:11:37 +08:00
|
|
|
for (const ArgKind& Kind : AcceptedTypes) {
|
|
|
|
if (Kind.getArgKind() != Kind.AK_Matcher)
|
|
|
|
continue;
|
2014-01-24 06:48:38 +08:00
|
|
|
unsigned Specificity;
|
|
|
|
ASTNodeKind LeastDerivedKind;
|
2016-10-11 00:26:40 +08:00
|
|
|
if (Matcher.isConvertibleTo(Kind.getMatcherKind(), &Specificity,
|
|
|
|
&LeastDerivedKind)) {
|
2014-01-24 06:48:38 +08:00
|
|
|
if (MaxSpecificity < Specificity)
|
|
|
|
MaxSpecificity = Specificity;
|
|
|
|
RetKinds.insert(LeastDerivedKind);
|
|
|
|
for (unsigned Arg = 0; Arg != NumArgs; ++Arg)
|
2016-10-11 00:26:40 +08:00
|
|
|
Matcher.getArgKinds(Kind.getMatcherKind(), Arg, ArgsKinds[Arg]);
|
2014-01-24 06:48:38 +08:00
|
|
|
if (IsPolymorphic)
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!RetKinds.empty() && MaxSpecificity > 0) {
|
|
|
|
std::string Decl;
|
|
|
|
llvm::raw_string_ostream OS(Decl);
|
|
|
|
|
|
|
|
if (IsPolymorphic) {
|
2015-08-13 03:00:39 +08:00
|
|
|
OS << "Matcher<T> " << Name << "(Matcher<T>";
|
2014-01-24 06:48:38 +08:00
|
|
|
} else {
|
2015-08-13 03:00:39 +08:00
|
|
|
OS << "Matcher<" << RetKinds << "> " << Name << "(";
|
2014-08-13 05:11:37 +08:00
|
|
|
for (const std::vector<ArgKind> &Arg : ArgsKinds) {
|
|
|
|
if (&Arg != &ArgsKinds[0])
|
2014-01-24 06:48:38 +08:00
|
|
|
OS << ", ";
|
2014-10-10 06:08:52 +08:00
|
|
|
|
|
|
|
bool FirstArgKind = true;
|
|
|
|
std::set<ASTNodeKind> MatcherKinds;
|
|
|
|
// Two steps. First all non-matchers, then matchers only.
|
|
|
|
for (const ArgKind &AK : Arg) {
|
|
|
|
if (AK.getArgKind() == ArgKind::AK_Matcher) {
|
|
|
|
MatcherKinds.insert(AK.getMatcherKind());
|
|
|
|
} else {
|
|
|
|
if (!FirstArgKind) OS << "|";
|
|
|
|
FirstArgKind = false;
|
|
|
|
OS << AK.asString();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!MatcherKinds.empty()) {
|
|
|
|
if (!FirstArgKind) OS << "|";
|
2014-01-24 06:48:38 +08:00
|
|
|
OS << "Matcher<" << MatcherKinds << ">";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2016-10-11 00:26:40 +08:00
|
|
|
if (Matcher.isVariadic())
|
2014-01-24 06:48:38 +08:00
|
|
|
OS << "...";
|
|
|
|
OS << ")";
|
|
|
|
|
2015-08-13 03:00:39 +08:00
|
|
|
std::string TypedText = Name;
|
2014-01-24 06:48:38 +08:00
|
|
|
TypedText += "(";
|
|
|
|
if (ArgsKinds.empty())
|
|
|
|
TypedText += ")";
|
2014-08-13 05:11:37 +08:00
|
|
|
else if (ArgsKinds[0][0].getArgKind() == ArgKind::AK_String)
|
2014-01-24 06:48:38 +08:00
|
|
|
TypedText += "\"";
|
|
|
|
|
2014-08-13 05:11:37 +08:00
|
|
|
Completions.emplace_back(TypedText, OS.str(), MaxSpecificity);
|
2014-01-24 06:48:38 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-08-13 05:11:37 +08:00
|
|
|
return Completions;
|
2014-01-24 06:48:38 +08:00
|
|
|
}
|
|
|
|
|
2013-11-23 09:13:16 +08:00
|
|
|
VariantMatcher Registry::constructMatcher(MatcherCtor Ctor,
|
2015-10-04 12:53:55 +08:00
|
|
|
SourceRange NameRange,
|
2013-11-23 09:13:16 +08:00
|
|
|
ArrayRef<ParserValue> Args,
|
|
|
|
Diagnostics *Error) {
|
2013-11-23 09:34:36 +08:00
|
|
|
return Ctor->create(NameRange, Args, Error);
|
2013-05-14 17:13:00 +08:00
|
|
|
}
|
|
|
|
|
2013-11-23 09:13:16 +08:00
|
|
|
VariantMatcher Registry::constructBoundMatcher(MatcherCtor Ctor,
|
2015-10-04 12:53:55 +08:00
|
|
|
SourceRange NameRange,
|
2013-08-13 22:54:51 +08:00
|
|
|
StringRef BindID,
|
|
|
|
ArrayRef<ParserValue> Args,
|
|
|
|
Diagnostics *Error) {
|
2013-11-23 09:13:16 +08:00
|
|
|
VariantMatcher Out = constructMatcher(Ctor, NameRange, Args, Error);
|
2013-08-13 22:54:51 +08:00
|
|
|
if (Out.isNull()) return Out;
|
|
|
|
|
2013-10-29 22:37:15 +08:00
|
|
|
llvm::Optional<DynTypedMatcher> Result = Out.getSingleMatcher();
|
|
|
|
if (Result.hasValue()) {
|
|
|
|
llvm::Optional<DynTypedMatcher> Bound = Result->tryBind(BindID);
|
|
|
|
if (Bound.hasValue()) {
|
2013-08-13 22:54:51 +08:00
|
|
|
return VariantMatcher::SingleMatcher(*Bound);
|
2013-06-21 23:51:31 +08:00
|
|
|
}
|
2013-06-04 03:31:08 +08:00
|
|
|
}
|
2013-07-19 03:47:59 +08:00
|
|
|
Error->addError(NameRange, Error->ET_RegistryNotBindable);
|
2013-08-13 22:54:51 +08:00
|
|
|
return VariantMatcher();
|
2013-06-04 03:31:08 +08:00
|
|
|
}
|
|
|
|
|
2017-11-02 07:09:49 +08:00
|
|
|
} // namespace dynamic
|
|
|
|
} // namespace ast_matchers
|
|
|
|
} // namespace clang
|