1221339Sdim//===- ExternalASTSource.cpp - Abstract External AST Interface --*- C++ -*-===//
2221339Sdim//
3221339Sdim//                     The LLVM Compiler Infrastructure
4221339Sdim//
5221339Sdim// This file is distributed under the University of Illinois Open Source
6221339Sdim// License. See LICENSE.TXT for details.
7221339Sdim//
8221339Sdim//===----------------------------------------------------------------------===//
9221339Sdim//
10221339Sdim//  This file provides the default implementation of the ExternalASTSource
11221339Sdim//  interface, which enables construction of AST nodes from some external
12221339Sdim//  source.
13221339Sdim//
14221339Sdim//===----------------------------------------------------------------------===//
15221339Sdim
16221339Sdim#include "clang/AST/ExternalASTSource.h"
17276479Sdim#include "clang/AST/ASTContext.h"
18221339Sdim#include "clang/AST/DeclarationName.h"
19296417Sdim#include "clang/Basic/Module.h"
20276479Sdim#include "llvm/Support/ErrorHandling.h"
21221339Sdim
22221339Sdimusing namespace clang;
23221339Sdim
24221339SdimExternalASTSource::~ExternalASTSource() { }
25221339Sdim
26288943Sdimllvm::Optional<ExternalASTSource::ASTSourceDescriptor>
27288943SdimExternalASTSource::getSourceDescriptor(unsigned ID) {
28288943Sdim  return None;
29288943Sdim}
30288943Sdim
31296417SdimExternalASTSource::ASTSourceDescriptor::ASTSourceDescriptor(const Module &M)
32296417Sdim  : Signature(M.Signature), ClangModule(&M) {
33296417Sdim  if (M.Directory)
34296417Sdim    Path = M.Directory->getName();
35296417Sdim  if (auto *File = M.getASTFile())
36296417Sdim    ASTFile = File->getName();
37288943Sdim}
38288943Sdim
39296417Sdimstd::string ExternalASTSource::ASTSourceDescriptor::getModuleName() const {
40296417Sdim  if (ClangModule)
41296417Sdim    return ClangModule->Name;
42296417Sdim  else
43296417Sdim    return PCHModuleName;
44296417Sdim}
45296417Sdim
46276479Sdimvoid ExternalASTSource::FindFileRegionDecls(FileID File, unsigned Offset,
47276479Sdim                                            unsigned Length,
48276479Sdim                                            SmallVectorImpl<Decl *> &Decls) {}
49276479Sdim
50276479Sdimvoid ExternalASTSource::CompleteRedeclChain(const Decl *D) {}
51276479Sdim
52276479Sdimvoid ExternalASTSource::CompleteType(TagDecl *Tag) {}
53276479Sdim
54276479Sdimvoid ExternalASTSource::CompleteType(ObjCInterfaceDecl *Class) {}
55276479Sdim
56276479Sdimvoid ExternalASTSource::ReadComments() {}
57276479Sdim
58276479Sdimvoid ExternalASTSource::StartedDeserializing() {}
59276479Sdim
60276479Sdimvoid ExternalASTSource::FinishedDeserializing() {}
61276479Sdim
62276479Sdimvoid ExternalASTSource::StartTranslationUnit(ASTConsumer *Consumer) {}
63276479Sdim
64221339Sdimvoid ExternalASTSource::PrintStats() { }
65221339Sdim
66276479Sdimbool ExternalASTSource::layoutRecordType(
67276479Sdim    const RecordDecl *Record, uint64_t &Size, uint64_t &Alignment,
68276479Sdim    llvm::DenseMap<const FieldDecl *, uint64_t> &FieldOffsets,
69276479Sdim    llvm::DenseMap<const CXXRecordDecl *, CharUnits> &BaseOffsets,
70276479Sdim    llvm::DenseMap<const CXXRecordDecl *, CharUnits> &VirtualBaseOffsets) {
71276479Sdim  return false;
72276479Sdim}
73276479Sdim
74221339SdimDecl *ExternalASTSource::GetExternalDecl(uint32_t ID) {
75276479Sdim  return nullptr;
76221339Sdim}
77221339Sdim
78221339SdimSelector ExternalASTSource::GetExternalSelector(uint32_t ID) {
79221339Sdim  return Selector();
80221339Sdim}
81221339Sdim
82221339Sdimuint32_t ExternalASTSource::GetNumExternalSelectors() {
83221339Sdim   return 0;
84221339Sdim}
85221339Sdim
86221339SdimStmt *ExternalASTSource::GetExternalDeclStmt(uint64_t Offset) {
87276479Sdim  return nullptr;
88221339Sdim}
89221339Sdim
90288943SdimCXXCtorInitializer **
91288943SdimExternalASTSource::GetExternalCXXCtorInitializers(uint64_t Offset) {
92288943Sdim  return nullptr;
93288943Sdim}
94288943Sdim
95221339SdimCXXBaseSpecifier *
96221339SdimExternalASTSource::GetExternalCXXBaseSpecifiers(uint64_t Offset) {
97276479Sdim  return nullptr;
98221339Sdim}
99221339Sdim
100249423Sdimbool
101221339SdimExternalASTSource::FindExternalVisibleDeclsByName(const DeclContext *DC,
102221339Sdim                                                  DeclarationName Name) {
103249423Sdim  return false;
104221339Sdim}
105221339Sdim
106296417Sdimvoid ExternalASTSource::completeVisibleDeclsMap(const DeclContext *DC) {}
107234982Sdim
108296417Sdimvoid ExternalASTSource::FindExternalLexicalDecls(
109296417Sdim    const DeclContext *DC, llvm::function_ref<bool(Decl::Kind)> IsKindWeWant,
110296417Sdim    SmallVectorImpl<Decl *> &Result) {}
111223017Sdim
112296417Sdimvoid ExternalASTSource::getMemoryBufferSizes(MemoryBufferSizes &sizes) const {}
113276479Sdim
114276479Sdimuint32_t ExternalASTSource::incrementGeneration(ASTContext &C) {
115276479Sdim  uint32_t OldGeneration = CurrentGeneration;
116276479Sdim
117276479Sdim  // Make sure the generation of the topmost external source for the context is
118276479Sdim  // incremented. That might not be us.
119276479Sdim  auto *P = C.getExternalSource();
120276479Sdim  if (P && P != this)
121276479Sdim    CurrentGeneration = P->incrementGeneration(C);
122276479Sdim  else {
123276479Sdim    // FIXME: Only bump the generation counter if the current generation number
124276479Sdim    // has been observed?
125276479Sdim    if (!++CurrentGeneration)
126276479Sdim      llvm::report_fatal_error("generation counter overflowed", false);
127276479Sdim  }
128276479Sdim
129276479Sdim  return OldGeneration;
130276479Sdim}
131