TEST(StmtDepthMetricTest, ObjCTryCatchFinally) { StmtDepthCallback depthCallback(4); MatchFinder finder; finder.addMatcher(functionDeclMatcher, &depthCallback); testMatcherOnObjCCode(finder, "void m() { @try { int c = 3; } @catch (id ex) { int a = 1; } @finally { int b = 2; {{}}} }"); }
TEST(NPathComplexityMetricTest, NestedIfElseStmt) { NPathCallback nPathCallback(4); MatchFinder finder; finder.addMatcher(functionDeclMatcher, &nPathCallback); testMatcherOnCode(finder, "void mthd() { if (1) { if (1) {} else {} } else { if (1) {} else {} } }"); }
TEST(NPathComplexityMetricTest, IfElseStmtWithMultipleLogicAndOrOperatorsConditionAndEmptyThenCompoundStmt) { NPathCallback nPathCallback(4); MatchFinder finder; finder.addMatcher(functionDeclMatcher, &nPathCallback); testMatcherOnCode(finder, "void mthd() { if (0 || 1 && 0) {} else {} }"); }
TEST(CyclomaticComplexityMetricTest, EmptyFunction) { CyclomaticCallback ccnCallback(1); MatchFinder finder; finder.addMatcher(functionDeclMatcher, &ccnCallback); testMatcherOnCode(finder, "void m() {}"); }
TEST(CyclomaticComplexityMetricTest, OneDoStatement) { CyclomaticCallback ccnCallback(2); MatchFinder finder; finder.addMatcher(functionDeclMatcher, &ccnCallback); testMatcherOnCode(finder, "void aMethod() { do {} while(1); }"); }
TEST(CyclomaticComplexityMetricTest, OneObjCAtCatchStatement) { CyclomaticCallback ccnCallback(2); MatchFinder finder; finder.addMatcher(functionDeclMatcher, &ccnCallback); testMatcherOnObjCCode(finder, "void aMethod() { @try {} @catch (id ex) {} }"); }
TEST(CyclomaticComplexityMetricTest, OneLogicOrOperator) { CyclomaticCallback ccnCallback(2); MatchFinder finder; finder.addMatcher(functionDeclMatcher, &ccnCallback); testMatcherOnCode(finder, "void aMethod() { int b = 1 || 0; }"); }
TEST(StmtDepthMetricTest, TwoLevelBlock) { StmtDepthCallback depthCallback(2); MatchFinder finder; finder.addMatcher(functionDeclMatcher, &depthCallback); testMatcherOnCode(finder, "void m() {{}}"); }
TEST(StmtDepthMetricTest, ChooseTheDeepest) { StmtDepthCallback depthCallback(4); MatchFinder finder; finder.addMatcher(functionDeclMatcher, &depthCallback); testMatcherOnCode(finder, "void m() {{}{{{}}}{{}}}"); }
TEST(StmtDepthMetricTest, TwoCaseStatementsAndDefault) { StmtDepthCallback depthCallback(2); MatchFinder finder; finder.addMatcher(functionDeclMatcher, &depthCallback); testMatcherOnCode(finder, "void m() { int i = 1; switch (i) { case 1: i = 2; break; case 2: break; default: break; } }"); }
TEST(StmtDepthMetricTest, EmptyFunction) { StmtDepthCallback depthCallback(1); MatchFinder finder; finder.addMatcher(functionDeclMatcher, &depthCallback); testMatcherOnCode(finder, "void m() {}"); }
TEST(StmtDepthMetricTest, OneCaseStatement) { StmtDepthCallback depthCallback(2); MatchFinder finder; finder.addMatcher(functionDeclMatcher, &depthCallback); testMatcherOnCode(finder, "void m() { int i = 1; switch (i) { case 1: break; } }"); }
TEST(StmtDepthMetricTest, ObjCSynchronized) { StmtDepthCallback depthCallback(2); MatchFinder finder; finder.addMatcher(functionDeclMatcher, &depthCallback); testMatcherOnObjCCode(finder, "void m() { id res; @synchronized(res) { int a = 1; } }"); }
TEST(StmtDepthMetricTest, ObjCAutoreleasePool) { StmtDepthCallback depthCallback(2); MatchFinder finder; finder.addMatcher(functionDeclMatcher, &depthCallback); testMatcherOnObjCCode(finder, "void m() { @autoreleasepool { int a = 1; } }"); }
TEST(CyclomaticComplexityMetricTest, TwoCaseStatements) { CyclomaticCallback ccnCallback(3); MatchFinder finder; finder.addMatcher(functionDeclMatcher, &ccnCallback); testMatcherOnCode(finder, "void aMethod() { int i = 1; switch (i) { case 1: case 2: break; } }"); }
TEST(StmtDepthMetricTest, IfStatementWithElse) { StmtDepthCallback depthCallback(4); MatchFinder finder; finder.addMatcher(functionDeclMatcher, &depthCallback); testMatcherOnCode(finder, "void m() { if (1) {} else {{{}}} }"); }
TEST(CyclomaticComplexityMetricTest, OneCXXCatchStatement) { CyclomaticCallback ccnCallback(2); MatchFinder finder; finder.addMatcher(functionDeclMatcher, &ccnCallback); testMatcherOnCXXCode(finder, "void aMethod() { try {} catch (...) {} }"); }
TEST(StmtDepthMetricTest, ObjCForCollectionStatement) { StmtDepthCallback depthCallback(2); MatchFinder finder; finder.addMatcher(functionDeclMatcher, &depthCallback); testMatcherOnObjCCode(finder, "void m() { id array; for(id one in array) {} }"); }
TEST(CyclomaticComplexityMetricTest, OneConditionalOperator) { CyclomaticCallback ccnCallback(2); MatchFinder finder; finder.addMatcher(functionDeclMatcher, &ccnCallback); testMatcherOnCode(finder, "void aMethod() { int i = 0 ? 1 : -1; }"); }
TEST(StmtDepthMetricTest, WhileStatement) { StmtDepthCallback depthCallback(2); MatchFinder finder; finder.addMatcher(functionDeclMatcher, &depthCallback); testMatcherOnCode(finder, "void m() { while(1) {} }"); }
TEST(CyclomaticComplexityMetricTest, ABinaryOperatorButHasNoEffectOnCCNCouting) { CyclomaticCallback ccnCallback(1); MatchFinder finder; finder.addMatcher(functionDeclMatcher, &ccnCallback); testMatcherOnCode(finder, "void aMethod() { int b = 1 == 0; }"); }
TEST(NPathComplexityMetricTest, WhileStmtWithOneLogicAndOperatorConditionAndEmptyCompoundStmt) { NPathCallback nPathCallback(3); MatchFinder finder; finder.addMatcher(functionDeclMatcher, &nPathCallback); testMatcherOnCode(finder, "void mthd() { while (1 && 0) {} }"); }
TEST(CyclomaticComplexityMetricTest, OneObjCForCollectionStatement) { CyclomaticCallback ccnCallback(2); MatchFinder finder; finder.addMatcher(functionDeclMatcher, &ccnCallback); testMatcherOnObjCCode(finder, "void aMethod() { id array; for(id one in array) {} }"); }
TEST(StmtDepthMetricTest, CXXTryCatch) { StmtDepthCallback depthCallback(4); MatchFinder finder; finder.addMatcher(functionDeclMatcher, &depthCallback); testMatcherOnCXXCode(finder, "void m() { try { int a = 1; } catch (...) { int b = 2; {{}}} }"); }
/* * Main @TestNeed */ int main(int argc, const char **argv){ CommonOptionsParser OptionsParser(argc, argv, MyToolCategory); ClangTool Tool(OptionsParser.getCompilations(), OptionsParser.getSourcePathList()); ReturnChecker rc; MatchFinder finder; finder.addMatcher(FuncStmtMatcher, &rc); Tool.run(newFrontendActionFactory(&finder)); return 0; }
int main(int argc, const char **argv) { CommonOptionsParser op(argc, argv, ToolingSampleCategory); ClangTool Tool(op.getCompilations(), op.getSourcePathList()); CallPrinter Printer; MatchFinder Finder; Finder.addMatcher(CallMatcher, &Printer); return Tool.run(newFrontendActionFactory(&Finder).get()); }
int main(int argc, const char** argv) { CommonOptionsParser OptionsParser(argc, argv, ToolCategory); ClangTool Tool(OptionsParser.getCompilations(), OptionsParser.getSourcePathList()); ComparisonPrinter Printer; MatchFinder Finder; Finder.addMatcher(ComparisonMatcher, &Printer); return Tool.run(newFrontendActionFactory(&Finder).get()); }
clang::ast_matchers::MatchFinder MatchContainer::getMatcher() { MatchFinder finder; // Some debug bind slot onStmtMatch.emplace("dump", [](Stmt const * d) {d->dump(); }); onTypeMatch.emplace("dump", [](Type const * d) {d->dump(); }); onDeclMatch.emplace("dump", [](Decl const * d) {d->dump(); }); onDeclMatch.emplace("print_name", [](Decl const * d) { if(auto* nd = dyn_cast<NamedDecl>(d)) llvm::errs() << nd->getNameAsString() << "\n"; }); //free operators DeclarationMatcher out_stream_op = functionDecl( unless(hasDeclContext(recordDecl())), matchesName("operator[\\+-\\*\\^\\[\\(\\!\\&\\|\\~\\=\\/\\%\\<\\>]") ).bind("free_operator"); finder.addMatcher(out_stream_op, this); declPrinters.emplace("free_operator", [](DPrinter&, Decl*) {}); onDeclMatch.emplace("free_operator", [this](Decl const * d) { if(auto* funcDecl = dyn_cast<FunctionDecl>(d)) { auto getParamTypeName = [](ParmVarDecl const * typeParam) { QualType canType = typeParam->getType().getCanonicalType() .getUnqualifiedType().getNonReferenceType(); canType.removeLocalConst(); return canType.getAsString(); }; if(funcDecl->getNumParams() > 0) { std::string const left_name = getParamTypeName(funcDecl->getParamDecl(0)); freeOperator.emplace(left_name, funcDecl); if(funcDecl->getNumParams() > 1) { std::string const right_name = getParamTypeName(funcDecl->getParamDecl(1)); if(right_name != left_name) freeOperatorRight.emplace(right_name, funcDecl); } } } }); for(auto printerRegisterers : CustomPrinters::getInstance().getRegisterers()) printerRegisterers(*this, finder); return finder; }
/* * Main @TestNeed */ int main(int argc, const char **argv){ CommonOptionsParser OptionsParser(argc, argv, MyToolCategory); //Create an ClangTool instance to run a FrontendAction over a set of files ClangTool Tool(OptionsParser.getCompilations(), OptionsParser.getSourcePathList()); //tool::MyFactory Factory; GlobalVarChecker gvc; MatchFinder finder; finder.addMatcher(VarDeclMatcher, &gvc); Tool.run(newFrontendActionFactory(&finder)); return 0; }
int main(int argc, const char **argv) { CommonOptionsParser OptionsParser(argc, argv, MyToolCategory); ClangTool Tool(OptionsParser.getCompilations(), OptionsParser.getSourcePathList()); //tooling::MyFactory Factory; ParmPrinter Printer; MatchFinder Finder; Finder.addMatcher(funcMatcher, &Printer); Tool.run(newFrontendActionFactory(&Finder)); return 0; }