MultiplexExternalSemaSource.h revision ac32d9044b9c1e7492cef929a322d23ce899d276
10ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann//===--- MultiplexExternalSemaSource.h - External Sema Interface-*- C++ -*-===// 20ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann// 30ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann// The LLVM Compiler Infrastructure 40ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann// 50ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann// This file is distributed under the University of Illinois Open Source 60ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann// License. See LICENSE.TXT for details. 70ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann// 80ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann//===----------------------------------------------------------------------===// 90ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann// 100ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann// This file defines ExternalSemaSource interface, dispatching to all clients 110ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann// 120ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann//===----------------------------------------------------------------------===// 130ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann#ifndef LLVM_CLANG_SEMA_MULTIPLEX_EXTERNAL_SEMA_SOURCE_H 140ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann#define LLVM_CLANG_SEMA_MULTIPLEX_EXTERNAL_SEMA_SOURCE_H 150ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann 160ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann#include "clang/Sema/ExternalSemaSource.h" 170ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann#include "clang/Sema/Weak.h" 180ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann#include "llvm/ADT/SmallVector.h" 190ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann#include <utility> 200ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann 210ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumannnamespace clang { 220ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann 230ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann class CXXConstructorDecl; 240ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann class CXXRecordDecl; 250ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann class DeclaratorDecl; 260ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann struct ExternalVTableUse; 270ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann class LookupResult; 280ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann class NamespaceDecl; 290ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann class Scope; 300ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann class Sema; 310ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann class TypedefNameDecl; 320ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann class ValueDecl; 330ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann class VarDecl; 340ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann 350ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann 360ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann/// \brief An abstract interface that should be implemented by 370ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann/// external AST sources that also provide information for semantic 380ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann/// analysis. 390ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumannclass MultiplexExternalSemaSource : public ExternalSemaSource { 400ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann 410ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumannprivate: 42cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko SmallVector<ExternalSemaSource *, 2> Sources; // doesn't own them. 430ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann 440ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumannpublic: 450ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann 460ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann ///\brief Constructs a new multiplexing external sema source and appends the 470ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// given element to it. 480ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// 490ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann ///\param[in] s1 - A non-null (old) ExternalSemaSource. 500ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann ///\param[in] s2 - A non-null (new) ExternalSemaSource. 510ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// 520ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann MultiplexExternalSemaSource(ExternalSemaSource& s1, ExternalSemaSource& s2); 530ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann 540ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann ~MultiplexExternalSemaSource(); 550ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann 560ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann ///\brief Appends new source to the source list. 570ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// 580ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann ///\param[in] source - An ExternalSemaSource. 590ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// 600ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann void addSource(ExternalSemaSource &source); 610ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann 620ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann //===--------------------------------------------------------------------===// 630ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann // ExternalASTSource. 640ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann //===--------------------------------------------------------------------===// 650ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann 660ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// \brief Resolve a declaration ID into a declaration, potentially 670ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// building a new declaration. 680ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann virtual Decl *GetExternalDecl(uint32_t ID); 690ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann 700ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// \brief Resolve a selector ID into a selector. 710ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann virtual Selector GetExternalSelector(uint32_t ID); 720ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann 730ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// \brief Returns the number of selectors known to the external AST 740ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// source. 750ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann virtual uint32_t GetNumExternalSelectors(); 760ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann 770ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// \brief Resolve the offset of a statement in the decl stream into 780ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// a statement. 790ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann virtual Stmt *GetExternalDeclStmt(uint64_t Offset); 800ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann 810ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// \brief Resolve the offset of a set of C++ base specifiers in the decl 820ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// stream into an array of specifiers. 830ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann virtual CXXBaseSpecifier *GetExternalCXXBaseSpecifiers(uint64_t Offset); 840ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann 853646c68676c3c46a026b23d52188ef6e0d856178Richard Smith /// \brief Find all declarations with the given name in the 860ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// given context. 873646c68676c3c46a026b23d52188ef6e0d856178Richard Smith virtual bool 880ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann FindExternalVisibleDeclsByName(const DeclContext *DC, DeclarationName Name); 890ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann 900ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// \brief Ensures that the table of all visible declarations inside this 910ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// context is up to date. 920ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann virtual void completeVisibleDeclsMap(const DeclContext *DC); 930ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann 940ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// \brief Finds all declarations lexically contained within the given 950ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// DeclContext, after applying an optional filter predicate. 960ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// 970ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// \param isKindWeWant a predicate function that returns true if the passed 980ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// declaration kind is one we are looking for. If NULL, all declarations 990ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// are returned. 1000ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// 1010ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// \return an indication of whether the load succeeded or failed. 1020ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann virtual ExternalLoadResult FindExternalLexicalDecls(const DeclContext *DC, 1030ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann bool (*isKindWeWant)(Decl::Kind), 1040ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann SmallVectorImpl<Decl*> &Result); 1050ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann 1060ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// \brief Finds all declarations lexically contained within the given 1070ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// DeclContext. 1080ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// 1090ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// \return true if an error occurred 1100ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann ExternalLoadResult FindExternalLexicalDecls(const DeclContext *DC, 1110ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann SmallVectorImpl<Decl*> &Result) { 1120ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann return FindExternalLexicalDecls(DC, 0, Result); 1130ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann } 1140ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann 1150ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann template <typename DeclTy> 1160ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann ExternalLoadResult FindExternalLexicalDeclsBy(const DeclContext *DC, 1170ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann SmallVectorImpl<Decl*> &Result) { 1180ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann return FindExternalLexicalDecls(DC, DeclTy::classofKind, Result); 1190ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann } 1200ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann 1210ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// \brief Get the decls that are contained in a file in the Offset/Length 1220ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// range. \p Length can be 0 to indicate a point at \p Offset instead of 1230ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// a range. 1240ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann virtual void FindFileRegionDecls(FileID File, unsigned Offset,unsigned Length, 1250ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann SmallVectorImpl<Decl *> &Decls); 1260ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann 1270ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// \brief Gives the external AST source an opportunity to complete 1280ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// an incomplete type. 1290ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann virtual void CompleteType(TagDecl *Tag); 1300ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann 1310ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// \brief Gives the external AST source an opportunity to complete an 1320ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// incomplete Objective-C class. 1330ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// 1340ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// This routine will only be invoked if the "externally completed" bit is 1350ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// set on the ObjCInterfaceDecl via the function 1360ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// \c ObjCInterfaceDecl::setExternallyCompleted(). 1370ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann virtual void CompleteType(ObjCInterfaceDecl *Class); 1380ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann 1390ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// \brief Loads comment ranges. 1400ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann virtual void ReadComments(); 1410ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann 1420ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// \brief Notify ExternalASTSource that we started deserialization of 1430ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// a decl or type so until FinishedDeserializing is called there may be 1440ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// decls that are initializing. Must be paired with FinishedDeserializing. 1450ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann virtual void StartedDeserializing(); 1460ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann 1470ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// \brief Notify ExternalASTSource that we finished the deserialization of 1480ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// a decl or type. Must be paired with StartedDeserializing. 1490ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann virtual void FinishedDeserializing(); 1500ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann 1510ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// \brief Function that will be invoked when we begin parsing a new 1520ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// translation unit involving this external AST source. 1530ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann virtual void StartTranslationUnit(ASTConsumer *Consumer); 1540ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann 1550ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// \brief Print any statistics that have been gathered regarding 1560ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// the external AST source. 1570ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann virtual void PrintStats(); 1580ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann 1590ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann 1600ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// \brief Perform layout on the given record. 1610ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// 1620ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// This routine allows the external AST source to provide an specific 1630ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// layout for a record, overriding the layout that would normally be 1640ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// constructed. It is intended for clients who receive specific layout 1650ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// details rather than source code (such as LLDB). The client is expected 1660ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// to fill in the field offsets, base offsets, virtual base offsets, and 1670ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// complete object size. 1680ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// 1690ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// \param Record The record whose layout is being requested. 1700ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// 1710ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// \param Size The final size of the record, in bits. 1720ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// 1730ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// \param Alignment The final alignment of the record, in bits. 1740ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// 1750ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// \param FieldOffsets The offset of each of the fields within the record, 1760ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// expressed in bits. All of the fields must be provided with offsets. 1770ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// 1780ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// \param BaseOffsets The offset of each of the direct, non-virtual base 1790ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// classes. If any bases are not given offsets, the bases will be laid 1800ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// out according to the ABI. 1810ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// 1820ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// \param VirtualBaseOffsets The offset of each of the virtual base classes 1830ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// (either direct or not). If any bases are not given offsets, the bases will 1840ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// be laid out according to the ABI. 1850ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// 1860ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// \returns true if the record layout was provided, false otherwise. 1870ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann virtual bool 1880ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann layoutRecordType(const RecordDecl *Record, 1890ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann uint64_t &Size, uint64_t &Alignment, 1900ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann llvm::DenseMap<const FieldDecl *, uint64_t> &FieldOffsets, 1910ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann llvm::DenseMap<const CXXRecordDecl *, CharUnits> &BaseOffsets, 1920ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann llvm::DenseMap<const CXXRecordDecl *, CharUnits> &VirtualBaseOffsets); 1930ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann 1940ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// Return the amount of memory used by memory buffers, breaking down 1950ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// by heap-backed versus mmap'ed memory. 1960ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann virtual void getMemoryBufferSizes(MemoryBufferSizes &sizes) const; 1970ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann 1980ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann //===--------------------------------------------------------------------===// 1990ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann // ExternalSemaSource. 2000ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann //===--------------------------------------------------------------------===// 2010ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann 2020ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// \brief Initialize the semantic source with the Sema instance 2030ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// being used to perform semantic analysis on the abstract syntax 2040ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// tree. 2050ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann virtual void InitializeSema(Sema &S); 2060ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann 2070ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// \brief Inform the semantic consumer that Sema is no longer available. 2080ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann virtual void ForgetSema(); 2090ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann 2100ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// \brief Load the contents of the global method pool for a given 2110ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// selector. 2120ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann virtual void ReadMethodPool(Selector Sel); 2130ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann 2140ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// \brief Load the set of namespaces that are known to the external source, 2150ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// which will be used during typo correction. 2160ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann virtual void ReadKnownNamespaces(SmallVectorImpl<NamespaceDecl*> &Namespaces); 21701a41140cd8ec9475ed0c33384310fbdd3b6de11Nick Lewycky 218cd0655b17249c4c4908ca91462657f62285017e6Nick Lewycky /// \brief Load the set of used but not defined functions or variables with 219cd0655b17249c4c4908ca91462657f62285017e6Nick Lewycky /// internal linkage, or used but not defined inline functions. 220cd0655b17249c4c4908ca91462657f62285017e6Nick Lewycky virtual void ReadUndefinedButUsed( 221995e26b0523ac8e3b6199a509b871b81fa5df6eeNick Lewycky llvm::DenseMap<NamedDecl*, SourceLocation> &Undefined); 2220ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann 2230ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// \brief Do last resort, unqualified lookup on a LookupResult that 2240ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// Sema cannot find. 2250ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// 2260ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// \param R a LookupResult that is being recovered. 2270ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// 2280ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// \param S the Scope of the identifier occurrence. 2290ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// 2300ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// \return true to tell Sema to recover using the LookupResult. 2310ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann virtual bool LookupUnqualified(LookupResult &R, Scope *S); 2320ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann 2330ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// \brief Read the set of tentative definitions known to the external Sema 2340ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// source. 2350ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// 2360ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// The external source should append its own tentative definitions to the 2370ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// given vector of tentative definitions. Note that this routine may be 2380ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// invoked multiple times; the external source should take care not to 2390ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// introduce the same declarations repeatedly. 2400ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann virtual void ReadTentativeDefinitions(SmallVectorImpl<VarDecl*> &Defs); 2410ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann 2420ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// \brief Read the set of unused file-scope declarations known to the 2430ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// external Sema source. 2440ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// 2450ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// The external source should append its own unused, filed-scope to the 2460ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// given vector of declarations. Note that this routine may be 2470ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// invoked multiple times; the external source should take care not to 2480ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// introduce the same declarations repeatedly. 2490ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann virtual void ReadUnusedFileScopedDecls( 2500ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann SmallVectorImpl<const DeclaratorDecl*> &Decls); 2510ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann 2520ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// \brief Read the set of delegating constructors known to the 2530ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// external Sema source. 2540ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// 2550ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// The external source should append its own delegating constructors to the 2560ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// given vector of declarations. Note that this routine may be 2570ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// invoked multiple times; the external source should take care not to 2580ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// introduce the same declarations repeatedly. 2590ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann virtual void ReadDelegatingConstructors( 2600ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann SmallVectorImpl<CXXConstructorDecl*> &Decls); 2610ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann 2620ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// \brief Read the set of ext_vector type declarations known to the 2630ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// external Sema source. 2640ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// 2650ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// The external source should append its own ext_vector type declarations to 2660ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// the given vector of declarations. Note that this routine may be 2670ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// invoked multiple times; the external source should take care not to 2680ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// introduce the same declarations repeatedly. 2690ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann virtual void ReadExtVectorDecls(SmallVectorImpl<TypedefNameDecl*> &Decls); 2700ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann 2710ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// \brief Read the set of dynamic classes known to the external Sema source. 2720ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// 2730ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// The external source should append its own dynamic classes to 2740ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// the given vector of declarations. Note that this routine may be 2750ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// invoked multiple times; the external source should take care not to 2760ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// introduce the same declarations repeatedly. 2770ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann virtual void ReadDynamicClasses(SmallVectorImpl<CXXRecordDecl*> &Decls); 2780ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann 2795ea6ef490547917426d5e2ed14c9f36521bbeacfRichard Smith /// \brief Read the set of locally-scoped extern "C" declarations known to the 2800ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// external Sema source. 2810ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// 2820ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// The external source should append its own locally-scoped external 2835ea6ef490547917426d5e2ed14c9f36521bbeacfRichard Smith /// declarations to the given vector of declarations. Note that this routine 2845ea6ef490547917426d5e2ed14c9f36521bbeacfRichard Smith /// may be invoked multiple times; the external source should take care not 2850ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// to introduce the same declarations repeatedly. 2865ea6ef490547917426d5e2ed14c9f36521bbeacfRichard Smith virtual void ReadLocallyScopedExternCDecls(SmallVectorImpl<NamedDecl*>&Decls); 2870ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann 2880ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// \brief Read the set of referenced selectors known to the 2890ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// external Sema source. 2900ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// 2910ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// The external source should append its own referenced selectors to the 2920ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// given vector of selectors. Note that this routine 2930ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// may be invoked multiple times; the external source should take care not 2940ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// to introduce the same selectors repeatedly. 2950ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann virtual void ReadReferencedSelectors(SmallVectorImpl<std::pair<Selector, 2960ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann SourceLocation> > &Sels); 2970ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann 2980ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// \brief Read the set of weak, undeclared identifiers known to the 2990ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// external Sema source. 3000ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// 3010ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// The external source should append its own weak, undeclared identifiers to 3020ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// the given vector. Note that this routine may be invoked multiple times; 3030ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// the external source should take care not to introduce the same identifiers 3040ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// repeatedly. 3050ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann virtual void ReadWeakUndeclaredIdentifiers( 3060ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann SmallVectorImpl<std::pair<IdentifierInfo*, WeakInfo> > &WI); 3070ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann 3080ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// \brief Read the set of used vtables known to the external Sema source. 3090ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// 3100ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// The external source should append its own used vtables to the given 3110ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// vector. Note that this routine may be invoked multiple times; the external 3120ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// source should take care not to introduce the same vtables repeatedly. 3130ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann virtual void ReadUsedVTables(SmallVectorImpl<ExternalVTableUse> &VTables); 3140ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann 3150ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// \brief Read the set of pending instantiations known to the external 3160ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// Sema source. 3170ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// 3180ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// The external source should append its own pending instantiations to the 3190ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// given vector. Note that this routine may be invoked multiple times; the 3200ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// external source should take care not to introduce the same instantiations 3210ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann /// repeatedly. 3220ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann virtual void ReadPendingInstantiations( 3230ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann SmallVectorImpl<std::pair<ValueDecl*, SourceLocation> >& Pending); 3240ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann 325ac32d9044b9c1e7492cef929a322d23ce899d276Richard Smith /// \brief Read the set of late parsed template functions for this source. 326ac32d9044b9c1e7492cef929a322d23ce899d276Richard Smith /// 327ac32d9044b9c1e7492cef929a322d23ce899d276Richard Smith /// The external source should insert its own late parsed template functions 328ac32d9044b9c1e7492cef929a322d23ce899d276Richard Smith /// into the map. Note that this routine may be invoked multiple times; the 329ac32d9044b9c1e7492cef929a322d23ce899d276Richard Smith /// external source should take care not to introduce the same map entries 330ac32d9044b9c1e7492cef929a322d23ce899d276Richard Smith /// repeatedly. 331ac32d9044b9c1e7492cef929a322d23ce899d276Richard Smith virtual void ReadLateParsedTemplates( 332ac32d9044b9c1e7492cef929a322d23ce899d276Richard Smith llvm::DenseMap<const FunctionDecl *, LateParsedTemplate *> &LPTMap); 333ac32d9044b9c1e7492cef929a322d23ce899d276Richard Smith 3340ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann // isa/cast/dyn_cast support 3350ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann static bool classof(const MultiplexExternalSemaSource*) { return true; } 3360ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann //static bool classof(const ExternalSemaSource*) { return true; } 3370ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann}; 3380ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann 3390ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann} // end namespace clang 3400ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann 3410ec56b7add7be643f490ea9b430823570f01b4e2Axel Naumann#endif // LLVM_CLANG_SEMA_MULTIPLEX_EXTERNAL_SEMA_SOURCE_H 342