//===- ExternalASTSource.cpp - Abstract External AST Interface --*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // This file provides the default implementation of the ExternalASTSource // interface, which enables construction of AST nodes from some external // source. // //===----------------------------------------------------------------------===// #include "clang/AST/ExternalASTSource.h" #include "clang/AST/ASTContext.h" #include "clang/AST/DeclarationName.h" #include "clang/Basic/Module.h" #include "llvm/Support/ErrorHandling.h" using namespace clang; ExternalASTSource::~ExternalASTSource() { } llvm::Optional ExternalASTSource::getSourceDescriptor(unsigned ID) { return None; } ExternalASTSource::ExtKind ExternalASTSource::hasExternalDefinitions(const Decl *D) { return EK_ReplyHazy; } ExternalASTSource::ASTSourceDescriptor::ASTSourceDescriptor(const Module &M) : Signature(M.Signature), ClangModule(&M) { if (M.Directory) Path = M.Directory->getName(); if (auto *File = M.getASTFile()) ASTFile = File->getName(); } std::string ExternalASTSource::ASTSourceDescriptor::getModuleName() const { if (ClangModule) return ClangModule->Name; else return PCHModuleName; } void ExternalASTSource::FindFileRegionDecls(FileID File, unsigned Offset, unsigned Length, SmallVectorImpl &Decls) {} void ExternalASTSource::CompleteRedeclChain(const Decl *D) {} void ExternalASTSource::CompleteType(TagDecl *Tag) {} void ExternalASTSource::CompleteType(ObjCInterfaceDecl *Class) {} void ExternalASTSource::ReadComments() {} void ExternalASTSource::StartedDeserializing() {} void ExternalASTSource::FinishedDeserializing() {} void ExternalASTSource::StartTranslationUnit(ASTConsumer *Consumer) {} void ExternalASTSource::PrintStats() { } bool ExternalASTSource::layoutRecordType( const RecordDecl *Record, uint64_t &Size, uint64_t &Alignment, llvm::DenseMap &FieldOffsets, llvm::DenseMap &BaseOffsets, llvm::DenseMap &VirtualBaseOffsets) { return false; } Decl *ExternalASTSource::GetExternalDecl(uint32_t ID) { return nullptr; } Selector ExternalASTSource::GetExternalSelector(uint32_t ID) { return Selector(); } uint32_t ExternalASTSource::GetNumExternalSelectors() { return 0; } Stmt *ExternalASTSource::GetExternalDeclStmt(uint64_t Offset) { return nullptr; } CXXCtorInitializer ** ExternalASTSource::GetExternalCXXCtorInitializers(uint64_t Offset) { return nullptr; } CXXBaseSpecifier * ExternalASTSource::GetExternalCXXBaseSpecifiers(uint64_t Offset) { return nullptr; } bool ExternalASTSource::FindExternalVisibleDeclsByName(const DeclContext *DC, DeclarationName Name) { return false; } void ExternalASTSource::completeVisibleDeclsMap(const DeclContext *DC) {} void ExternalASTSource::FindExternalLexicalDecls( const DeclContext *DC, llvm::function_ref IsKindWeWant, SmallVectorImpl &Result) {} void ExternalASTSource::getMemoryBufferSizes(MemoryBufferSizes &sizes) const {} uint32_t ExternalASTSource::incrementGeneration(ASTContext &C) { uint32_t OldGeneration = CurrentGeneration; // Make sure the generation of the topmost external source for the context is // incremented. That might not be us. auto *P = C.getExternalSource(); if (P && P != this) CurrentGeneration = P->incrementGeneration(C); else { // FIXME: Only bump the generation counter if the current generation number // has been observed? if (!++CurrentGeneration) llvm::report_fatal_error("generation counter overflowed", false); } return OldGeneration; }