1 //===--- ExternalSemaSource.h - External Sema Interface ---------*- C++ -*-===//
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
7 //===----------------------------------------------------------------------===//
9 // This file defines the ExternalSemaSource interface.
11 //===----------------------------------------------------------------------===//
12 #ifndef LLVM_CLANG_SEMA_EXTERNALSEMASOURCE_H
13 #define LLVM_CLANG_SEMA_EXTERNALSEMASOURCE_H
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"
23 template <class T, unsigned n> class SmallSetVector;
28 class CXXConstructorDecl;
33 struct ObjCMethodList;
36 class TypedefNameDecl;
39 struct LateParsedTemplate;
41 /// A simple structure that captures a vtable use for the purposes of
42 /// the \c ExternalSemaSource.
43 struct ExternalVTableUse {
44 CXXRecordDecl *Record;
45 SourceLocation Location;
46 bool DefinitionRequired;
49 /// An abstract interface that should be implemented by
50 /// external AST sources that also provide information for semantic
52 class ExternalSemaSource : public ExternalASTSource {
54 ExternalSemaSource() {
55 ExternalASTSource::SemaSource = true;
58 ~ExternalSemaSource() override;
60 /// Initialize the semantic source with the Sema instance
61 /// being used to perform semantic analysis on the abstract syntax
63 virtual void InitializeSema(Sema &S) {}
65 /// Inform the semantic consumer that Sema is no longer available.
66 virtual void ForgetSema() {}
68 /// Load the contents of the global method pool for a given
70 virtual void ReadMethodPool(Selector Sel);
72 /// Load the contents of the global method pool for a given
73 /// selector if necessary.
74 virtual void updateOutOfDateSelector(Selector Sel);
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);
81 /// Load the set of used but not defined functions or variables with
82 /// internal linkage, or used but not defined internal functions.
84 ReadUndefinedButUsed(llvm::MapVector<NamedDecl *, SourceLocation> &Undefined);
86 virtual void ReadMismatchingDeleteExpressions(llvm::MapVector<
87 FieldDecl *, llvm::SmallVector<std::pair<SourceLocation, bool>, 4>> &);
89 /// Do last resort, unqualified lookup on a LookupResult that
92 /// \param R a LookupResult that is being recovered.
94 /// \param S the Scope of the identifier occurrence.
96 /// \return true to tell Sema to recover using the LookupResult.
97 virtual bool LookupUnqualified(LookupResult &R, Scope *S) { return false; }
99 /// Read the set of tentative definitions known to the external Sema
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) {}
109 /// Read the set of unused file-scope declarations known to the
110 /// external Sema source.
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) {}
119 /// Read the set of delegating constructors known to the
120 /// external Sema source.
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) {}
129 /// Read the set of ext_vector type declarations known to the
130 /// external Sema source.
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) {}
138 /// Read the set of potentially unused typedefs known to the source.
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) {}
147 /// Read the set of referenced selectors known to the
148 /// external Sema source.
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<Selector, SourceLocation> > &Sels) {}
157 /// Read the set of weak, undeclared identifiers known to the
158 /// external Sema source.
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
164 virtual void ReadWeakUndeclaredIdentifiers(
165 SmallVectorImpl<std::pair<IdentifierInfo *, WeakInfo> > &WI) {}
167 /// Read the set of used vtables known to the external Sema source.
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) {}
174 /// Read the set of pending instantiations known to the external
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
181 virtual void ReadPendingInstantiations(
182 SmallVectorImpl<std::pair<ValueDecl *,
183 SourceLocation> > &Pending) {}
185 /// Read the set of late parsed template functions for this source.
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
191 virtual void ReadLateParsedTemplates(
192 llvm::MapVector<const FunctionDecl *, std::unique_ptr<LateParsedTemplate>>
195 /// \copydoc Sema::CorrectTypo
196 /// \note LookupKind must correspond to a valid Sema::LookupNameKind
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 LookupKind, Scope *S, CXXScopeSpec *SS,
204 CorrectionCandidateCallback &CCC,
205 DeclContext *MemberContext,
206 bool EnteringContext,
207 const ObjCObjectPointerType *OPT) {
208 return TypoCorrection();
211 /// Produces a diagnostic note if the external source contains a
212 /// complete definition for \p T.
214 /// \param Loc the location at which a complete type was required but not
217 /// \param T the \c QualType that should have been complete at \p Loc
219 /// \return true if a diagnostic was produced, false otherwise.
220 virtual bool MaybeDiagnoseMissingCompleteType(SourceLocation Loc,
225 // isa/cast/dyn_cast support
226 static bool classof(const ExternalASTSource *Source) {
227 return Source->SemaSource;
231 } // end namespace clang