10d00c899SEugene Zelenko //===- ExternalASTSource.cpp - Abstract External AST Interface ------------===//
2aa627ba7SAxel Naumann //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6aa627ba7SAxel Naumann //
7aa627ba7SAxel Naumann //===----------------------------------------------------------------------===//
8aa627ba7SAxel Naumann //
9aa627ba7SAxel Naumann //  This file provides the default implementation of the ExternalASTSource
10aa627ba7SAxel Naumann //  interface, which enables construction of AST nodes from some external
11aa627ba7SAxel Naumann //  source.
12aa627ba7SAxel Naumann //
13aa627ba7SAxel Naumann //===----------------------------------------------------------------------===//
14aa627ba7SAxel Naumann 
15aa627ba7SAxel Naumann #include "clang/AST/ExternalASTSource.h"
16053f6c6cSRichard Smith #include "clang/AST/ASTContext.h"
17aa627ba7SAxel Naumann #include "clang/AST/DeclarationName.h"
18*e08464fbSReid Kleckner #include "clang/Basic/FileManager.h"
190d00c899SEugene Zelenko #include "clang/Basic/IdentifierTable.h"
200d00c899SEugene Zelenko #include "clang/Basic/LLVM.h"
21c6458d6aSAdrian Prantl #include "clang/Basic/Module.h"
2286565c13SReid Kleckner #include "clang/Basic/SourceManager.h"
230d00c899SEugene Zelenko #include "llvm/ADT/None.h"
24053f6c6cSRichard Smith #include "llvm/Support/ErrorHandling.h"
250d00c899SEugene Zelenko #include <cstdint>
26aa627ba7SAxel Naumann 
27aa627ba7SAxel Naumann using namespace clang;
28aa627ba7SAxel Naumann 
29aa455849SRaphael Isemann char ExternalASTSource::ID;
30aa455849SRaphael Isemann 
310d00c899SEugene Zelenko ExternalASTSource::~ExternalASTSource() = default;
32aa627ba7SAxel Naumann 
33c915cb95SReid Kleckner llvm::Optional<ASTSourceDescriptor>
getSourceDescriptor(unsigned ID)3415bcf70cSAdrian Prantl ExternalASTSource::getSourceDescriptor(unsigned ID) {
3515bcf70cSAdrian Prantl   return None;
3615bcf70cSAdrian Prantl }
3715bcf70cSAdrian Prantl 
389ffe5a35SDavid Blaikie ExternalASTSource::ExtKind
hasExternalDefinitions(const Decl * D)391ac9c98eSDavid Blaikie ExternalASTSource::hasExternalDefinitions(const Decl *D) {
409ffe5a35SDavid Blaikie   return EK_ReplyHazy;
419ffe5a35SDavid Blaikie }
429ffe5a35SDavid Blaikie 
FindFileRegionDecls(FileID File,unsigned Offset,unsigned Length,SmallVectorImpl<Decl * > & Decls)43f5bbe27dSRafael Espindola void ExternalASTSource::FindFileRegionDecls(FileID File, unsigned Offset,
44f5bbe27dSRafael Espindola                                             unsigned Length,
45f5bbe27dSRafael Espindola                                             SmallVectorImpl<Decl *> &Decls) {}
46f5bbe27dSRafael Espindola 
CompleteRedeclChain(const Decl * D)47f5bbe27dSRafael Espindola void ExternalASTSource::CompleteRedeclChain(const Decl *D) {}
48f5bbe27dSRafael Espindola 
CompleteType(TagDecl * Tag)49f5bbe27dSRafael Espindola void ExternalASTSource::CompleteType(TagDecl *Tag) {}
50f5bbe27dSRafael Espindola 
CompleteType(ObjCInterfaceDecl * Class)51f5bbe27dSRafael Espindola void ExternalASTSource::CompleteType(ObjCInterfaceDecl *Class) {}
52f5bbe27dSRafael Espindola 
ReadComments()53f5bbe27dSRafael Espindola void ExternalASTSource::ReadComments() {}
54f5bbe27dSRafael Espindola 
StartedDeserializing()55f5bbe27dSRafael Espindola void ExternalASTSource::StartedDeserializing() {}
56f5bbe27dSRafael Espindola 
FinishedDeserializing()57f5bbe27dSRafael Espindola void ExternalASTSource::FinishedDeserializing() {}
58f5bbe27dSRafael Espindola 
StartTranslationUnit(ASTConsumer * Consumer)59f5bbe27dSRafael Espindola void ExternalASTSource::StartTranslationUnit(ASTConsumer *Consumer) {}
60f5bbe27dSRafael Espindola 
PrintStats()61aa627ba7SAxel Naumann void ExternalASTSource::PrintStats() {}
62aa627ba7SAxel Naumann 
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)63f5bbe27dSRafael Espindola bool ExternalASTSource::layoutRecordType(
64f5bbe27dSRafael Espindola     const RecordDecl *Record, uint64_t &Size, uint64_t &Alignment,
65f5bbe27dSRafael Espindola     llvm::DenseMap<const FieldDecl *, uint64_t> &FieldOffsets,
66f5bbe27dSRafael Espindola     llvm::DenseMap<const CXXRecordDecl *, CharUnits> &BaseOffsets,
67f5bbe27dSRafael Espindola     llvm::DenseMap<const CXXRecordDecl *, CharUnits> &VirtualBaseOffsets) {
68f5bbe27dSRafael Espindola   return false;
69f5bbe27dSRafael Espindola }
70f5bbe27dSRafael Espindola 
GetExternalDecl(uint32_t ID)71aa627ba7SAxel Naumann Decl *ExternalASTSource::GetExternalDecl(uint32_t ID) {
7236250ad6SCraig Topper   return nullptr;
73aa627ba7SAxel Naumann }
74aa627ba7SAxel Naumann 
GetExternalSelector(uint32_t ID)75aa627ba7SAxel Naumann Selector ExternalASTSource::GetExternalSelector(uint32_t ID) {
76aa627ba7SAxel Naumann   return Selector();
77aa627ba7SAxel Naumann }
78aa627ba7SAxel Naumann 
GetNumExternalSelectors()79aa627ba7SAxel Naumann uint32_t ExternalASTSource::GetNumExternalSelectors() {
80aa627ba7SAxel Naumann    return 0;
81aa627ba7SAxel Naumann }
82aa627ba7SAxel Naumann 
GetExternalDeclStmt(uint64_t Offset)83aa627ba7SAxel Naumann Stmt *ExternalASTSource::GetExternalDeclStmt(uint64_t Offset) {
8436250ad6SCraig Topper   return nullptr;
85aa627ba7SAxel Naumann }
86aa627ba7SAxel Naumann 
87c2bb8186SRichard Smith CXXCtorInitializer **
GetExternalCXXCtorInitializers(uint64_t Offset)88c2bb8186SRichard Smith ExternalASTSource::GetExternalCXXCtorInitializers(uint64_t Offset) {
89c2bb8186SRichard Smith   return nullptr;
90c2bb8186SRichard Smith }
91c2bb8186SRichard Smith 
92aa627ba7SAxel Naumann CXXBaseSpecifier *
GetExternalCXXBaseSpecifiers(uint64_t Offset)93aa627ba7SAxel Naumann ExternalASTSource::GetExternalCXXBaseSpecifiers(uint64_t Offset) {
9436250ad6SCraig Topper   return nullptr;
95aa627ba7SAxel Naumann }
96aa627ba7SAxel Naumann 
979ce12e36SRichard Smith bool
FindExternalVisibleDeclsByName(const DeclContext * DC,DeclarationName Name)98aa627ba7SAxel Naumann ExternalASTSource::FindExternalVisibleDeclsByName(const DeclContext *DC,
99aa627ba7SAxel Naumann                                                   DeclarationName Name) {
1009ce12e36SRichard Smith   return false;
101aa627ba7SAxel Naumann }
102aa627ba7SAxel Naumann 
completeVisibleDeclsMap(const DeclContext * DC)1033cb15729SRichard Smith void ExternalASTSource::completeVisibleDeclsMap(const DeclContext *DC) {}
1042bd0ab2bSNick Lewycky 
FindExternalLexicalDecls(const DeclContext * DC,llvm::function_ref<bool (Decl::Kind)> IsKindWeWant,SmallVectorImpl<Decl * > & Result)1053cb15729SRichard Smith void ExternalASTSource::FindExternalLexicalDecls(
1063cb15729SRichard Smith     const DeclContext *DC, llvm::function_ref<bool(Decl::Kind)> IsKindWeWant,
1073cb15729SRichard Smith     SmallVectorImpl<Decl *> &Result) {}
108ed35df17SAxel Naumann 
getMemoryBufferSizes(MemoryBufferSizes & sizes) const109ed35df17SAxel Naumann void ExternalASTSource::getMemoryBufferSizes(MemoryBufferSizes &sizes) const {}
110053f6c6cSRichard Smith 
incrementGeneration(ASTContext & C)111053f6c6cSRichard Smith uint32_t ExternalASTSource::incrementGeneration(ASTContext &C) {
112053f6c6cSRichard Smith   uint32_t OldGeneration = CurrentGeneration;
113053f6c6cSRichard Smith 
114053f6c6cSRichard Smith   // Make sure the generation of the topmost external source for the context is
115053f6c6cSRichard Smith   // incremented. That might not be us.
116053f6c6cSRichard Smith   auto *P = C.getExternalSource();
117053f6c6cSRichard Smith   if (P && P != this)
118053f6c6cSRichard Smith     CurrentGeneration = P->incrementGeneration(C);
119053f6c6cSRichard Smith   else {
120053f6c6cSRichard Smith     // FIXME: Only bump the generation counter if the current generation number
121053f6c6cSRichard Smith     // has been observed?
122053f6c6cSRichard Smith     if (!++CurrentGeneration)
123053f6c6cSRichard Smith       llvm::report_fatal_error("generation counter overflowed", false);
124053f6c6cSRichard Smith   }
125053f6c6cSRichard Smith 
126053f6c6cSRichard Smith   return OldGeneration;
127053f6c6cSRichard Smith }
128