[cfe-commits] r168726 - in /cfe/trunk: include/clang/AST/ASTConsumer.h lib/Sema/SemaDecl.cpp unittests/Tooling/ToolingTest.cpp
Richard Smith
richard-llvm at metafoo.co.uk
Tue Nov 27 13:31:02 PST 2012
Author: rsmith
Date: Tue Nov 27 15:31:01 2012
New Revision: 168726
URL: http://llvm.org/viewvc/llvm-project?rev=168726&view=rev
Log:
Allow an ASTConsumer to selectively skip function bodies while parsing. Patch
by Olivier Goffart!
Modified:
cfe/trunk/include/clang/AST/ASTConsumer.h
cfe/trunk/lib/Sema/SemaDecl.cpp
cfe/trunk/unittests/Tooling/ToolingTest.cpp
Modified: cfe/trunk/include/clang/AST/ASTConsumer.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/ASTConsumer.h?rev=168726&r1=168725&r2=168726&view=diff
==============================================================================
--- cfe/trunk/include/clang/AST/ASTConsumer.h (original)
+++ cfe/trunk/include/clang/AST/ASTConsumer.h Tue Nov 27 15:31:01 2012
@@ -17,6 +17,7 @@
namespace clang {
class ASTContext;
class CXXRecordDecl;
+ class Decl;
class DeclGroupRef;
class HandleTagDeclDefinition;
class PPMutationListener;
@@ -130,6 +131,14 @@
/// PrintStats - If desired, print any statistics.
virtual void PrintStats() {}
+
+ /// \brief This callback is called for each function if the Parser was
+ /// initialized with \c SkipFunctionBodies set to \c true.
+ ///
+ /// \return \c true if the function's body should be skipped. The function
+ /// body may be parsed anyway if it is needed (for instance, if it contains
+ /// the code completion point or is constexpr).
+ virtual bool shouldSkipFunctionBody(Decl *D) { return true; }
};
} // end namespace clang.
Modified: cfe/trunk/lib/Sema/SemaDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=168726&r1=168725&r2=168726&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDecl.cpp Tue Nov 27 15:31:01 2012
@@ -7993,6 +7993,9 @@
}
bool Sema::canSkipFunctionBody(Decl *D) {
+ if (!Consumer.shouldSkipFunctionBody(D))
+ return false;
+
if (isa<ObjCMethodDecl>(D))
return true;
Modified: cfe/trunk/unittests/Tooling/ToolingTest.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Tooling/ToolingTest.cpp?rev=168726&r1=168725&r2=168726&view=diff
==============================================================================
--- cfe/trunk/unittests/Tooling/ToolingTest.cpp (original)
+++ cfe/trunk/unittests/Tooling/ToolingTest.cpp Tue Nov 27 15:31:01 2012
@@ -10,6 +10,7 @@
#include "clang/AST/ASTConsumer.h"
#include "clang/AST/DeclCXX.h"
#include "clang/AST/DeclGroup.h"
+#include "clang/Frontend/CompilerInstance.h"
#include "clang/Frontend/FrontendAction.h"
#include "clang/Frontend/FrontendActions.h"
#include "clang/Tooling/CompilationDatabase.h"
@@ -162,5 +163,28 @@
}
#endif
+struct SkipBodyConsumer : public clang::ASTConsumer {
+ /// Skip the 'skipMe' function.
+ virtual bool shouldSkipFunctionBody(Decl *D) {
+ FunctionDecl *F = dyn_cast<FunctionDecl>(D);
+ return F && F->getNameAsString() == "skipMe";
+ }
+};
+
+struct SkipBodyAction : public clang::ASTFrontendAction {
+ virtual ASTConsumer *CreateASTConsumer(CompilerInstance &Compiler,
+ StringRef) {
+ Compiler.getFrontendOpts().SkipFunctionBodies = true;
+ return new SkipBodyConsumer;
+ }
+};
+
+TEST(runToolOnCode, TestSkipFunctionBoddy) {
+ EXPECT_TRUE(runToolOnCode(new SkipBodyAction,
+ "int skipMe() { an_error_here }"));
+ EXPECT_FALSE(runToolOnCode(new SkipBodyAction,
+ "int skipMeNot() { an_error_here }"));
+}
+
} // end namespace tooling
} // end namespace clang
More information about the cfe-commits
mailing list