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