123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255 |
- #pragma once
- #ifdef __GNUC__
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wunused-parameter"
- #endif
- //===--- ExternalSemaSource.h - External Sema Interface ---------*- C++ -*-===//
- //
- // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
- // See https://llvm.org/LICENSE.txt for license information.
- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
- //
- //===----------------------------------------------------------------------===//
- //
- // This file defines the ExternalSemaSource interface.
- //
- //===----------------------------------------------------------------------===//
- #ifndef LLVM_CLANG_SEMA_EXTERNALSEMASOURCE_H
- #define LLVM_CLANG_SEMA_EXTERNALSEMASOURCE_H
- #include "clang/AST/ExternalASTSource.h"
- #include "clang/AST/Type.h"
- #include "clang/Sema/TypoCorrection.h"
- #include "clang/Sema/Weak.h"
- #include "llvm/ADT/MapVector.h"
- #include <utility>
- namespace llvm {
- template <class T, unsigned n> class SmallSetVector;
- }
- namespace clang {
- class CXXConstructorDecl;
- class CXXRecordDecl;
- class DeclaratorDecl;
- class LookupResult;
- class Scope;
- class Sema;
- class TypedefNameDecl;
- class ValueDecl;
- class VarDecl;
- struct LateParsedTemplate;
- /// A simple structure that captures a vtable use for the purposes of
- /// the \c ExternalSemaSource.
- struct ExternalVTableUse {
- CXXRecordDecl *Record;
- SourceLocation Location;
- bool DefinitionRequired;
- };
- /// An abstract interface that should be implemented by
- /// external AST sources that also provide information for semantic
- /// analysis.
- class ExternalSemaSource : public ExternalASTSource {
- /// LLVM-style RTTI.
- static char ID;
- public:
- ExternalSemaSource() = default;
- ~ExternalSemaSource() override;
- /// Initialize the semantic source with the Sema instance
- /// being used to perform semantic analysis on the abstract syntax
- /// tree.
- virtual void InitializeSema(Sema &S) {}
- /// Inform the semantic consumer that Sema is no longer available.
- virtual void ForgetSema() {}
- /// Load the contents of the global method pool for a given
- /// selector.
- virtual void ReadMethodPool(Selector Sel);
- /// Load the contents of the global method pool for a given
- /// selector if necessary.
- virtual void updateOutOfDateSelector(Selector Sel);
- /// Load the set of namespaces that are known to the external source,
- /// which will be used during typo correction.
- virtual void ReadKnownNamespaces(
- SmallVectorImpl<NamespaceDecl *> &Namespaces);
- /// Load the set of used but not defined functions or variables with
- /// internal linkage, or used but not defined internal functions.
- virtual void
- ReadUndefinedButUsed(llvm::MapVector<NamedDecl *, SourceLocation> &Undefined);
- virtual void ReadMismatchingDeleteExpressions(llvm::MapVector<
- FieldDecl *, llvm::SmallVector<std::pair<SourceLocation, bool>, 4>> &);
- /// Do last resort, unqualified lookup on a LookupResult that
- /// Sema cannot find.
- ///
- /// \param R a LookupResult that is being recovered.
- ///
- /// \param S the Scope of the identifier occurrence.
- ///
- /// \return true to tell Sema to recover using the LookupResult.
- virtual bool LookupUnqualified(LookupResult &R, Scope *S) { return false; }
- /// Read the set of tentative definitions known to the external Sema
- /// source.
- ///
- /// The external source should append its own tentative definitions to the
- /// given vector of tentative definitions. Note that this routine may be
- /// invoked multiple times; the external source should take care not to
- /// introduce the same declarations repeatedly.
- virtual void ReadTentativeDefinitions(
- SmallVectorImpl<VarDecl *> &TentativeDefs) {}
- /// Read the set of unused file-scope declarations known to the
- /// external Sema source.
- ///
- /// The external source should append its own unused, filed-scope to the
- /// given vector of declarations. Note that this routine may be
- /// invoked multiple times; the external source should take care not to
- /// introduce the same declarations repeatedly.
- virtual void ReadUnusedFileScopedDecls(
- SmallVectorImpl<const DeclaratorDecl *> &Decls) {}
- /// Read the set of delegating constructors known to the
- /// external Sema source.
- ///
- /// The external source should append its own delegating constructors to the
- /// given vector of declarations. Note that this routine may be
- /// invoked multiple times; the external source should take care not to
- /// introduce the same declarations repeatedly.
- virtual void ReadDelegatingConstructors(
- SmallVectorImpl<CXXConstructorDecl *> &Decls) {}
- /// Read the set of ext_vector type declarations known to the
- /// external Sema source.
- ///
- /// The external source should append its own ext_vector type declarations to
- /// the given vector of declarations. Note that this routine may be
- /// invoked multiple times; the external source should take care not to
- /// introduce the same declarations repeatedly.
- virtual void ReadExtVectorDecls(SmallVectorImpl<TypedefNameDecl *> &Decls) {}
- /// Read the set of potentially unused typedefs known to the source.
- ///
- /// The external source should append its own potentially unused local
- /// typedefs to the given vector of declarations. Note that this routine may
- /// be invoked multiple times; the external source should take care not to
- /// introduce the same declarations repeatedly.
- virtual void ReadUnusedLocalTypedefNameCandidates(
- llvm::SmallSetVector<const TypedefNameDecl *, 4> &Decls) {}
- /// Read the set of referenced selectors known to the
- /// external Sema source.
- ///
- /// The external source should append its own referenced selectors to the
- /// given vector of selectors. Note that this routine
- /// may be invoked multiple times; the external source should take care not
- /// to introduce the same selectors repeatedly.
- virtual void ReadReferencedSelectors(
- SmallVectorImpl<std::pair<Selector, SourceLocation> > &Sels) {}
- /// Read the set of weak, undeclared identifiers known to the
- /// external Sema source.
- ///
- /// The external source should append its own weak, undeclared identifiers to
- /// the given vector. Note that this routine may be invoked multiple times;
- /// the external source should take care not to introduce the same identifiers
- /// repeatedly.
- virtual void ReadWeakUndeclaredIdentifiers(
- SmallVectorImpl<std::pair<IdentifierInfo *, WeakInfo> > &WI) {}
- /// Read the set of used vtables known to the external Sema source.
- ///
- /// The external source should append its own used vtables to the given
- /// vector. Note that this routine may be invoked multiple times; the external
- /// source should take care not to introduce the same vtables repeatedly.
- virtual void ReadUsedVTables(SmallVectorImpl<ExternalVTableUse> &VTables) {}
- /// Read the set of pending instantiations known to the external
- /// Sema source.
- ///
- /// The external source should append its own pending instantiations to the
- /// given vector. Note that this routine may be invoked multiple times; the
- /// external source should take care not to introduce the same instantiations
- /// repeatedly.
- virtual void ReadPendingInstantiations(
- SmallVectorImpl<std::pair<ValueDecl *,
- SourceLocation> > &Pending) {}
- /// Read the set of late parsed template functions for this source.
- ///
- /// The external source should insert its own late parsed template functions
- /// into the map. Note that this routine may be invoked multiple times; the
- /// external source should take care not to introduce the same map entries
- /// repeatedly.
- virtual void ReadLateParsedTemplates(
- llvm::MapVector<const FunctionDecl *, std::unique_ptr<LateParsedTemplate>>
- &LPTMap) {}
- /// Read the set of decls to be checked for deferred diags.
- ///
- /// The external source should append its own potentially emitted function
- /// and variable decls which may cause deferred diags. Note that this routine
- /// may be invoked multiple times; the external source should take care not to
- /// introduce the same declarations repeatedly.
- virtual void
- ReadDeclsToCheckForDeferredDiags(llvm::SmallSetVector<Decl *, 4> &Decls) {}
- /// \copydoc Sema::CorrectTypo
- /// \note LookupKind must correspond to a valid Sema::LookupNameKind
- ///
- /// ExternalSemaSource::CorrectTypo is always given the first chance to
- /// correct a typo (really, to offer suggestions to repair a failed lookup).
- /// It will even be called when SpellChecking is turned off or after a
- /// fatal error has already been detected.
- virtual TypoCorrection CorrectTypo(const DeclarationNameInfo &Typo,
- int LookupKind, Scope *S, CXXScopeSpec *SS,
- CorrectionCandidateCallback &CCC,
- DeclContext *MemberContext,
- bool EnteringContext,
- const ObjCObjectPointerType *OPT) {
- return TypoCorrection();
- }
- /// Produces a diagnostic note if the external source contains a
- /// complete definition for \p T.
- ///
- /// \param Loc the location at which a complete type was required but not
- /// provided
- ///
- /// \param T the \c QualType that should have been complete at \p Loc
- ///
- /// \return true if a diagnostic was produced, false otherwise.
- virtual bool MaybeDiagnoseMissingCompleteType(SourceLocation Loc,
- QualType T) {
- return false;
- }
- /// LLVM-style RTTI.
- /// \{
- bool isA(const void *ClassID) const override {
- return ClassID == &ID || ExternalASTSource::isA(ClassID);
- }
- static bool classof(const ExternalASTSource *S) { return S->isA(&ID); }
- /// \}
- };
- } // end namespace clang
- #endif
- #ifdef __GNUC__
- #pragma GCC diagnostic pop
- #endif
|