Author: alexfh Date: Tue Feb 7 05:39:56 2017 New Revision: 294293 URL: http://llvm.org/viewvc/llvm-project?rev=294293&view=rev Log: [clang-tidy] misc-argument-comment - extended gmock support
It looks like direct calls to mocked methods happen in the wild. This patch add support for these as well. Modified: clang-tools-extra/trunk/clang-tidy/misc/ArgumentCommentCheck.cpp clang-tools-extra/trunk/test/clang-tidy/misc-argument-comment-gmock.cpp Modified: clang-tools-extra/trunk/clang-tidy/misc/ArgumentCommentCheck.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/misc/ArgumentCommentCheck.cpp?rev=294293&r1=294292&r2=294293&view=diff ============================================================================== --- clang-tools-extra/trunk/clang-tidy/misc/ArgumentCommentCheck.cpp (original) +++ clang-tools-extra/trunk/clang-tidy/misc/ArgumentCommentCheck.cpp Tue Feb 7 05:39:56 2017 @@ -147,33 +147,43 @@ static bool sameName(StringRef InComment return InComment.compare_lower(InDecl) == 0; } +static bool looksLikeExpectMethod(const CXXMethodDecl *Expect) { + return Expect != nullptr && Expect->getLocation().isMacroID() && + Expect->getNameInfo().getName().isIdentifier() && + Expect->getName().startswith("gmock_"); +} +static bool areMockAndExpectMethods(const CXXMethodDecl *Mock, + const CXXMethodDecl *Expect) { + assert(looksLikeExpectMethod(Expect)); + return Mock != nullptr && Mock->getNextDeclInContext() == Expect && + Mock->getNumParams() == Expect->getNumParams() && + Mock->getLocation().isMacroID() && + Mock->getNameInfo().getName().isIdentifier() && + Mock->getName() == Expect->getName().substr(strlen("gmock_")); +} + // This uses implementation details of MOCK_METHODx_ macros: for each mocked // method M it defines M() with appropriate signature and a method used to set // up expectations - gmock_M() - with each argument's type changed the -// corresponding matcher. This function finds M by gmock_M. -static const CXXMethodDecl * -findMockedMethod(const CXXMethodDecl *ExpectMethod) { - if (!ExpectMethod->getNameInfo().getName().isIdentifier()) - return nullptr; - StringRef Name = ExpectMethod->getName(); - if (!Name.startswith("gmock_")) - return nullptr; - Name = Name.substr(strlen("gmock_")); - - const DeclContext *Ctx = ExpectMethod->getDeclContext(); - if (Ctx == nullptr || !Ctx->isRecord()) - return nullptr; - for (const auto *D : Ctx->decls()) { - if (const auto *Method = dyn_cast<CXXMethodDecl>(D)) { - if (Method->getName() != Name) - continue; - // Sanity check the mocked method. - if (Method->getNextDeclInContext() == ExpectMethod && - Method->getLocation().isMacroID() && - Method->getNumParams() == ExpectMethod->getNumParams()) { - return Method; +// corresponding matcher. This function returns M when given either M or +// gmock_M. +static const CXXMethodDecl *findMockedMethod(const CXXMethodDecl *Method) { + if (looksLikeExpectMethod(Method)) { + const DeclContext *Ctx = Method->getDeclContext(); + if (Ctx == nullptr || !Ctx->isRecord()) + return nullptr; + for (const auto *D : Ctx->decls()) { + if (D->getNextDeclInContext() == Method) { + const auto *Previous = dyn_cast<CXXMethodDecl>(D); + return areMockAndExpectMethods(Previous, Method) ? Previous : nullptr; } } + return nullptr; + } + if (const auto *Next = dyn_cast_or_null<CXXMethodDecl>( + Method->getNextDeclInContext())) { + if (looksLikeExpectMethod(Next) && areMockAndExpectMethods(Method, Next)) + return Method; } return nullptr; } Modified: clang-tools-extra/trunk/test/clang-tidy/misc-argument-comment-gmock.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-tidy/misc-argument-comment-gmock.cpp?rev=294293&r1=294292&r2=294293&view=diff ============================================================================== --- clang-tools-extra/trunk/test/clang-tidy/misc-argument-comment-gmock.cpp (original) +++ clang-tools-extra/trunk/test/clang-tidy/misc-argument-comment-gmock.cpp Tue Feb 7 05:39:56 2017 @@ -80,7 +80,7 @@ class MockStandalone { MOCK_METHOD2(Method, void(int aaa, int bbb)); }; -void test_gmock() { +void test_gmock_expectations() { MockDerived m; EXPECT_CALL(m, Method(/*param_one=*/1, /*param_tw=*/2)); // CHECK-MESSAGES: [[@LINE-1]]:42: warning: argument name 'param_tw' in comment does not match parameter name 'param_two' @@ -99,3 +99,10 @@ void test_gmock() { MockStandalone m2; EXPECT_CALL(m2, Method(/*aaa=*/5, /*bbc=*/6)); } + +void test_gmock_direct_calls() { + MockDerived m; + m.Method(/*param_one=*/1, /*param_tw=*/2); +// CHECK-MESSAGES: [[@LINE-1]]:29: warning: argument name 'param_tw' in comment does not match parameter name 'param_two' +// CHECK-FIXES: m.Method(/*param_one=*/1, /*param_two=*/2); +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits