ASTMerge.cpp revision 210299
1203955Srdivacky//===-- ASTMerge.cpp - AST Merging Frontent Action --------------*- C++ -*-===//
2203955Srdivacky//
3203955Srdivacky//                     The LLVM Compiler Infrastructure
4203955Srdivacky//
5203955Srdivacky// This file is distributed under the University of Illinois Open Source
6203955Srdivacky// License. See LICENSE.TXT for details.
7203955Srdivacky//
8203955Srdivacky//===----------------------------------------------------------------------===//
9203955Srdivacky#include "clang/Frontend/ASTUnit.h"
10203955Srdivacky#include "clang/Frontend/CompilerInstance.h"
11203955Srdivacky#include "clang/Frontend/FrontendActions.h"
12203955Srdivacky#include "clang/AST/ASTContext.h"
13203955Srdivacky#include "clang/AST/ASTDiagnostic.h"
14203955Srdivacky#include "clang/AST/ASTImporter.h"
15206275Srdivacky#include "clang/Basic/Diagnostic.h"
16203955Srdivacky
17203955Srdivackyusing namespace clang;
18203955Srdivacky
19203955SrdivackyASTConsumer *ASTMergeAction::CreateASTConsumer(CompilerInstance &CI,
20203955Srdivacky                                               llvm::StringRef InFile) {
21203955Srdivacky  return AdaptedAction->CreateASTConsumer(CI, InFile);
22203955Srdivacky}
23203955Srdivacky
24203955Srdivackybool ASTMergeAction::BeginSourceFileAction(CompilerInstance &CI,
25203955Srdivacky                                           llvm::StringRef Filename) {
26203955Srdivacky  // FIXME: This is a hack. We need a better way to communicate the
27203955Srdivacky  // AST file, compiler instance, and file name than member variables
28203955Srdivacky  // of FrontendAction.
29210299Sed  AdaptedAction->setCurrentFile(getCurrentFile(), getCurrentFileKind(),
30210299Sed                                takeCurrentASTUnit());
31203955Srdivacky  AdaptedAction->setCompilerInstance(&CI);
32203955Srdivacky  return AdaptedAction->BeginSourceFileAction(CI, Filename);
33203955Srdivacky}
34203955Srdivacky
35203955Srdivackyvoid ASTMergeAction::ExecuteAction() {
36203955Srdivacky  CompilerInstance &CI = getCompilerInstance();
37203955Srdivacky  CI.getDiagnostics().getClient()->BeginSourceFile(
38203955Srdivacky                                         CI.getASTContext().getLangOptions());
39203955Srdivacky  CI.getDiagnostics().SetArgToStringFn(&FormatASTNodeDiagnosticArgument,
40203955Srdivacky                                       &CI.getASTContext());
41206275Srdivacky  llvm::IntrusiveRefCntPtr<Diagnostic> Diags(&CI.getDiagnostics());
42203955Srdivacky  for (unsigned I = 0, N = ASTFiles.size(); I != N; ++I) {
43206275Srdivacky    ASTUnit *Unit = ASTUnit::LoadFromPCHFile(ASTFiles[I], Diags, false);
44203955Srdivacky    if (!Unit)
45203955Srdivacky      continue;
46203955Srdivacky
47203955Srdivacky    ASTImporter Importer(CI.getDiagnostics(),
48203955Srdivacky                         CI.getASTContext(),
49203955Srdivacky                         CI.getFileManager(),
50203955Srdivacky                         Unit->getASTContext(),
51203955Srdivacky                         Unit->getFileManager());
52203955Srdivacky
53203955Srdivacky    TranslationUnitDecl *TU = Unit->getASTContext().getTranslationUnitDecl();
54203955Srdivacky    for (DeclContext::decl_iterator D = TU->decls_begin(),
55203955Srdivacky                                 DEnd = TU->decls_end();
56203955Srdivacky         D != DEnd; ++D) {
57203955Srdivacky      // Don't re-import __va_list_tag, __builtin_va_list.
58203955Srdivacky      if (NamedDecl *ND = dyn_cast<NamedDecl>(*D))
59203955Srdivacky        if (IdentifierInfo *II = ND->getIdentifier())
60203955Srdivacky          if (II->isStr("__va_list_tag") || II->isStr("__builtin_va_list"))
61203955Srdivacky            continue;
62203955Srdivacky
63203955Srdivacky      Importer.Import(*D);
64203955Srdivacky    }
65203955Srdivacky
66203955Srdivacky    delete Unit;
67203955Srdivacky  }
68203955Srdivacky
69203955Srdivacky  AdaptedAction->ExecuteAction();
70203955Srdivacky  CI.getDiagnostics().getClient()->EndSourceFile();
71203955Srdivacky}
72203955Srdivacky
73203955Srdivackyvoid ASTMergeAction::EndSourceFileAction() {
74203955Srdivacky  return AdaptedAction->EndSourceFileAction();
75203955Srdivacky}
76203955Srdivacky
77203955SrdivackyASTMergeAction::ASTMergeAction(FrontendAction *AdaptedAction,
78203955Srdivacky                               std::string *ASTFiles, unsigned NumASTFiles)
79203955Srdivacky  : AdaptedAction(AdaptedAction), ASTFiles(ASTFiles, ASTFiles + NumASTFiles) {
80203955Srdivacky  assert(AdaptedAction && "ASTMergeAction needs an action to adapt");
81203955Srdivacky}
82203955Srdivacky
83203955SrdivackyASTMergeAction::~ASTMergeAction() {
84203955Srdivacky  delete AdaptedAction;
85203955Srdivacky}
86203955Srdivacky
87203955Srdivackybool ASTMergeAction::usesPreprocessorOnly() const {
88203955Srdivacky  return AdaptedAction->usesPreprocessorOnly();
89203955Srdivacky}
90203955Srdivacky
91203955Srdivackybool ASTMergeAction::usesCompleteTranslationUnit() {
92203955Srdivacky  return AdaptedAction->usesCompleteTranslationUnit();
93203955Srdivacky}
94203955Srdivacky
95203955Srdivackybool ASTMergeAction::hasPCHSupport() const {
96203955Srdivacky  return AdaptedAction->hasPCHSupport();
97203955Srdivacky}
98203955Srdivacky
99210299Sedbool ASTMergeAction::hasASTFileSupport() const {
100210299Sed  return AdaptedAction->hasASTFileSupport();
101203955Srdivacky}
102203955Srdivacky
103203955Srdivackybool ASTMergeAction::hasCodeCompletionSupport() const {
104203955Srdivacky  return AdaptedAction->hasCodeCompletionSupport();
105203955Srdivacky}
106