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/AST/ASTContext.h" 11203955Srdivacky#include "clang/AST/ASTDiagnostic.h" 12203955Srdivacky#include "clang/AST/ASTImporter.h" 13206275Srdivacky#include "clang/Basic/Diagnostic.h" 14249423Sdim#include "clang/Frontend/CompilerInstance.h" 15249423Sdim#include "clang/Frontend/FrontendActions.h" 16203955Srdivacky 17203955Srdivackyusing namespace clang; 18203955Srdivacky 19203955SrdivackyASTConsumer *ASTMergeAction::CreateASTConsumer(CompilerInstance &CI, 20226633Sdim StringRef InFile) { 21203955Srdivacky return AdaptedAction->CreateASTConsumer(CI, InFile); 22203955Srdivacky} 23203955Srdivacky 24203955Srdivackybool ASTMergeAction::BeginSourceFileAction(CompilerInstance &CI, 25226633Sdim 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. 29234353Sdim AdaptedAction->setCurrentInput(getCurrentInput(), takeCurrentASTUnit()); 30203955Srdivacky AdaptedAction->setCompilerInstance(&CI); 31203955Srdivacky return AdaptedAction->BeginSourceFileAction(CI, Filename); 32203955Srdivacky} 33203955Srdivacky 34203955Srdivackyvoid ASTMergeAction::ExecuteAction() { 35203955Srdivacky CompilerInstance &CI = getCompilerInstance(); 36203955Srdivacky CI.getDiagnostics().getClient()->BeginSourceFile( 37251662Sdim CI.getASTContext().getLangOpts()); 38203955Srdivacky CI.getDiagnostics().SetArgToStringFn(&FormatASTNodeDiagnosticArgument, 39203955Srdivacky &CI.getASTContext()); 40234353Sdim IntrusiveRefCntPtr<DiagnosticIDs> 41218893Sdim DiagIDs(CI.getDiagnostics().getDiagnosticIDs()); 42203955Srdivacky for (unsigned I = 0, N = ASTFiles.size(); I != N; ++I) { 43234353Sdim IntrusiveRefCntPtr<DiagnosticsEngine> 44243830Sdim Diags(new DiagnosticsEngine(DiagIDs, &CI.getDiagnosticOpts(), 45251662Sdim new ForwardingDiagnosticConsumer( 46251662Sdim *CI.getDiagnostics().getClient()), 47251662Sdim /*ShouldOwnClient=*/true)); 48218893Sdim ASTUnit *Unit = ASTUnit::LoadFromASTFile(ASTFiles[I], Diags, 49218893Sdim CI.getFileSystemOpts(), false); 50203955Srdivacky if (!Unit) 51203955Srdivacky continue; 52203955Srdivacky 53218893Sdim ASTImporter Importer(CI.getASTContext(), 54203955Srdivacky CI.getFileManager(), 55203955Srdivacky Unit->getASTContext(), 56218893Sdim Unit->getFileManager(), 57218893Sdim /*MinimalImport=*/false); 58203955Srdivacky 59203955Srdivacky TranslationUnitDecl *TU = Unit->getASTContext().getTranslationUnitDecl(); 60203955Srdivacky for (DeclContext::decl_iterator D = TU->decls_begin(), 61203955Srdivacky DEnd = TU->decls_end(); 62203955Srdivacky D != DEnd; ++D) { 63203955Srdivacky // Don't re-import __va_list_tag, __builtin_va_list. 64203955Srdivacky if (NamedDecl *ND = dyn_cast<NamedDecl>(*D)) 65203955Srdivacky if (IdentifierInfo *II = ND->getIdentifier()) 66203955Srdivacky if (II->isStr("__va_list_tag") || II->isStr("__builtin_va_list")) 67203955Srdivacky continue; 68203955Srdivacky 69203955Srdivacky Importer.Import(*D); 70203955Srdivacky } 71203955Srdivacky 72203955Srdivacky delete Unit; 73203955Srdivacky } 74203955Srdivacky 75203955Srdivacky AdaptedAction->ExecuteAction(); 76203955Srdivacky CI.getDiagnostics().getClient()->EndSourceFile(); 77203955Srdivacky} 78203955Srdivacky 79203955Srdivackyvoid ASTMergeAction::EndSourceFileAction() { 80203955Srdivacky return AdaptedAction->EndSourceFileAction(); 81203955Srdivacky} 82203955Srdivacky 83203955SrdivackyASTMergeAction::ASTMergeAction(FrontendAction *AdaptedAction, 84234353Sdim ArrayRef<std::string> ASTFiles) 85234353Sdim : AdaptedAction(AdaptedAction), ASTFiles(ASTFiles.begin(), ASTFiles.end()) { 86203955Srdivacky assert(AdaptedAction && "ASTMergeAction needs an action to adapt"); 87203955Srdivacky} 88203955Srdivacky 89203955SrdivackyASTMergeAction::~ASTMergeAction() { 90203955Srdivacky delete AdaptedAction; 91203955Srdivacky} 92203955Srdivacky 93203955Srdivackybool ASTMergeAction::usesPreprocessorOnly() const { 94203955Srdivacky return AdaptedAction->usesPreprocessorOnly(); 95203955Srdivacky} 96203955Srdivacky 97226633SdimTranslationUnitKind ASTMergeAction::getTranslationUnitKind() { 98226633Sdim return AdaptedAction->getTranslationUnitKind(); 99203955Srdivacky} 100203955Srdivacky 101203955Srdivackybool ASTMergeAction::hasPCHSupport() const { 102203955Srdivacky return AdaptedAction->hasPCHSupport(); 103203955Srdivacky} 104203955Srdivacky 105210299Sedbool ASTMergeAction::hasASTFileSupport() const { 106210299Sed return AdaptedAction->hasASTFileSupport(); 107203955Srdivacky} 108203955Srdivacky 109203955Srdivackybool ASTMergeAction::hasCodeCompletionSupport() const { 110203955Srdivacky return AdaptedAction->hasCodeCompletionSupport(); 111203955Srdivacky} 112