forked from OSchip/llvm-project
Add some matchers for basic AST nodes.
Patch by Gábor Horváth. Review: http://llvm-reviews.chandlerc.com/D45 llvm-svn: 164304
This commit is contained in:
parent
8a52676b85
commit
87c3d369f1
|
@ -716,6 +716,68 @@ const internal::VariadicDynCastAllOfMatcher<Stmt, WhileStmt> whileStmt;
|
|||
/// matches 'do {} while(true)'
|
||||
const internal::VariadicDynCastAllOfMatcher<Stmt, DoStmt> doStmt;
|
||||
|
||||
/// \brief Matches break statements.
|
||||
///
|
||||
/// Given
|
||||
/// \code
|
||||
/// while (true) { break; }
|
||||
/// \endcode
|
||||
/// breakStmt()
|
||||
/// matches 'break'
|
||||
const internal::VariadicDynCastAllOfMatcher<Stmt, BreakStmt> breakStmt;
|
||||
|
||||
/// \brief Matches continue statements.
|
||||
///
|
||||
/// Given
|
||||
/// \code
|
||||
/// while (true) { continue; }
|
||||
/// \endcode
|
||||
/// continueStmt()
|
||||
/// matches 'continue'
|
||||
const internal::VariadicDynCastAllOfMatcher<Stmt, ContinueStmt> continueStmt;
|
||||
|
||||
/// \brief Matches return statements.
|
||||
///
|
||||
/// Given
|
||||
/// \code
|
||||
/// return 1;
|
||||
/// \endcode
|
||||
/// returnStmt()
|
||||
/// matches 'return 1'
|
||||
const internal::VariadicDynCastAllOfMatcher<Stmt, ReturnStmt> returnStmt;
|
||||
|
||||
/// \brief Matches goto statements.
|
||||
///
|
||||
/// Given
|
||||
/// \code
|
||||
/// goto FOO;
|
||||
/// FOO: bar();
|
||||
/// \endcode
|
||||
/// gotoStmt()
|
||||
/// matches 'goto FOO'
|
||||
const internal::VariadicDynCastAllOfMatcher<Stmt, GotoStmt> gotoStmt;
|
||||
|
||||
/// \brief Matches label statements.
|
||||
///
|
||||
/// Given
|
||||
/// \code
|
||||
/// goto FOO;
|
||||
/// FOO: bar();
|
||||
/// \endcode
|
||||
/// labelStmt()
|
||||
/// matches 'FOO:'
|
||||
const internal::VariadicDynCastAllOfMatcher<Stmt, LabelStmt> labelStmt;
|
||||
|
||||
/// \brief Matches switch statements.
|
||||
///
|
||||
/// Given
|
||||
/// \code
|
||||
/// switch(a) { case 42: break; default: break; }
|
||||
/// \endcode
|
||||
/// switchStmt()
|
||||
/// matches 'switch(a)'.
|
||||
const internal::VariadicDynCastAllOfMatcher<Stmt, SwitchStmt> switchStmt;
|
||||
|
||||
/// \brief Matches case and default statements inside switch statements.
|
||||
///
|
||||
/// Given
|
||||
|
@ -734,6 +796,52 @@ const internal::VariadicDynCastAllOfMatcher<Stmt, SwitchCase> switchCase;
|
|||
/// \endcode
|
||||
const internal::VariadicDynCastAllOfMatcher<Stmt, CompoundStmt> compoundStmt;
|
||||
|
||||
/// \brief Matches catch statements.
|
||||
///
|
||||
/// \code
|
||||
/// try {} catch(int i) {}
|
||||
/// \endcode
|
||||
/// catchStmt()
|
||||
/// matches 'catch(int i)'
|
||||
const internal::VariadicDynCastAllOfMatcher<Stmt, CXXCatchStmt> catchStmt;
|
||||
|
||||
/// \brief Matches try statements.
|
||||
///
|
||||
/// \code
|
||||
/// try {} catch(int i) {}
|
||||
/// \endcode
|
||||
/// tryStmt()
|
||||
/// matches 'try {}'
|
||||
const internal::VariadicDynCastAllOfMatcher<Stmt, CXXTryStmt> tryStmt;
|
||||
|
||||
/// \brief Matches throw expressions.
|
||||
///
|
||||
/// \code
|
||||
/// try { throw 5; } catch(int i) {}
|
||||
/// \endcode
|
||||
/// throwExpr()
|
||||
/// matches 'throw 5'
|
||||
const internal::VariadicDynCastAllOfMatcher<Stmt, CXXThrowExpr> throwExpr;
|
||||
|
||||
/// \brief Matches null statements.
|
||||
///
|
||||
/// \code
|
||||
/// foo();;
|
||||
/// \endcode
|
||||
/// nullStmt()
|
||||
/// matches the second ';'
|
||||
const internal::VariadicDynCastAllOfMatcher<Stmt, NullStmt> nullStmt;
|
||||
|
||||
/// \brief Matches asm statements.
|
||||
///
|
||||
/// \code
|
||||
/// int i = 100;
|
||||
/// __asm("mov al, 2");
|
||||
/// \endcode
|
||||
/// asmStmt()
|
||||
/// matches '__asm("mov al, 2")'
|
||||
const internal::VariadicDynCastAllOfMatcher<Stmt, AsmStmt> asmStmt;
|
||||
|
||||
/// \brief Matches bool literals.
|
||||
///
|
||||
/// Example matches true
|
||||
|
|
|
@ -39,6 +39,7 @@
|
|||
#include "clang/AST/DeclCXX.h"
|
||||
#include "clang/AST/ExprCXX.h"
|
||||
#include "clang/AST/Stmt.h"
|
||||
#include "clang/AST/StmtCXX.h"
|
||||
#include "clang/AST/Type.h"
|
||||
#include "clang/ASTMatchers/ASTTypeTraits.h"
|
||||
#include "llvm/ADT/VariadicFunction.h"
|
||||
|
|
|
@ -805,6 +805,15 @@ TEST(Matcher, Call) {
|
|||
MethodOnYPointer));
|
||||
}
|
||||
|
||||
TEST(Matcher, FlowControl) {
|
||||
EXPECT_TRUE(matches("void f() { while(true) { break; } }", breakStmt()));
|
||||
EXPECT_TRUE(matches("void f() { while(true) { continue; } }",
|
||||
continueStmt()));
|
||||
EXPECT_TRUE(matches("void f() { goto FOO; FOO: ;}", gotoStmt()));
|
||||
EXPECT_TRUE(matches("void f() { goto FOO; FOO: ;}", labelStmt()));
|
||||
EXPECT_TRUE(matches("void f() { return; }", returnStmt()));
|
||||
}
|
||||
|
||||
TEST(HasType, MatchesAsString) {
|
||||
EXPECT_TRUE(
|
||||
matches("class Y { public: void x(); }; void z() {Y* y; y->x(); }",
|
||||
|
@ -1541,6 +1550,10 @@ TEST(Matcher, IntegerLiterals) {
|
|||
EXPECT_TRUE(notMatches("int i = 10.0;", HasIntLiteral));
|
||||
}
|
||||
|
||||
TEST(Matcher, AsmStatement) {
|
||||
EXPECT_TRUE(matches("void foo() { __asm(\"mov al, 2\"); }", asmStmt()));
|
||||
}
|
||||
|
||||
TEST(Matcher, Conditions) {
|
||||
StatementMatcher Condition = ifStmt(hasCondition(boolLiteral(equals(true))));
|
||||
|
||||
|
@ -2573,6 +2586,23 @@ TEST(SwitchCase, MatchesCase) {
|
|||
EXPECT_TRUE(notMatches("void x() { switch(42) {} }", switchCase()));
|
||||
}
|
||||
|
||||
TEST(SwitchCase, MatchesSwitch) {
|
||||
EXPECT_TRUE(matches("void x() { switch(42) { case 42:; } }", switchStmt()));
|
||||
EXPECT_TRUE(matches("void x() { switch(42) { default:; } }", switchStmt()));
|
||||
EXPECT_TRUE(matches("void x() { switch(42) default:; }", switchStmt()));
|
||||
EXPECT_TRUE(notMatches("void x() {}", switchStmt()));
|
||||
}
|
||||
|
||||
TEST(ExceptionHandling, SimpleCases) {
|
||||
EXPECT_TRUE(matches("void foo() try { } catch(int X) { }", catchStmt()));
|
||||
EXPECT_TRUE(matches("void foo() try { } catch(int X) { }", tryStmt()));
|
||||
EXPECT_TRUE(notMatches("void foo() try { } catch(int X) { }", throwExpr()));
|
||||
EXPECT_TRUE(matches("void foo() try { throw; } catch(int X) { }",
|
||||
throwExpr()));
|
||||
EXPECT_TRUE(matches("void foo() try { throw 5;} catch(int X) { }",
|
||||
throwExpr()));
|
||||
}
|
||||
|
||||
TEST(HasConditionVariableStatement, DoesNotMatchCondition) {
|
||||
EXPECT_TRUE(notMatches(
|
||||
"void x() { if(true) {} }",
|
||||
|
@ -2833,6 +2863,11 @@ TEST(NNS, MatchesNestedNameSpecifiers) {
|
|||
nestedNameSpecifier()));
|
||||
}
|
||||
|
||||
TEST(NullStatement, SimpleCases) {
|
||||
EXPECT_TRUE(matches("void f() {int i;;}", nullStmt()));
|
||||
EXPECT_TRUE(notMatches("void f() {int i;}", nullStmt()));
|
||||
}
|
||||
|
||||
TEST(NNS, MatchesTypes) {
|
||||
NestedNameSpecifierMatcher Matcher = nestedNameSpecifier(
|
||||
specifiesType(hasDeclaration(recordDecl(hasName("A")))));
|
||||
|
|
Loading…
Reference in New Issue