ASTMerge.cpp revision 243830
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, 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( 37234353Sdim 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(), 45243830Sdim CI.getDiagnostics().getClient(), 46243830Sdim /*ShouldOwnClient=*/false)); 47218893Sdim ASTUnit *Unit = ASTUnit::LoadFromASTFile(ASTFiles[I], Diags, 48218893Sdim CI.getFileSystemOpts(), false); 49203955Srdivacky if (!Unit) 50203955Srdivacky continue; 51203955Srdivacky 52218893Sdim ASTImporter Importer(CI.getASTContext(), 53203955Srdivacky CI.getFileManager(), 54203955Srdivacky Unit->getASTContext(), 55218893Sdim Unit->getFileManager(), 56218893Sdim /*MinimalImport=*/false); 57203955Srdivacky 58203955Srdivacky TranslationUnitDecl *TU = Unit->getASTContext().getTranslationUnitDecl(); 59203955Srdivacky for (DeclContext::decl_iterator D = TU->decls_begin(), 60203955Srdivacky DEnd = TU->decls_end(); 61203955Srdivacky D != DEnd; ++D) { 62203955Srdivacky // Don't re-import __va_list_tag, __builtin_va_list. 63203955Srdivacky if (NamedDecl *ND = dyn_cast<NamedDecl>(*D)) 64203955Srdivacky if (IdentifierInfo *II = ND->getIdentifier()) 65203955Srdivacky if (II->isStr("__va_list_tag") || II->isStr("__builtin_va_list")) 66203955Srdivacky continue; 67203955Srdivacky 68203955Srdivacky Importer.Import(*D); 69203955Srdivacky } 70203955Srdivacky 71203955Srdivacky delete Unit; 72203955Srdivacky } 73203955Srdivacky 74203955Srdivacky AdaptedAction->ExecuteAction(); 75203955Srdivacky CI.getDiagnostics().getClient()->EndSourceFile(); 76203955Srdivacky} 77203955Srdivacky 78203955Srdivackyvoid ASTMergeAction::EndSourceFileAction() { 79203955Srdivacky return AdaptedAction->EndSourceFileAction(); 80203955Srdivacky} 81203955Srdivacky 82203955SrdivackyASTMergeAction::ASTMergeAction(FrontendAction *AdaptedAction, 83234353Sdim ArrayRef<std::string> ASTFiles) 84234353Sdim : AdaptedAction(AdaptedAction), ASTFiles(ASTFiles.begin(), ASTFiles.end()) { 85203955Srdivacky assert(AdaptedAction && "ASTMergeAction needs an action to adapt"); 86203955Srdivacky} 87203955Srdivacky 88203955SrdivackyASTMergeAction::~ASTMergeAction() { 89203955Srdivacky delete AdaptedAction; 90203955Srdivacky} 91203955Srdivacky 92203955Srdivackybool ASTMergeAction::usesPreprocessorOnly() const { 93203955Srdivacky return AdaptedAction->usesPreprocessorOnly(); 94203955Srdivacky} 95203955Srdivacky 96226633SdimTranslationUnitKind ASTMergeAction::getTranslationUnitKind() { 97226633Sdim return AdaptedAction->getTranslationUnitKind(); 98203955Srdivacky} 99203955Srdivacky 100203955Srdivackybool ASTMergeAction::hasPCHSupport() const { 101203955Srdivacky return AdaptedAction->hasPCHSupport(); 102203955Srdivacky} 103203955Srdivacky 104210299Sedbool ASTMergeAction::hasASTFileSupport() const { 105210299Sed return AdaptedAction->hasASTFileSupport(); 106203955Srdivacky} 107203955Srdivacky 108203955Srdivackybool ASTMergeAction::hasCodeCompletionSupport() const { 109203955Srdivacky return AdaptedAction->hasCodeCompletionSupport(); 110203955Srdivacky} 111