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 {
57 ExternalSemaSource() = default;
59 ~ExternalSemaSource() override;
61 /// Initialize the semantic source with the Sema instance
62 /// being used to perform semantic analysis on the abstract syntax
64 virtual void InitializeSema(Sema &S) {}
66 /// Inform the semantic consumer that Sema is no longer available.
67 virtual void ForgetSema() {}
69 /// Load the contents of the global method pool for a given
71 virtual void ReadMethodPool(Selector Sel);
73 /// Load the contents of the global method pool for a given
74 /// selector if necessary.
75 virtual void updateOutOfDateSelector(Selector Sel);
77 /// Load the set of namespaces that are known to the external source,
78 /// which will be used during typo correction.
79 virtual void ReadKnownNamespaces(
80 SmallVectorImpl<NamespaceDecl *> &Namespaces);
82 /// Load the set of used but not defined functions or variables with
83 /// internal linkage, or used but not defined internal functions.
85 ReadUndefinedButUsed(llvm::MapVector<NamedDecl *, SourceLocation> &Undefined);
87 virtual void ReadMismatchingDeleteExpressions(llvm::MapVector<
88 FieldDecl *, llvm::SmallVector<std::pair<SourceLocation, bool>, 4>> &);
90 /// Do last resort, unqualified lookup on a LookupResult that
93 /// \param R a LookupResult that is being recovered.
95 /// \param S the Scope of the identifier occurrence.
97 /// \return true to tell Sema to recover using the LookupResult.
98 virtual bool LookupUnqualified(LookupResult &R, Scope *S) { return false; }
100 /// Read the set of tentative definitions known to the external Sema
103 /// The external source should append its own tentative definitions to the
104 /// given vector of tentative definitions. Note that this routine may be
105 /// invoked multiple times; the external source should take care not to
106 /// introduce the same declarations repeatedly.
107 virtual void ReadTentativeDefinitions(
108 SmallVectorImpl<VarDecl *> &TentativeDefs) {}
110 /// Read the set of unused file-scope declarations known to the
111 /// external Sema source.
113 /// The external source should append its own unused, filed-scope to the
114 /// given vector of declarations. Note that this routine may be
115 /// invoked multiple times; the external source should take care not to
116 /// introduce the same declarations repeatedly.
117 virtual void ReadUnusedFileScopedDecls(
118 SmallVectorImpl<const DeclaratorDecl *> &Decls) {}
120 /// Read the set of delegating constructors known to the
121 /// external Sema source.
123 /// The external source should append its own delegating constructors to the
124 /// given vector of declarations. Note that this routine may be
125 /// invoked multiple times; the external source should take care not to
126 /// introduce the same declarations repeatedly.
127 virtual void ReadDelegatingConstructors(
128 SmallVectorImpl<CXXConstructorDecl *> &Decls) {}
130 /// Read the set of ext_vector type declarations known to the
131 /// external Sema source.
133 /// The external source should append its own ext_vector type declarations to
134 /// the given vector of declarations. Note that this routine may be
135 /// invoked multiple times; the external source should take care not to
136 /// introduce the same declarations repeatedly.
137 virtual void ReadExtVectorDecls(SmallVectorImpl<TypedefNameDecl *> &Decls) {}
139 /// Read the set of potentially unused typedefs known to the source.
141 /// The external source should append its own potentially unused local
142 /// typedefs to the given vector of declarations. Note that this routine may
143 /// be invoked multiple times; the external source should take care not to
144 /// introduce the same declarations repeatedly.
145 virtual void ReadUnusedLocalTypedefNameCandidates(
146 llvm::SmallSetVector<const TypedefNameDecl *, 4> &Decls) {}
148 /// Read the set of referenced selectors known to the
149 /// external Sema source.
151 /// The external source should append its own referenced selectors to the
152 /// given vector of selectors. Note that this routine
153 /// may be invoked multiple times; the external source should take care not
154 /// to introduce the same selectors repeatedly.
155 virtual void ReadReferencedSelectors(
156 SmallVectorImpl<std::pair<Selector, SourceLocation> > &Sels) {}
158 /// Read the set of weak, undeclared identifiers known to the
159 /// external Sema source.
161 /// The external source should append its own weak, undeclared identifiers to
162 /// the given vector. Note that this routine may be invoked multiple times;
163 /// the external source should take care not to introduce the same identifiers
165 virtual void ReadWeakUndeclaredIdentifiers(
166 SmallVectorImpl<std::pair<IdentifierInfo *, WeakInfo> > &WI) {}
168 /// Read the set of used vtables known to the external Sema source.
170 /// The external source should append its own used vtables to the given
171 /// vector. Note that this routine may be invoked multiple times; the external
172 /// source should take care not to introduce the same vtables repeatedly.
173 virtual void ReadUsedVTables(SmallVectorImpl<ExternalVTableUse> &VTables) {}
175 /// Read the set of pending instantiations known to the external
178 /// The external source should append its own pending instantiations to the
179 /// given vector. Note that this routine may be invoked multiple times; the
180 /// external source should take care not to introduce the same instantiations
182 virtual void ReadPendingInstantiations(
183 SmallVectorImpl<std::pair<ValueDecl *,
184 SourceLocation> > &Pending) {}
186 /// Read the set of late parsed template functions for this source.
188 /// The external source should insert its own late parsed template functions
189 /// into the map. Note that this routine may be invoked multiple times; the
190 /// external source should take care not to introduce the same map entries
192 virtual void ReadLateParsedTemplates(
193 llvm::MapVector<const FunctionDecl *, std::unique_ptr<LateParsedTemplate>>
196 /// \copydoc Sema::CorrectTypo
197 /// \note LookupKind must correspond to a valid Sema::LookupNameKind
199 /// ExternalSemaSource::CorrectTypo is always given the first chance to
200 /// correct a typo (really, to offer suggestions to repair a failed lookup).
201 /// It will even be called when SpellChecking is turned off or after a
202 /// fatal error has already been detected.
203 virtual TypoCorrection CorrectTypo(const DeclarationNameInfo &Typo,
204 int LookupKind, Scope *S, CXXScopeSpec *SS,
205 CorrectionCandidateCallback &CCC,
206 DeclContext *MemberContext,
207 bool EnteringContext,
208 const ObjCObjectPointerType *OPT) {
209 return TypoCorrection();
212 /// Produces a diagnostic note if the external source contains a
213 /// complete definition for \p T.
215 /// \param Loc the location at which a complete type was required but not
218 /// \param T the \c QualType that should have been complete at \p Loc
220 /// \return true if a diagnostic was produced, false otherwise.
221 virtual bool MaybeDiagnoseMissingCompleteType(SourceLocation Loc,
228 bool isA(const void *ClassID) const override {
229 return ClassID == &ID || ExternalASTSource::isA(ClassID);
231 static bool classof(const ExternalASTSource *S) { return S->isA(&ID); }
235 } // end namespace clang