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());
}
Exemple #28
0
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;
}