FrontendActionTest.cpp revision 1050e8b2252d89a0004a6fd25a58dab88b5ee625
1//===- unittests/Frontend/FrontendActionTest.cpp - FrontendAction tests ---===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "clang/Frontend/FrontendAction.h"
11#include "clang/AST/RecursiveASTVisitor.h"
12#include "clang/AST/ASTConsumer.h"
13#include "clang/AST/ASTContext.h"
14#include "clang/Frontend/CompilerInstance.h"
15#include "clang/Frontend/CompilerInvocation.h"
16#include "llvm/ADT/Triple.h"
17#include "llvm/Support/MemoryBuffer.h"
18#include "gtest/gtest.h"
19
20using namespace llvm;
21using namespace clang;
22
23namespace {
24
25class TestASTFrontendAction : public ASTFrontendAction {
26public:
27  std::vector<std::string> decl_names;
28
29  virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI,
30                                         StringRef InFile) {
31    return new Visitor(decl_names);
32  }
33
34private:
35  class Visitor : public ASTConsumer, public RecursiveASTVisitor<Visitor> {
36  public:
37    Visitor(std::vector<std::string> &decl_names) : decl_names_(decl_names) {}
38
39    virtual void HandleTranslationUnit(ASTContext &context) {
40      TraverseDecl(context.getTranslationUnitDecl());
41    }
42
43    virtual bool VisitNamedDecl(NamedDecl *Decl) {
44      decl_names_.push_back(Decl->getQualifiedNameAsString());
45      return true;
46    }
47
48  private:
49    std::vector<std::string> &decl_names_;
50  };
51};
52
53TEST(ASTFrontendAction, Sanity) {
54  CompilerInvocation *invocation = new CompilerInvocation;
55  invocation->getPreprocessorOpts().addRemappedFile(
56    "test.cc", MemoryBuffer::getMemBuffer("int main() { float x; }"));
57  invocation->getFrontendOpts().Inputs.push_back(FrontendInputFile("test.cc",
58                                                                   IK_CXX));
59  invocation->getFrontendOpts().ProgramAction = frontend::ParseSyntaxOnly;
60  invocation->getTargetOpts().Triple = "i386-unknown-linux-gnu";
61  CompilerInstance compiler;
62  compiler.setInvocation(invocation);
63  compiler.createDiagnostics(0, NULL);
64
65  TestASTFrontendAction test_action;
66  ASSERT_TRUE(compiler.ExecuteAction(test_action));
67  ASSERT_EQ(3U, test_action.decl_names.size());
68  EXPECT_EQ("__builtin_va_list", test_action.decl_names[0]);
69  EXPECT_EQ("main", test_action.decl_names[1]);
70  EXPECT_EQ("x", test_action.decl_names[2]);
71}
72
73} // anonymous namespace
74