forked from OSchip/llvm-project
[Parser] Unbreak parsing with incremental parsing enabled and add a unit-test for it.
llvm-svn: 195564
This commit is contained in:
parent
aa61cbbe8b
commit
336fcd9c61
|
@ -584,10 +584,8 @@ bool Parser::ParseTopLevelDecl(DeclGroupPtrTy &Result) {
|
||||||
|
|
||||||
// Skip over the EOF token, flagging end of previous input for incremental
|
// Skip over the EOF token, flagging end of previous input for incremental
|
||||||
// processing
|
// processing
|
||||||
if (PP.isIncrementalProcessingEnabled() && Tok.is(tok::eof)) {
|
if (PP.isIncrementalProcessingEnabled() && Tok.is(tok::eof))
|
||||||
ConsumeToken();
|
ConsumeToken();
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
Result = DeclGroupPtrTy();
|
Result = DeclGroupPtrTy();
|
||||||
switch (Tok.getKind()) {
|
switch (Tok.getKind()) {
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
#include "clang/AST/RecursiveASTVisitor.h"
|
#include "clang/AST/RecursiveASTVisitor.h"
|
||||||
#include "clang/Frontend/CompilerInstance.h"
|
#include "clang/Frontend/CompilerInstance.h"
|
||||||
#include "clang/Frontend/CompilerInvocation.h"
|
#include "clang/Frontend/CompilerInvocation.h"
|
||||||
|
#include "clang/Lex/Preprocessor.h"
|
||||||
#include "llvm/ADT/Triple.h"
|
#include "llvm/ADT/Triple.h"
|
||||||
#include "llvm/Support/MemoryBuffer.h"
|
#include "llvm/Support/MemoryBuffer.h"
|
||||||
#include "gtest/gtest.h"
|
#include "gtest/gtest.h"
|
||||||
|
@ -24,8 +25,19 @@ namespace {
|
||||||
|
|
||||||
class TestASTFrontendAction : public ASTFrontendAction {
|
class TestASTFrontendAction : public ASTFrontendAction {
|
||||||
public:
|
public:
|
||||||
|
TestASTFrontendAction(bool enableIncrementalProcessing = false)
|
||||||
|
: EnableIncrementalProcessing(enableIncrementalProcessing) { }
|
||||||
|
|
||||||
|
bool EnableIncrementalProcessing;
|
||||||
std::vector<std::string> decl_names;
|
std::vector<std::string> decl_names;
|
||||||
|
|
||||||
|
virtual bool BeginSourceFileAction(CompilerInstance &ci, StringRef filename) {
|
||||||
|
if (EnableIncrementalProcessing)
|
||||||
|
ci.getPreprocessor().enableIncrementalProcessing();
|
||||||
|
|
||||||
|
return ASTFrontendAction::BeginSourceFileAction(ci, filename);
|
||||||
|
}
|
||||||
|
|
||||||
virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI,
|
virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI,
|
||||||
StringRef InFile) {
|
StringRef InFile) {
|
||||||
return new Visitor(decl_names);
|
return new Visitor(decl_names);
|
||||||
|
@ -70,4 +82,24 @@ TEST(ASTFrontendAction, Sanity) {
|
||||||
EXPECT_EQ("x", test_action.decl_names[2]);
|
EXPECT_EQ("x", test_action.decl_names[2]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(ASTFrontendAction, IncrementalParsing) {
|
||||||
|
CompilerInvocation *invocation = new CompilerInvocation;
|
||||||
|
invocation->getPreprocessorOpts().addRemappedFile(
|
||||||
|
"test.cc", MemoryBuffer::getMemBuffer("int main() { float x; }"));
|
||||||
|
invocation->getFrontendOpts().Inputs.push_back(FrontendInputFile("test.cc",
|
||||||
|
IK_CXX));
|
||||||
|
invocation->getFrontendOpts().ProgramAction = frontend::ParseSyntaxOnly;
|
||||||
|
invocation->getTargetOpts().Triple = "i386-unknown-linux-gnu";
|
||||||
|
CompilerInstance compiler;
|
||||||
|
compiler.setInvocation(invocation);
|
||||||
|
compiler.createDiagnostics();
|
||||||
|
|
||||||
|
TestASTFrontendAction test_action(/*enableIncrementalProcessing=*/true);
|
||||||
|
ASSERT_TRUE(compiler.ExecuteAction(test_action));
|
||||||
|
ASSERT_EQ(3U, test_action.decl_names.size());
|
||||||
|
EXPECT_EQ("__builtin_va_list", test_action.decl_names[0]);
|
||||||
|
EXPECT_EQ("main", test_action.decl_names[1]);
|
||||||
|
EXPECT_EQ("x", test_action.decl_names[2]);
|
||||||
|
}
|
||||||
|
|
||||||
} // anonymous namespace
|
} // anonymous namespace
|
||||||
|
|
Loading…
Reference in New Issue