106f32e7eSjoerg //===- ExternalASTSource.cpp - Abstract External AST Interface ------------===//
206f32e7eSjoerg //
306f32e7eSjoerg // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
406f32e7eSjoerg // See https://llvm.org/LICENSE.txt for license information.
506f32e7eSjoerg // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
606f32e7eSjoerg //
706f32e7eSjoerg //===----------------------------------------------------------------------===//
806f32e7eSjoerg //
906f32e7eSjoerg //  This file provides the default implementation of the ExternalASTSource
1006f32e7eSjoerg //  interface, which enables construction of AST nodes from some external
1106f32e7eSjoerg //  source.
1206f32e7eSjoerg //
1306f32e7eSjoerg //===----------------------------------------------------------------------===//
1406f32e7eSjoerg 
1506f32e7eSjoerg #include "clang/AST/ExternalASTSource.h"
1606f32e7eSjoerg #include "clang/AST/ASTContext.h"
1706f32e7eSjoerg #include "clang/AST/DeclarationName.h"
18*13fbcb42Sjoerg #include "clang/Basic/FileManager.h"
1906f32e7eSjoerg #include "clang/Basic/IdentifierTable.h"
2006f32e7eSjoerg #include "clang/Basic/LLVM.h"
2106f32e7eSjoerg #include "clang/Basic/Module.h"
22*13fbcb42Sjoerg #include "clang/Basic/SourceManager.h"
2306f32e7eSjoerg #include "llvm/ADT/None.h"
2406f32e7eSjoerg #include "llvm/Support/ErrorHandling.h"
2506f32e7eSjoerg #include <cstdint>
2606f32e7eSjoerg 
2706f32e7eSjoerg using namespace clang;
2806f32e7eSjoerg 
29*13fbcb42Sjoerg char ExternalASTSource::ID;
30*13fbcb42Sjoerg 
3106f32e7eSjoerg ExternalASTSource::~ExternalASTSource() = default;
3206f32e7eSjoerg 
33*13fbcb42Sjoerg llvm::Optional<ASTSourceDescriptor>
getSourceDescriptor(unsigned ID)3406f32e7eSjoerg ExternalASTSource::getSourceDescriptor(unsigned ID) {
3506f32e7eSjoerg   return None;
3606f32e7eSjoerg }
3706f32e7eSjoerg 
3806f32e7eSjoerg ExternalASTSource::ExtKind
hasExternalDefinitions(const Decl * D)3906f32e7eSjoerg ExternalASTSource::hasExternalDefinitions(const Decl *D) {
4006f32e7eSjoerg   return EK_ReplyHazy;
4106f32e7eSjoerg }
4206f32e7eSjoerg 
FindFileRegionDecls(FileID File,unsigned Offset,unsigned Length,SmallVectorImpl<Decl * > & Decls)4306f32e7eSjoerg void ExternalASTSource::FindFileRegionDecls(FileID File, unsigned Offset,
4406f32e7eSjoerg                                             unsigned Length,
4506f32e7eSjoerg                                             SmallVectorImpl<Decl *> &Decls) {}
4606f32e7eSjoerg 
CompleteRedeclChain(const Decl * D)4706f32e7eSjoerg void ExternalASTSource::CompleteRedeclChain(const Decl *D) {}
4806f32e7eSjoerg 
CompleteType(TagDecl * Tag)4906f32e7eSjoerg void ExternalASTSource::CompleteType(TagDecl *Tag) {}
5006f32e7eSjoerg 
CompleteType(ObjCInterfaceDecl * Class)5106f32e7eSjoerg void ExternalASTSource::CompleteType(ObjCInterfaceDecl *Class) {}
5206f32e7eSjoerg 
ReadComments()5306f32e7eSjoerg void ExternalASTSource::ReadComments() {}
5406f32e7eSjoerg 
StartedDeserializing()5506f32e7eSjoerg void ExternalASTSource::StartedDeserializing() {}
5606f32e7eSjoerg 
FinishedDeserializing()5706f32e7eSjoerg void ExternalASTSource::FinishedDeserializing() {}
5806f32e7eSjoerg 
StartTranslationUnit(ASTConsumer * Consumer)5906f32e7eSjoerg void ExternalASTSource::StartTranslationUnit(ASTConsumer *Consumer) {}
6006f32e7eSjoerg 
PrintStats()6106f32e7eSjoerg void ExternalASTSource::PrintStats() {}
6206f32e7eSjoerg 
layoutRecordType(const RecordDecl * Record,uint64_t & Size,uint64_t & Alignment,llvm::DenseMap<const FieldDecl *,uint64_t> & FieldOffsets,llvm::DenseMap<const CXXRecordDecl *,CharUnits> & BaseOffsets,llvm::DenseMap<const CXXRecordDecl *,CharUnits> & VirtualBaseOffsets)6306f32e7eSjoerg bool ExternalASTSource::layoutRecordType(
6406f32e7eSjoerg     const RecordDecl *Record, uint64_t &Size, uint64_t &Alignment,
6506f32e7eSjoerg     llvm::DenseMap<const FieldDecl *, uint64_t> &FieldOffsets,
6606f32e7eSjoerg     llvm::DenseMap<const CXXRecordDecl *, CharUnits> &BaseOffsets,
6706f32e7eSjoerg     llvm::DenseMap<const CXXRecordDecl *, CharUnits> &VirtualBaseOffsets) {
6806f32e7eSjoerg   return false;
6906f32e7eSjoerg }
7006f32e7eSjoerg 
GetExternalDecl(uint32_t ID)7106f32e7eSjoerg Decl *ExternalASTSource::GetExternalDecl(uint32_t ID) {
7206f32e7eSjoerg   return nullptr;
7306f32e7eSjoerg }
7406f32e7eSjoerg 
GetExternalSelector(uint32_t ID)7506f32e7eSjoerg Selector ExternalASTSource::GetExternalSelector(uint32_t ID) {
7606f32e7eSjoerg   return Selector();
7706f32e7eSjoerg }
7806f32e7eSjoerg 
GetNumExternalSelectors()7906f32e7eSjoerg uint32_t ExternalASTSource::GetNumExternalSelectors() {
8006f32e7eSjoerg    return 0;
8106f32e7eSjoerg }
8206f32e7eSjoerg 
GetExternalDeclStmt(uint64_t Offset)8306f32e7eSjoerg Stmt *ExternalASTSource::GetExternalDeclStmt(uint64_t Offset) {
8406f32e7eSjoerg   return nullptr;
8506f32e7eSjoerg }
8606f32e7eSjoerg 
8706f32e7eSjoerg CXXCtorInitializer **
GetExternalCXXCtorInitializers(uint64_t Offset)8806f32e7eSjoerg ExternalASTSource::GetExternalCXXCtorInitializers(uint64_t Offset) {
8906f32e7eSjoerg   return nullptr;
9006f32e7eSjoerg }
9106f32e7eSjoerg 
9206f32e7eSjoerg CXXBaseSpecifier *
GetExternalCXXBaseSpecifiers(uint64_t Offset)9306f32e7eSjoerg ExternalASTSource::GetExternalCXXBaseSpecifiers(uint64_t Offset) {
9406f32e7eSjoerg   return nullptr;
9506f32e7eSjoerg }
9606f32e7eSjoerg 
9706f32e7eSjoerg bool
FindExternalVisibleDeclsByName(const DeclContext * DC,DeclarationName Name)9806f32e7eSjoerg ExternalASTSource::FindExternalVisibleDeclsByName(const DeclContext *DC,
9906f32e7eSjoerg                                                   DeclarationName Name) {
10006f32e7eSjoerg   return false;
10106f32e7eSjoerg }
10206f32e7eSjoerg 
completeVisibleDeclsMap(const DeclContext * DC)10306f32e7eSjoerg void ExternalASTSource::completeVisibleDeclsMap(const DeclContext *DC) {}
10406f32e7eSjoerg 
FindExternalLexicalDecls(const DeclContext * DC,llvm::function_ref<bool (Decl::Kind)> IsKindWeWant,SmallVectorImpl<Decl * > & Result)10506f32e7eSjoerg void ExternalASTSource::FindExternalLexicalDecls(
10606f32e7eSjoerg     const DeclContext *DC, llvm::function_ref<bool(Decl::Kind)> IsKindWeWant,
10706f32e7eSjoerg     SmallVectorImpl<Decl *> &Result) {}
10806f32e7eSjoerg 
getMemoryBufferSizes(MemoryBufferSizes & sizes) const10906f32e7eSjoerg void ExternalASTSource::getMemoryBufferSizes(MemoryBufferSizes &sizes) const {}
11006f32e7eSjoerg 
incrementGeneration(ASTContext & C)11106f32e7eSjoerg uint32_t ExternalASTSource::incrementGeneration(ASTContext &C) {
11206f32e7eSjoerg   uint32_t OldGeneration = CurrentGeneration;
11306f32e7eSjoerg 
11406f32e7eSjoerg   // Make sure the generation of the topmost external source for the context is
11506f32e7eSjoerg   // incremented. That might not be us.
11606f32e7eSjoerg   auto *P = C.getExternalSource();
11706f32e7eSjoerg   if (P && P != this)
11806f32e7eSjoerg     CurrentGeneration = P->incrementGeneration(C);
11906f32e7eSjoerg   else {
12006f32e7eSjoerg     // FIXME: Only bump the generation counter if the current generation number
12106f32e7eSjoerg     // has been observed?
12206f32e7eSjoerg     if (!++CurrentGeneration)
12306f32e7eSjoerg       llvm::report_fatal_error("generation counter overflowed", false);
12406f32e7eSjoerg   }
12506f32e7eSjoerg 
12606f32e7eSjoerg   return OldGeneration;
12706f32e7eSjoerg }
128