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