17a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin//===- unittests/Frontend/FrontendActionTest.cpp - FrontendAction tests ---===//
27a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin//
37a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin//                     The LLVM Compiler Infrastructure
47a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin//
57a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin// This file is distributed under the University of Illinois Open Source
67a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin// License. See LICENSE.TXT for details.
77a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin//
87a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin//===----------------------------------------------------------------------===//
97a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin
101050e8b2252d89a0004a6fd25a58dab88b5ee625Chandler Carruth#include "clang/Frontend/FrontendAction.h"
117a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin#include "clang/AST/ASTConsumer.h"
121050e8b2252d89a0004a6fd25a58dab88b5ee625Chandler Carruth#include "clang/AST/ASTContext.h"
137cc315ccf80382fab7674735fbfda95990d28f8eChandler Carruth#include "clang/AST/RecursiveASTVisitor.h"
147a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin#include "clang/Frontend/CompilerInstance.h"
157a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin#include "clang/Frontend/CompilerInvocation.h"
167a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin#include "llvm/ADT/Triple.h"
177a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin#include "llvm/Support/MemoryBuffer.h"
187a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin#include "gtest/gtest.h"
197a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin
207a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskinusing namespace llvm;
217a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskinusing namespace clang;
227a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin
237a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskinnamespace {
247a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin
257a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskinclass TestASTFrontendAction : public ASTFrontendAction {
267a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskinpublic:
277a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin  std::vector<std::string> decl_names;
287a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin
297a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin  virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI,
307a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin                                         StringRef InFile) {
317a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin    return new Visitor(decl_names);
327a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin  }
337a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin
347a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskinprivate:
357a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin  class Visitor : public ASTConsumer, public RecursiveASTVisitor<Visitor> {
367a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin  public:
377a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin    Visitor(std::vector<std::string> &decl_names) : decl_names_(decl_names) {}
387a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin
397a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin    virtual void HandleTranslationUnit(ASTContext &context) {
407a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin      TraverseDecl(context.getTranslationUnitDecl());
417a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin    }
427a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin
437a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin    virtual bool VisitNamedDecl(NamedDecl *Decl) {
447a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin      decl_names_.push_back(Decl->getQualifiedNameAsString());
457a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin      return true;
467a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin    }
477a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin
487a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin  private:
497a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin    std::vector<std::string> &decl_names_;
507a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin  };
517a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin};
527a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin
537a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey YasskinTEST(ASTFrontendAction, Sanity) {
547a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin  CompilerInvocation *invocation = new CompilerInvocation;
557a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin  invocation->getPreprocessorOpts().addRemappedFile(
567a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin    "test.cc", MemoryBuffer::getMemBuffer("int main() { float x; }"));
57eabcf7e1d4c2be34653a936cff93d0872fe929ddDouglas Gregor  invocation->getFrontendOpts().Inputs.push_back(FrontendInputFile("test.cc",
58eabcf7e1d4c2be34653a936cff93d0872fe929ddDouglas Gregor                                                                   IK_CXX));
597a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin  invocation->getFrontendOpts().ProgramAction = frontend::ParseSyntaxOnly;
607a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin  invocation->getTargetOpts().Triple = "i386-unknown-linux-gnu";
617a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin  CompilerInstance compiler;
627a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin  compiler.setInvocation(invocation);
63d47afb96a3f988e6d21a92fe4dfe875ab227c7c0Sean Silva  compiler.createDiagnostics();
647a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin
657a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin  TestASTFrontendAction test_action;
667a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin  ASSERT_TRUE(compiler.ExecuteAction(test_action));
677a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin  ASSERT_EQ(3U, test_action.decl_names.size());
687a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin  EXPECT_EQ("__builtin_va_list", test_action.decl_names[0]);
697a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin  EXPECT_EQ("main", test_action.decl_names[1]);
707a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin  EXPECT_EQ("x", test_action.decl_names[2]);
717a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin}
727a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin
737a17889829b3f3655c47e2b01e282832fdb466d6Jeffrey Yasskin} // anonymous namespace
74