forked from OSchip/llvm-project
Add a unittest for the ExternalASTSource.
llvm-svn: 203525
This commit is contained in:
parent
c94d993adf
commit
023d2ca451
|
@ -10,6 +10,7 @@ add_clang_unittest(ASTTests
|
||||||
CommentParser.cpp
|
CommentParser.cpp
|
||||||
DeclPrinterTest.cpp
|
DeclPrinterTest.cpp
|
||||||
DeclTest.cpp
|
DeclTest.cpp
|
||||||
|
ExternalASTSourceTest.cpp
|
||||||
SourceLocationTest.cpp
|
SourceLocationTest.cpp
|
||||||
StmtPrinterTest.cpp
|
StmtPrinterTest.cpp
|
||||||
)
|
)
|
||||||
|
|
|
@ -0,0 +1,83 @@
|
||||||
|
//===- unittest/AST/ExternalASTSourceTest.cpp -----------------------------===//
|
||||||
|
//
|
||||||
|
// The LLVM Compiler Infrastructure
|
||||||
|
//
|
||||||
|
// This file is distributed under the University of Illinois Open Source
|
||||||
|
// License. See LICENSE.TXT for details.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
//
|
||||||
|
// This file contains tests for Clang's ExternalASTSource.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
#include "clang/AST/ASTConsumer.h"
|
||||||
|
#include "clang/AST/ASTContext.h"
|
||||||
|
#include "clang/AST/ExternalASTSource.h"
|
||||||
|
#include "clang/Frontend/CompilerInstance.h"
|
||||||
|
#include "clang/Frontend/CompilerInvocation.h"
|
||||||
|
#include "clang/Frontend/FrontendActions.h"
|
||||||
|
#include "gtest/gtest.h"
|
||||||
|
|
||||||
|
using namespace clang;
|
||||||
|
using namespace llvm;
|
||||||
|
|
||||||
|
|
||||||
|
class TestFrontendAction : public ASTFrontendAction {
|
||||||
|
public:
|
||||||
|
TestFrontendAction(ExternalASTSource *Source) : Source(Source) {}
|
||||||
|
|
||||||
|
private:
|
||||||
|
virtual void ExecuteAction() {
|
||||||
|
getCompilerInstance().getASTContext().setExternalSource(Source);
|
||||||
|
getCompilerInstance().getASTContext().getTranslationUnitDecl()
|
||||||
|
->setHasExternalVisibleStorage();
|
||||||
|
return ASTFrontendAction::ExecuteAction();
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI,
|
||||||
|
StringRef InFile) {
|
||||||
|
return new ASTConsumer;
|
||||||
|
}
|
||||||
|
|
||||||
|
IntrusiveRefCntPtr<ExternalASTSource> Source;
|
||||||
|
};
|
||||||
|
|
||||||
|
bool testExternalASTSource(ExternalASTSource *Source,
|
||||||
|
StringRef FileContents) {
|
||||||
|
CompilerInstance Compiler;
|
||||||
|
Compiler.createDiagnostics();
|
||||||
|
|
||||||
|
CompilerInvocation *Invocation = new CompilerInvocation;
|
||||||
|
Invocation->getPreprocessorOpts().addRemappedFile(
|
||||||
|
"test.cc", MemoryBuffer::getMemBuffer(FileContents));
|
||||||
|
const char *Args[] = { "test.cc" };
|
||||||
|
CompilerInvocation::CreateFromArgs(*Invocation, Args,
|
||||||
|
Args + array_lengthof(Args),
|
||||||
|
Compiler.getDiagnostics());
|
||||||
|
Compiler.setInvocation(Invocation);
|
||||||
|
|
||||||
|
TestFrontendAction Action(Source);
|
||||||
|
return Compiler.ExecuteAction(Action);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Ensure that a failed name lookup into an external source only occurs once.
|
||||||
|
TEST(ExternalASTSourceTest, FailedLookupOccursOnce) {
|
||||||
|
struct TestSource : ExternalASTSource {
|
||||||
|
TestSource(unsigned &Calls) : Calls(Calls) {}
|
||||||
|
|
||||||
|
bool FindExternalVisibleDeclsByName(const DeclContext*,
|
||||||
|
DeclarationName Name) {
|
||||||
|
if (Name.getAsString() == "j")
|
||||||
|
++Calls;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned &Calls;
|
||||||
|
};
|
||||||
|
|
||||||
|
unsigned Calls;
|
||||||
|
ASSERT_TRUE(testExternalASTSource(new TestSource(Calls), "int j, k = j;"));
|
||||||
|
EXPECT_EQ(1u, Calls);
|
||||||
|
}
|
Loading…
Reference in New Issue