1*67e74705SXin Li //===- ExternalASTSource.cpp - Abstract External AST Interface --*- C++ -*-===//
2*67e74705SXin Li //
3*67e74705SXin Li // The LLVM Compiler Infrastructure
4*67e74705SXin Li //
5*67e74705SXin Li // This file is distributed under the University of Illinois Open Source
6*67e74705SXin Li // License. See LICENSE.TXT for details.
7*67e74705SXin Li //
8*67e74705SXin Li //===----------------------------------------------------------------------===//
9*67e74705SXin Li //
10*67e74705SXin Li // This file provides the default implementation of the ExternalASTSource
11*67e74705SXin Li // interface, which enables construction of AST nodes from some external
12*67e74705SXin Li // source.
13*67e74705SXin Li //
14*67e74705SXin Li //===----------------------------------------------------------------------===//
15*67e74705SXin Li
16*67e74705SXin Li #include "clang/AST/ExternalASTSource.h"
17*67e74705SXin Li #include "clang/AST/ASTContext.h"
18*67e74705SXin Li #include "clang/AST/DeclarationName.h"
19*67e74705SXin Li #include "clang/Basic/Module.h"
20*67e74705SXin Li #include "llvm/Support/ErrorHandling.h"
21*67e74705SXin Li
22*67e74705SXin Li using namespace clang;
23*67e74705SXin Li
~ExternalASTSource()24*67e74705SXin Li ExternalASTSource::~ExternalASTSource() { }
25*67e74705SXin Li
26*67e74705SXin Li llvm::Optional<ExternalASTSource::ASTSourceDescriptor>
getSourceDescriptor(unsigned ID)27*67e74705SXin Li ExternalASTSource::getSourceDescriptor(unsigned ID) {
28*67e74705SXin Li return None;
29*67e74705SXin Li }
30*67e74705SXin Li
ASTSourceDescriptor(const Module & M)31*67e74705SXin Li ExternalASTSource::ASTSourceDescriptor::ASTSourceDescriptor(const Module &M)
32*67e74705SXin Li : Signature(M.Signature), ClangModule(&M) {
33*67e74705SXin Li if (M.Directory)
34*67e74705SXin Li Path = M.Directory->getName();
35*67e74705SXin Li if (auto *File = M.getASTFile())
36*67e74705SXin Li ASTFile = File->getName();
37*67e74705SXin Li }
38*67e74705SXin Li
getModuleName() const39*67e74705SXin Li std::string ExternalASTSource::ASTSourceDescriptor::getModuleName() const {
40*67e74705SXin Li if (ClangModule)
41*67e74705SXin Li return ClangModule->Name;
42*67e74705SXin Li else
43*67e74705SXin Li return PCHModuleName;
44*67e74705SXin Li }
45*67e74705SXin Li
FindFileRegionDecls(FileID File,unsigned Offset,unsigned Length,SmallVectorImpl<Decl * > & Decls)46*67e74705SXin Li void ExternalASTSource::FindFileRegionDecls(FileID File, unsigned Offset,
47*67e74705SXin Li unsigned Length,
48*67e74705SXin Li SmallVectorImpl<Decl *> &Decls) {}
49*67e74705SXin Li
CompleteRedeclChain(const Decl * D)50*67e74705SXin Li void ExternalASTSource::CompleteRedeclChain(const Decl *D) {}
51*67e74705SXin Li
CompleteType(TagDecl * Tag)52*67e74705SXin Li void ExternalASTSource::CompleteType(TagDecl *Tag) {}
53*67e74705SXin Li
CompleteType(ObjCInterfaceDecl * Class)54*67e74705SXin Li void ExternalASTSource::CompleteType(ObjCInterfaceDecl *Class) {}
55*67e74705SXin Li
ReadComments()56*67e74705SXin Li void ExternalASTSource::ReadComments() {}
57*67e74705SXin Li
StartedDeserializing()58*67e74705SXin Li void ExternalASTSource::StartedDeserializing() {}
59*67e74705SXin Li
FinishedDeserializing()60*67e74705SXin Li void ExternalASTSource::FinishedDeserializing() {}
61*67e74705SXin Li
StartTranslationUnit(ASTConsumer * Consumer)62*67e74705SXin Li void ExternalASTSource::StartTranslationUnit(ASTConsumer *Consumer) {}
63*67e74705SXin Li
PrintStats()64*67e74705SXin Li void ExternalASTSource::PrintStats() { }
65*67e74705SXin Li
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)66*67e74705SXin Li bool ExternalASTSource::layoutRecordType(
67*67e74705SXin Li const RecordDecl *Record, uint64_t &Size, uint64_t &Alignment,
68*67e74705SXin Li llvm::DenseMap<const FieldDecl *, uint64_t> &FieldOffsets,
69*67e74705SXin Li llvm::DenseMap<const CXXRecordDecl *, CharUnits> &BaseOffsets,
70*67e74705SXin Li llvm::DenseMap<const CXXRecordDecl *, CharUnits> &VirtualBaseOffsets) {
71*67e74705SXin Li return false;
72*67e74705SXin Li }
73*67e74705SXin Li
GetExternalDecl(uint32_t ID)74*67e74705SXin Li Decl *ExternalASTSource::GetExternalDecl(uint32_t ID) {
75*67e74705SXin Li return nullptr;
76*67e74705SXin Li }
77*67e74705SXin Li
GetExternalSelector(uint32_t ID)78*67e74705SXin Li Selector ExternalASTSource::GetExternalSelector(uint32_t ID) {
79*67e74705SXin Li return Selector();
80*67e74705SXin Li }
81*67e74705SXin Li
GetNumExternalSelectors()82*67e74705SXin Li uint32_t ExternalASTSource::GetNumExternalSelectors() {
83*67e74705SXin Li return 0;
84*67e74705SXin Li }
85*67e74705SXin Li
GetExternalDeclStmt(uint64_t Offset)86*67e74705SXin Li Stmt *ExternalASTSource::GetExternalDeclStmt(uint64_t Offset) {
87*67e74705SXin Li return nullptr;
88*67e74705SXin Li }
89*67e74705SXin Li
90*67e74705SXin Li CXXCtorInitializer **
GetExternalCXXCtorInitializers(uint64_t Offset)91*67e74705SXin Li ExternalASTSource::GetExternalCXXCtorInitializers(uint64_t Offset) {
92*67e74705SXin Li return nullptr;
93*67e74705SXin Li }
94*67e74705SXin Li
95*67e74705SXin Li CXXBaseSpecifier *
GetExternalCXXBaseSpecifiers(uint64_t Offset)96*67e74705SXin Li ExternalASTSource::GetExternalCXXBaseSpecifiers(uint64_t Offset) {
97*67e74705SXin Li return nullptr;
98*67e74705SXin Li }
99*67e74705SXin Li
100*67e74705SXin Li bool
FindExternalVisibleDeclsByName(const DeclContext * DC,DeclarationName Name)101*67e74705SXin Li ExternalASTSource::FindExternalVisibleDeclsByName(const DeclContext *DC,
102*67e74705SXin Li DeclarationName Name) {
103*67e74705SXin Li return false;
104*67e74705SXin Li }
105*67e74705SXin Li
completeVisibleDeclsMap(const DeclContext * DC)106*67e74705SXin Li void ExternalASTSource::completeVisibleDeclsMap(const DeclContext *DC) {}
107*67e74705SXin Li
FindExternalLexicalDecls(const DeclContext * DC,llvm::function_ref<bool (Decl::Kind)> IsKindWeWant,SmallVectorImpl<Decl * > & Result)108*67e74705SXin Li void ExternalASTSource::FindExternalLexicalDecls(
109*67e74705SXin Li const DeclContext *DC, llvm::function_ref<bool(Decl::Kind)> IsKindWeWant,
110*67e74705SXin Li SmallVectorImpl<Decl *> &Result) {}
111*67e74705SXin Li
getMemoryBufferSizes(MemoryBufferSizes & sizes) const112*67e74705SXin Li void ExternalASTSource::getMemoryBufferSizes(MemoryBufferSizes &sizes) const {}
113*67e74705SXin Li
incrementGeneration(ASTContext & C)114*67e74705SXin Li uint32_t ExternalASTSource::incrementGeneration(ASTContext &C) {
115*67e74705SXin Li uint32_t OldGeneration = CurrentGeneration;
116*67e74705SXin Li
117*67e74705SXin Li // Make sure the generation of the topmost external source for the context is
118*67e74705SXin Li // incremented. That might not be us.
119*67e74705SXin Li auto *P = C.getExternalSource();
120*67e74705SXin Li if (P && P != this)
121*67e74705SXin Li CurrentGeneration = P->incrementGeneration(C);
122*67e74705SXin Li else {
123*67e74705SXin Li // FIXME: Only bump the generation counter if the current generation number
124*67e74705SXin Li // has been observed?
125*67e74705SXin Li if (!++CurrentGeneration)
126*67e74705SXin Li llvm::report_fatal_error("generation counter overflowed", false);
127*67e74705SXin Li }
128*67e74705SXin Li
129*67e74705SXin Li return OldGeneration;
130*67e74705SXin Li }
131