Clang Project

clang_source_code/include/clang/Sema/ExternalSemaSource.h
1//===--- ExternalSemaSource.h - External Sema Interface ---------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9//  This file defines the ExternalSemaSource interface.
10//
11//===----------------------------------------------------------------------===//
12#ifndef LLVM_CLANG_SEMA_EXTERNALSEMASOURCE_H
13#define LLVM_CLANG_SEMA_EXTERNALSEMASOURCE_H
14
15#include "clang/AST/ExternalASTSource.h"
16#include "clang/AST/Type.h"
17#include "clang/Sema/TypoCorrection.h"
18#include "clang/Sema/Weak.h"
19#include "llvm/ADT/MapVector.h"
20#include <utility>
21
22namespace llvm {
23template <class T, unsigned n> class SmallSetVector;
24}
25
26namespace clang {
27
28class CXXConstructorDecl;
29class CXXDeleteExpr;
30class CXXRecordDecl;
31class DeclaratorDecl;
32class LookupResult;
33struct ObjCMethodList;
34class Scope;
35class Sema;
36class TypedefNameDecl;
37class ValueDecl;
38class VarDecl;
39struct LateParsedTemplate;
40
41/// A simple structure that captures a vtable use for the purposes of
42/// the \c ExternalSemaSource.
43struct ExternalVTableUse {
44  CXXRecordDecl *Record;
45  SourceLocation Location;
46  bool DefinitionRequired;
47};
48
49/// An abstract interface that should be implemented by
50/// external AST sources that also provide information for semantic
51/// analysis.
52class ExternalSemaSource : public ExternalASTSource {
53public:
54  ExternalSemaSource() {
55    ExternalASTSource::SemaSource = true;
56  }
57
58  ~ExternalSemaSource() override;
59
60  /// Initialize the semantic source with the Sema instance
61  /// being used to perform semantic analysis on the abstract syntax
62  /// tree.
63  virtual void InitializeSema(Sema &S) {}
64
65  /// Inform the semantic consumer that Sema is no longer available.
66  virtual void ForgetSema() {}
67
68  /// Load the contents of the global method pool for a given
69  /// selector.
70  virtual void ReadMethodPool(Selector Sel);
71
72  /// Load the contents of the global method pool for a given
73  /// selector if necessary.
74  virtual void updateOutOfDateSelector(Selector Sel);
75
76  /// Load the set of namespaces that are known to the external source,
77  /// which will be used during typo correction.
78  virtual void ReadKnownNamespaces(
79                           SmallVectorImpl<NamespaceDecl *> &Namespaces);
80
81  /// Load the set of used but not defined functions or variables with
82  /// internal linkage, or used but not defined internal functions.
83  virtual void
84  ReadUndefinedButUsed(llvm::MapVector<NamedDecl *, SourceLocation> &Undefined);
85
86  virtual void ReadMismatchingDeleteExpressions(llvm::MapVector<
87      FieldDecl *, llvm::SmallVector<std::pair<SourceLocation, bool>, 4>> &);
88
89  /// Do last resort, unqualified lookup on a LookupResult that
90  /// Sema cannot find.
91  ///
92  /// \param R a LookupResult that is being recovered.
93  ///
94  /// \param S the Scope of the identifier occurrence.
95  ///
96  /// \return true to tell Sema to recover using the LookupResult.
97  virtual bool LookupUnqualified(LookupResult &RScope *S) { return false; }
98
99  /// Read the set of tentative definitions known to the external Sema
100  /// source.
101  ///
102  /// The external source should append its own tentative definitions to the
103  /// given vector of tentative definitions. Note that this routine may be
104  /// invoked multiple times; the external source should take care not to
105  /// introduce the same declarations repeatedly.
106  virtual void ReadTentativeDefinitions(
107                                  SmallVectorImpl<VarDecl *> &TentativeDefs) {}
108
109  /// Read the set of unused file-scope declarations known to the
110  /// external Sema source.
111  ///
112  /// The external source should append its own unused, filed-scope to the
113  /// given vector of declarations. Note that this routine may be
114  /// invoked multiple times; the external source should take care not to
115  /// introduce the same declarations repeatedly.
116  virtual void ReadUnusedFileScopedDecls(
117                 SmallVectorImpl<const DeclaratorDecl *> &Decls) {}
118
119  /// Read the set of delegating constructors known to the
120  /// external Sema source.
121  ///
122  /// The external source should append its own delegating constructors to the
123  /// given vector of declarations. Note that this routine may be
124  /// invoked multiple times; the external source should take care not to
125  /// introduce the same declarations repeatedly.
126  virtual void ReadDelegatingConstructors(
127                 SmallVectorImpl<CXXConstructorDecl *> &Decls) {}
128
129  /// Read the set of ext_vector type declarations known to the
130  /// external Sema source.
131  ///
132  /// The external source should append its own ext_vector type declarations to
133  /// the given vector of declarations. Note that this routine may be
134  /// invoked multiple times; the external source should take care not to
135  /// introduce the same declarations repeatedly.
136  virtual void ReadExtVectorDecls(SmallVectorImpl<TypedefNameDecl *> &Decls) {}
137
138  /// Read the set of potentially unused typedefs known to the source.
139  ///
140  /// The external source should append its own potentially unused local
141  /// typedefs to the given vector of declarations. Note that this routine may
142  /// be invoked multiple times; the external source should take care not to
143  /// introduce the same declarations repeatedly.
144  virtual void ReadUnusedLocalTypedefNameCandidates(
145      llvm::SmallSetVector<const TypedefNameDecl *, 4> &Decls) {}
146
147  /// Read the set of referenced selectors known to the
148  /// external Sema source.
149  ///
150  /// The external source should append its own referenced selectors to the
151  /// given vector of selectors. Note that this routine
152  /// may be invoked multiple times; the external source should take care not
153  /// to introduce the same selectors repeatedly.
154  virtual void ReadReferencedSelectors(
155                 SmallVectorImpl<std::pair<SelectorSourceLocation> > &Sels) {}
156
157  /// Read the set of weak, undeclared identifiers known to the
158  /// external Sema source.
159  ///
160  /// The external source should append its own weak, undeclared identifiers to
161  /// the given vector. Note that this routine may be invoked multiple times;
162  /// the external source should take care not to introduce the same identifiers
163  /// repeatedly.
164  virtual void ReadWeakUndeclaredIdentifiers(
165                 SmallVectorImpl<std::pair<IdentifierInfo *, WeakInfo> > &WI) {}
166
167  /// Read the set of used vtables known to the external Sema source.
168  ///
169  /// The external source should append its own used vtables to the given
170  /// vector. Note that this routine may be invoked multiple times; the external
171  /// source should take care not to introduce the same vtables repeatedly.
172  virtual void ReadUsedVTables(SmallVectorImpl<ExternalVTableUse> &VTables) {}
173
174  /// Read the set of pending instantiations known to the external
175  /// Sema source.
176  ///
177  /// The external source should append its own pending instantiations to the
178  /// given vector. Note that this routine may be invoked multiple times; the
179  /// external source should take care not to introduce the same instantiations
180  /// repeatedly.
181  virtual void ReadPendingInstantiations(
182                 SmallVectorImpl<std::pair<ValueDecl *,
183                                           SourceLocation> > &Pending) {}
184
185  /// Read the set of late parsed template functions for this source.
186  ///
187  /// The external source should insert its own late parsed template functions
188  /// into the map. Note that this routine may be invoked multiple times; the
189  /// external source should take care not to introduce the same map entries
190  /// repeatedly.
191  virtual void ReadLateParsedTemplates(
192      llvm::MapVector<const FunctionDecl *, std::unique_ptr<LateParsedTemplate>>
193          &LPTMap) {}
194
195  /// \copydoc Sema::CorrectTypo
196  /// \note LookupKind must correspond to a valid Sema::LookupNameKind
197  ///
198  /// ExternalSemaSource::CorrectTypo is always given the first chance to
199  /// correct a typo (really, to offer suggestions to repair a failed lookup).
200  /// It will even be called when SpellChecking is turned off or after a
201  /// fatal error has already been detected.
202  virtual TypoCorrection CorrectTypo(const DeclarationNameInfo &Typo,
203                                     int LookupKindScope *SCXXScopeSpec *SS,
204                                     CorrectionCandidateCallback &CCC,
205                                     DeclContext *MemberContext,
206                                     bool EnteringContext,
207                                     const ObjCObjectPointerType *OPT) {
208    return TypoCorrection();
209  }
210
211  /// Produces a diagnostic note if the external source contains a
212  /// complete definition for \p T.
213  ///
214  /// \param Loc the location at which a complete type was required but not
215  /// provided
216  ///
217  /// \param T the \c QualType that should have been complete at \p Loc
218  ///
219  /// \return true if a diagnostic was produced, false otherwise.
220  virtual bool MaybeDiagnoseMissingCompleteType(SourceLocation Loc,
221                                                QualType T) {
222    return false;
223  }
224
225  // isa/cast/dyn_cast support
226  static bool classof(const ExternalASTSource *Source) {
227    return Source->SemaSource;
228  }
229};
230
231// end namespace clang
232
233#endif
234
clang::ExternalVTableUse::Record
clang::ExternalVTableUse::Location
clang::ExternalVTableUse::DefinitionRequired
clang::ExternalSemaSource::InitializeSema
clang::ExternalSemaSource::ForgetSema
clang::ExternalSemaSource::ReadMethodPool
clang::ExternalSemaSource::updateOutOfDateSelector
clang::ExternalSemaSource::ReadKnownNamespaces
clang::ExternalSemaSource::ReadUndefinedButUsed
clang::ExternalSemaSource::ReadMismatchingDeleteExpressions
clang::ExternalSemaSource::LookupUnqualified
clang::ExternalSemaSource::ReadTentativeDefinitions
clang::ExternalSemaSource::ReadUnusedFileScopedDecls
clang::ExternalSemaSource::ReadDelegatingConstructors
clang::ExternalSemaSource::ReadExtVectorDecls
clang::ExternalSemaSource::ReadUnusedLocalTypedefNameCandidates
clang::ExternalSemaSource::ReadReferencedSelectors
clang::ExternalSemaSource::ReadWeakUndeclaredIdentifiers
clang::ExternalSemaSource::ReadUsedVTables
clang::ExternalSemaSource::ReadPendingInstantiations
clang::ExternalSemaSource::ReadLateParsedTemplates
clang::ExternalSemaSource::CorrectTypo
clang::ExternalSemaSource::MaybeDiagnoseMissingCompleteType
clang::ExternalSemaSource::classof