SemaCodeComplete.cpp revision 796158971bda18cf4af237c46769914cfa7276b7
181b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor//===---------------- SemaCodeComplete.cpp - Code Completion ----*- C++ -*-===// 281b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor// 381b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor// The LLVM Compiler Infrastructure 481b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor// 581b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor// This file is distributed under the University of Illinois Open Source 681b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor// License. See LICENSE.TXT for details. 781b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor// 881b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor//===----------------------------------------------------------------------===// 981b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor// 1081b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor// This file defines the code-completion semantic actions. 1181b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor// 1281b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor//===----------------------------------------------------------------------===// 132d88708cbe4e4ec5e04e4acb6bd7f5be68557379John McCall#include "clang/Sema/SemaInternal.h" 14e737f5041a36d0befb39ffeed8d50ba15916d3daDouglas Gregor#include "clang/Sema/Lookup.h" 15120d63cd4465230c2cd56508c7cd8e0ad00848e7John McCall#include "clang/Sema/Overload.h" 1681b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor#include "clang/Sema/CodeCompleteConsumer.h" 17719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor#include "clang/Sema/ExternalSemaSource.h" 185f1e0942a32657b625702aa52f82430d0120f424John McCall#include "clang/Sema/Scope.h" 19781472fe99a120098c631b0cbe33c89f8cef5e70John McCall#include "clang/Sema/ScopeInfo.h" 207cd088e519d7e6caa4c4c12db52e0e4ae35d25c2John McCall#include "clang/AST/DeclObjC.h" 21b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor#include "clang/AST/ExprCXX.h" 2224a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor#include "clang/AST/ExprObjC.h" 23c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor#include "clang/Lex/HeaderSearch.h" 243f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor#include "clang/Lex/MacroInfo.h" 253f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor#include "clang/Lex/Preprocessor.h" 26d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor#include "llvm/ADT/DenseSet.h" 27013b3668b67c8cb3ad2ee516c5607a3eba11829fBenjamin Kramer#include "llvm/ADT/SmallBitVector.h" 2886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor#include "llvm/ADT/SmallPtrSet.h" 298fe83e1df954d72c0f4ffc15d20a5222ec151c21Benjamin Kramer#include "llvm/ADT/SmallString.h" 306a6840326e9b4ac8e81a5a212165f33743847ab8Douglas Gregor#include "llvm/ADT/StringExtras.h" 3122f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor#include "llvm/ADT/StringSwitch.h" 32458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor#include "llvm/ADT/Twine.h" 3386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor#include <list> 3486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor#include <map> 3586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor#include <vector> 3681b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor 3781b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregorusing namespace clang; 38781472fe99a120098c631b0cbe33c89f8cef5e70John McCallusing namespace sema; 3981b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor 4086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregornamespace { 4186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \brief A container of code-completion results. 4286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor class ResultBuilder { 4386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor public: 4486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \brief The type of a name-lookup filter, which can be provided to the 4586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// name-lookup routines to specify which declarations should be included in 4686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// the result set (when it returns true) and which declarations should be 4786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// filtered out (returns false). 4886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor typedef bool (ResultBuilder::*LookupFilter)(NamedDecl *) const; 4986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 500a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 5186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 5286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor private: 5386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \brief The actual results we have found. 5486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor std::vector<Result> Results; 5586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 5686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \brief A record of all of the declarations we have found and placed 5786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// into the result set, used to ensure that no declaration ever gets into 5886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// the result set twice. 5986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor llvm::SmallPtrSet<Decl*, 16> AllDeclsFound; 6086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 61fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor typedef std::pair<NamedDecl *, unsigned> DeclIndexPair; 62fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 63fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor /// \brief An entry in the shadow map, which is optimized to store 64fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor /// a single (declaration, index) mapping (the common case) but 65fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor /// can also store a list of (declaration, index) mappings. 66fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor class ShadowMapEntry { 675f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner typedef SmallVector<DeclIndexPair, 4> DeclIndexPairVector; 68fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 69fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor /// \brief Contains either the solitary NamedDecl * or a vector 70fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor /// of (declaration, index) pairs. 71fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor llvm::PointerUnion<NamedDecl *, DeclIndexPairVector*> DeclOrVector; 72fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 73fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor /// \brief When the entry contains a single declaration, this is 74fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor /// the index associated with that entry. 75fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor unsigned SingleDeclIndex; 76fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 77fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor public: 78fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ShadowMapEntry() : DeclOrVector(), SingleDeclIndex(0) { } 79fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 80fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor void Add(NamedDecl *ND, unsigned Index) { 81fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (DeclOrVector.isNull()) { 82fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor // 0 - > 1 elements: just set the single element information. 83fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor DeclOrVector = ND; 84fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor SingleDeclIndex = Index; 85fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return; 86fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 87fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 88fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (NamedDecl *PrevND = DeclOrVector.dyn_cast<NamedDecl *>()) { 89fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor // 1 -> 2 elements: create the vector of results and push in the 90fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor // existing declaration. 91fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor DeclIndexPairVector *Vec = new DeclIndexPairVector; 92fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor Vec->push_back(DeclIndexPair(PrevND, SingleDeclIndex)); 93fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor DeclOrVector = Vec; 94fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 95fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 96fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor // Add the new element to the end of the vector. 97fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor DeclOrVector.get<DeclIndexPairVector*>()->push_back( 98fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor DeclIndexPair(ND, Index)); 99fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 100fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 101fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor void Destroy() { 102fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (DeclIndexPairVector *Vec 103fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor = DeclOrVector.dyn_cast<DeclIndexPairVector *>()) { 104fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor delete Vec; 105fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor DeclOrVector = ((NamedDecl *)0); 106fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 107fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 108fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 109fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor // Iteration. 110fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor class iterator; 111fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor iterator begin() const; 112fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor iterator end() const; 113fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor }; 114fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 11586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \brief A mapping from declaration names to the declarations that have 11686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// this name within a particular scope and their index within the list of 11786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// results. 118fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor typedef llvm::DenseMap<DeclarationName, ShadowMapEntry> ShadowMap; 11986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 12086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \brief The semantic analysis object for which results are being 12186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// produced. 12286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Sema &SemaRef; 123218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor 124218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor /// \brief The allocator used to allocate new code-completion strings. 125dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor CodeCompletionAllocator &Allocator; 12628a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis 12728a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionTUInfo &CCTUInfo; 12886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 12986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \brief If non-NULL, a filter function used to remove any code-completion 13086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// results that are not desirable. 13186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor LookupFilter Filter; 13245bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor 13345bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor /// \brief Whether we should allow declarations as 13445bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor /// nested-name-specifiers that would otherwise be filtered out. 13545bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor bool AllowNestedNameSpecifiers; 13645bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor 1375ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor /// \brief If set, the type that we would prefer our resulting value 1385ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor /// declarations to have. 1395ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor /// 1405ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor /// Closely matching the preferred type gives a boost to a result's 1415ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor /// priority. 1425ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor CanQualType PreferredType; 1435ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 14486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \brief A list of shadow maps, which is used to model name hiding at 14586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// different levels of, e.g., the inheritance hierarchy. 14686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor std::list<ShadowMap> ShadowMaps; 14786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 1483cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor /// \brief If we're potentially referring to a C++ member function, the set 1493cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor /// of qualifiers applied to the object type. 1503cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor Qualifiers ObjectTypeQualifiers; 1513cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor 1523cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor /// \brief Whether the \p ObjectTypeQualifiers field is active. 1533cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor bool HasObjectTypeQualifiers; 1543cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor 155265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor /// \brief The selector that we prefer. 156265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor Selector PreferredSelector; 157265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor 158ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor /// \brief The completion context in which we are gathering results. 159cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor CodeCompletionContext CompletionContext; 160cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor 161a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett /// \brief If we are in an instance method definition, the \@implementation 162ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor /// object. 163ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor ObjCImplementationDecl *ObjCImplementation; 164ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor 165cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor void AdjustResultPriorityForDecl(Result &R); 1661f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 1676f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor void MaybeAddConstructorResults(Result R); 1686f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 16986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor public: 170dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor explicit ResultBuilder(Sema &SemaRef, CodeCompletionAllocator &Allocator, 17128a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionTUInfo &CCTUInfo, 17252779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor const CodeCompletionContext &CompletionContext, 17352779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor LookupFilter Filter = 0) 17428a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis : SemaRef(SemaRef), Allocator(Allocator), CCTUInfo(CCTUInfo), 17528a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis Filter(Filter), 176218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor AllowNestedNameSpecifiers(false), HasObjectTypeQualifiers(false), 177ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor CompletionContext(CompletionContext), 178ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor ObjCImplementation(0) 179ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor { 180ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor // If this is an Objective-C instance method definition, dig out the 181ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor // corresponding implementation. 182ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor switch (CompletionContext.getKind()) { 183ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor case CodeCompletionContext::CCC_Expression: 184ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor case CodeCompletionContext::CCC_ObjCMessageReceiver: 185ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor case CodeCompletionContext::CCC_ParenthesizedExpression: 186ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor case CodeCompletionContext::CCC_Statement: 187ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor case CodeCompletionContext::CCC_Recovery: 188ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor if (ObjCMethodDecl *Method = SemaRef.getCurMethodDecl()) 189ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor if (Method->isInstanceMethod()) 190ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor if (ObjCInterfaceDecl *Interface = Method->getClassInterface()) 191ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor ObjCImplementation = Interface->getImplementation(); 192ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor break; 193ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor 194ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor default: 195ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor break; 196ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor } 197ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor } 19886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 199d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor /// \brief Whether we should include code patterns in the completion 200d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor /// results. 201d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor bool includeCodePatterns() const { 202d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor return SemaRef.CodeCompleter && 203f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor SemaRef.CodeCompleter->includeCodePatterns(); 204d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor } 205d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor 20686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \brief Set the filter used for code-completion results. 20786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor void setFilter(LookupFilter Filter) { 20886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor this->Filter = Filter; 20986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 21086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 21186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Result *data() { return Results.empty()? 0 : &Results.front(); } 21286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor unsigned size() const { return Results.size(); } 21386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool empty() const { return Results.empty(); } 21486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 2155ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor /// \brief Specify the preferred type. 2165ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor void setPreferredType(QualType T) { 2175ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor PreferredType = SemaRef.Context.getCanonicalType(T); 2185ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor } 2195ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 2203cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor /// \brief Set the cv-qualifiers on the object type, for us in filtering 2213cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor /// calls to member functions. 2223cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor /// 2233cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor /// When there are qualifiers in this set, they will be used to filter 2243cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor /// out member functions that aren't available (because there will be a 2253cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor /// cv-qualifier mismatch) or prefer functions with an exact qualifier 2263cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor /// match. 2273cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor void setObjectTypeQualifiers(Qualifiers Quals) { 2283cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor ObjectTypeQualifiers = Quals; 2293cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor HasObjectTypeQualifiers = true; 2303cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor } 2313cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor 232265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor /// \brief Set the preferred selector. 233265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor /// 234265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor /// When an Objective-C method declaration result is added, and that 235265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor /// method's selector matches this preferred selector, we give that method 236265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor /// a slight priority boost. 237265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor void setPreferredSelector(Selector Sel) { 238265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor PreferredSelector = Sel; 239265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor } 240ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor 241cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor /// \brief Retrieve the code-completion context for which results are 242cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor /// being collected. 243cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor const CodeCompletionContext &getCompletionContext() const { 244cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor return CompletionContext; 245cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor } 246cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor 24745bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor /// \brief Specify whether nested-name-specifiers are allowed. 24845bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor void allowNestedNameSpecifiers(bool Allow = true) { 24945bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor AllowNestedNameSpecifiers = Allow; 25045bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor } 25145bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor 252b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor /// \brief Return the semantic analysis object for which we are collecting 253b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor /// code completion results. 254b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor Sema &getSema() const { return SemaRef; } 255b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor 256218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor /// \brief Retrieve the allocator used to allocate code completion strings. 257dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor CodeCompletionAllocator &getAllocator() const { return Allocator; } 25828a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis 25928a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionTUInfo &getCodeCompletionTUInfo() const { return CCTUInfo; } 260218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor 261e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor /// \brief Determine whether the given declaration is at all interesting 262e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor /// as a code-completion result. 26345bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor /// 26445bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor /// \param ND the declaration that we are inspecting. 26545bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor /// 26645bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor /// \param AsNestedNameSpecifier will be set true if this declaration is 26745bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor /// only interesting when it is a nested-name-specifier. 26845bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor bool isInterestingDecl(NamedDecl *ND, bool &AsNestedNameSpecifier) const; 2696660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor 2706660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor /// \brief Check whether the result is hidden by the Hiding declaration. 2716660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor /// 2726660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor /// \returns true if the result is hidden and cannot be found, false if 2736660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor /// the hidden result could still be found. When false, \p R may be 2746660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor /// modified to describe how the result can be found (e.g., via extra 2756660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor /// qualification). 2766660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor bool CheckHiddenResult(Result &R, DeclContext *CurContext, 2776660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor NamedDecl *Hiding); 2786660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor 27986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \brief Add a new result to this result set (if it isn't already in one 28086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// of the shadow maps), or replace an existing result (for, e.g., a 28186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// redeclaration). 282456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor /// 28381f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor /// \param R the result to add (if it is unique). 284456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor /// 28581f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor /// \param CurContext the context in which this result will be named. 286456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor void MaybeAddResult(Result R, DeclContext *CurContext = 0); 28786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 2881ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// \brief Add a new result to this result set, where we already know 2891ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// the hiding declation (if any). 2901ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// 2911ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// \param R the result to add (if it is unique). 2921ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// 2931ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// \param CurContext the context in which this result will be named. 2941ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// 2951ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// \param Hiding the declaration that hides the result. 2960cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor /// 2970cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor /// \param InBaseClass whether the result was found in a base 2980cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor /// class of the searched context. 2990cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor void AddResult(Result R, DeclContext *CurContext, NamedDecl *Hiding, 3000cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor bool InBaseClass); 3011ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 302a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor /// \brief Add a new non-declaration result to this result set. 303a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor void AddResult(Result R); 304a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor 30586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \brief Enter into a new scope. 30686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor void EnterNewScope(); 30786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 30886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \brief Exit from the current scope. 30986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor void ExitScope(); 31086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 31155385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor /// \brief Ignore this declaration, if it is seen again. 31255385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor void Ignore(Decl *D) { AllDeclsFound.insert(D->getCanonicalDecl()); } 31355385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor 31486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \name Name lookup predicates 31586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// 31686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// These predicates can be passed to the name lookup functions to filter the 31786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// results of name lookup. All of the predicates have the same type, so that 31886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// 31986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor //@{ 320791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor bool IsOrdinaryName(NamedDecl *ND) const; 3214710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor bool IsOrdinaryNonTypeName(NamedDecl *ND) const; 322f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor bool IsIntegralConstantValue(NamedDecl *ND) const; 32301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor bool IsOrdinaryNonValueName(NamedDecl *ND) const; 32486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool IsNestedNameSpecifier(NamedDecl *ND) const; 32586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool IsEnum(NamedDecl *ND) const; 32686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool IsClassOrStruct(NamedDecl *ND) const; 32786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool IsUnion(NamedDecl *ND) const; 32886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool IsNamespace(NamedDecl *ND) const; 32986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool IsNamespaceOrAlias(NamedDecl *ND) const; 33086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool IsType(NamedDecl *ND) const; 331eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor bool IsMember(NamedDecl *ND) const; 33280f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor bool IsObjCIvar(NamedDecl *ND) const; 3338e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor bool IsObjCMessageReceiver(NamedDecl *ND) const; 33481f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor bool IsObjCMessageReceiverOrLambdaCapture(NamedDecl *ND) const; 335fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor bool IsObjCCollection(NamedDecl *ND) const; 33652779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor bool IsImpossibleToSatisfy(NamedDecl *ND) const; 33786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor //@} 33886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor }; 33986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 34086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 341fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregorclass ResultBuilder::ShadowMapEntry::iterator { 342fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor llvm::PointerUnion<NamedDecl*, const DeclIndexPair*> DeclOrIterator; 343fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor unsigned SingleDeclIndex; 344fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 345fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregorpublic: 346fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor typedef DeclIndexPair value_type; 347fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor typedef value_type reference; 348fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor typedef std::ptrdiff_t difference_type; 349fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor typedef std::input_iterator_tag iterator_category; 350fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 351fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor class pointer { 352fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor DeclIndexPair Value; 353fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 354fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor public: 355fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor pointer(const DeclIndexPair &Value) : Value(Value) { } 356fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 357fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor const DeclIndexPair *operator->() const { 358fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return &Value; 359fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 360fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor }; 361fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 362fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor iterator() : DeclOrIterator((NamedDecl *)0), SingleDeclIndex(0) { } 363fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 364fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor iterator(NamedDecl *SingleDecl, unsigned Index) 365fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor : DeclOrIterator(SingleDecl), SingleDeclIndex(Index) { } 366fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 367fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor iterator(const DeclIndexPair *Iterator) 368fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor : DeclOrIterator(Iterator), SingleDeclIndex(0) { } 369fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 370fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor iterator &operator++() { 371fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (DeclOrIterator.is<NamedDecl *>()) { 372fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor DeclOrIterator = (NamedDecl *)0; 373fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor SingleDeclIndex = 0; 374fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return *this; 375fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 376fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 377fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor const DeclIndexPair *I = DeclOrIterator.get<const DeclIndexPair*>(); 378fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ++I; 379fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor DeclOrIterator = I; 380fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return *this; 381fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 382fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 38366392d4260cdd1a98f9ce908d99e3cf9a31432e2Chris Lattner /*iterator operator++(int) { 384fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor iterator tmp(*this); 385fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ++(*this); 386fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return tmp; 38766392d4260cdd1a98f9ce908d99e3cf9a31432e2Chris Lattner }*/ 388fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 389fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor reference operator*() const { 390fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (NamedDecl *ND = DeclOrIterator.dyn_cast<NamedDecl *>()) 391fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return reference(ND, SingleDeclIndex); 392fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 393d490f953e812a9bb1729637cc70a6db7d997ced0Douglas Gregor return *DeclOrIterator.get<const DeclIndexPair*>(); 394fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 395fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 396fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor pointer operator->() const { 397fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return pointer(**this); 398fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 399fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 400fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor friend bool operator==(const iterator &X, const iterator &Y) { 401d490f953e812a9bb1729637cc70a6db7d997ced0Douglas Gregor return X.DeclOrIterator.getOpaqueValue() 402d490f953e812a9bb1729637cc70a6db7d997ced0Douglas Gregor == Y.DeclOrIterator.getOpaqueValue() && 403fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor X.SingleDeclIndex == Y.SingleDeclIndex; 404fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 405fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 406fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor friend bool operator!=(const iterator &X, const iterator &Y) { 407d490f953e812a9bb1729637cc70a6db7d997ced0Douglas Gregor return !(X == Y); 408fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 409fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor}; 410fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 411fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas GregorResultBuilder::ShadowMapEntry::iterator 412fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas GregorResultBuilder::ShadowMapEntry::begin() const { 413fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (DeclOrVector.isNull()) 414fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return iterator(); 415fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 416fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (NamedDecl *ND = DeclOrVector.dyn_cast<NamedDecl *>()) 417fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return iterator(ND, SingleDeclIndex); 418fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 419fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return iterator(DeclOrVector.get<DeclIndexPairVector *>()->begin()); 420fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor} 421fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 422fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas GregorResultBuilder::ShadowMapEntry::iterator 423fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas GregorResultBuilder::ShadowMapEntry::end() const { 424fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (DeclOrVector.is<NamedDecl *>() || DeclOrVector.isNull()) 425fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return iterator(); 426fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 427fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return iterator(DeclOrVector.get<DeclIndexPairVector *>()->end()); 428fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor} 429fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 430456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// \brief Compute the qualification required to get from the current context 431456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// (\p CurContext) to the target context (\p TargetContext). 432456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// 433456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// \param Context the AST context in which the qualification will be used. 434456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// 435456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// \param CurContext the context where an entity is being named, which is 436456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// typically based on the current scope. 437456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// 438456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// \param TargetContext the context in which the named entity actually 439456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// resides. 440456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// 441456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// \returns a nested name specifier that refers into the target context, or 442456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// NULL if no qualification is needed. 443456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregorstatic NestedNameSpecifier * 444456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas GregorgetRequiredQualification(ASTContext &Context, 445456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor DeclContext *CurContext, 446456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor DeclContext *TargetContext) { 4475f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<DeclContext *, 4> TargetParents; 448456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor 449456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor for (DeclContext *CommonAncestor = TargetContext; 450456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor CommonAncestor && !CommonAncestor->Encloses(CurContext); 451456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor CommonAncestor = CommonAncestor->getLookupParent()) { 452456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor if (CommonAncestor->isTransparentContext() || 453456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor CommonAncestor->isFunctionOrMethod()) 454456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor continue; 455456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor 456456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor TargetParents.push_back(CommonAncestor); 457456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor } 458456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor 459456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor NestedNameSpecifier *Result = 0; 460456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor while (!TargetParents.empty()) { 461456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor DeclContext *Parent = TargetParents.back(); 462456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor TargetParents.pop_back(); 463456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor 464fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor if (NamespaceDecl *Namespace = dyn_cast<NamespaceDecl>(Parent)) { 465fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor if (!Namespace->getIdentifier()) 466fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor continue; 467fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor 468456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor Result = NestedNameSpecifier::Create(Context, Result, Namespace); 469fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor } 470456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor else if (TagDecl *TD = dyn_cast<TagDecl>(Parent)) 471456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor Result = NestedNameSpecifier::Create(Context, Result, 472456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor false, 473456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor Context.getTypeDeclType(TD).getTypePtr()); 4740c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor } 475456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor return Result; 476456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor} 477456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor 47845bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregorbool ResultBuilder::isInterestingDecl(NamedDecl *ND, 47945bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor bool &AsNestedNameSpecifier) const { 48045bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor AsNestedNameSpecifier = false; 48145bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor 482e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor ND = ND->getUnderlyingDecl(); 483e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor unsigned IDNS = ND->getIdentifierNamespace(); 484f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor 485f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor // Skip unnamed entities. 486e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor if (!ND->getDeclName()) 487e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return false; 48886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 48986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Friend declarations and declarations introduced due to friends are never 49086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // added as results. 49192b7f70c924cbf4514e9e434cea7def51ab49860John McCall if (IDNS & (Decl::IDNS_OrdinaryFriend | Decl::IDNS_TagFriend)) 492e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return false; 493e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 4947628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor // Class template (partial) specializations are never added as results. 495e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor if (isa<ClassTemplateSpecializationDecl>(ND) || 496e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor isa<ClassTemplatePartialSpecializationDecl>(ND)) 497e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return false; 49886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 4997628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor // Using declarations themselves are never added as results. 500e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor if (isa<UsingDecl>(ND)) 501e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return false; 502e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 503e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor // Some declarations have reserved names that we don't want to ever show. 504e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor if (const IdentifierInfo *Id = ND->getIdentifier()) { 50586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // __va_list_tag is a freak of nature. Find it and skip it. 50686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (Id->isStr("__va_list_tag") || Id->isStr("__builtin_va_list")) 507e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return false; 50886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 509f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor // Filter out names reserved for the implementation (C99 7.1.3, 510797efb51ce0825eb4cce2864a5cea2b30e85f06cDouglas Gregor // C++ [lib.global.names]) if they come from a system header. 511e013d685c6689ac7ae103ee88acf573422d1ed6aDaniel Dunbar // 512e013d685c6689ac7ae103ee88acf573422d1ed6aDaniel Dunbar // FIXME: Add predicate for this. 513f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor if (Id->getLength() >= 2) { 514e013d685c6689ac7ae103ee88acf573422d1ed6aDaniel Dunbar const char *Name = Id->getNameStart(); 515f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor if (Name[0] == '_' && 516797efb51ce0825eb4cce2864a5cea2b30e85f06cDouglas Gregor (Name[1] == '_' || (Name[1] >= 'A' && Name[1] <= 'Z')) && 517797efb51ce0825eb4cce2864a5cea2b30e85f06cDouglas Gregor (ND->getLocation().isInvalid() || 518797efb51ce0825eb4cce2864a5cea2b30e85f06cDouglas Gregor SemaRef.SourceMgr.isInSystemHeader( 519797efb51ce0825eb4cce2864a5cea2b30e85f06cDouglas Gregor SemaRef.SourceMgr.getSpellingLoc(ND->getLocation())))) 520e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return false; 521f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor } 52286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 5239b0ba87a5ee4d872ae60dbfe4cbd500e57b8a775Douglas Gregor 524a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor if (Filter == &ResultBuilder::IsNestedNameSpecifier || 525a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor ((isa<NamespaceDecl>(ND) || isa<NamespaceAliasDecl>(ND)) && 526a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor Filter != &ResultBuilder::IsNamespace && 52752779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor Filter != &ResultBuilder::IsNamespaceOrAlias && 52852779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor Filter != 0)) 529a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor AsNestedNameSpecifier = true; 530a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor 53186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Filter out any unwanted results. 53245bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor if (Filter && !(this->*Filter)(ND)) { 53345bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor // Check whether it is interesting as a nested-name-specifier. 5344e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (AllowNestedNameSpecifiers && SemaRef.getLangOpts().CPlusPlus && 53545bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor IsNestedNameSpecifier(ND) && 53645bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor (Filter != &ResultBuilder::IsMember || 53745bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor (isa<CXXRecordDecl>(ND) && 53845bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor cast<CXXRecordDecl>(ND)->isInjectedClassName()))) { 53945bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor AsNestedNameSpecifier = true; 54045bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor return true; 54145bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor } 54245bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor 543e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return false; 544a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor } 545e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor // ... then it must be interesting! 546e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return true; 547e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor} 548e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 5496660d845af8edb99098a08cf2539233a3be650b3Douglas Gregorbool ResultBuilder::CheckHiddenResult(Result &R, DeclContext *CurContext, 5506660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor NamedDecl *Hiding) { 5516660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor // In C, there is no way to refer to a hidden name. 5526660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor // FIXME: This isn't true; we can find a tag name hidden by an ordinary 5536660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor // name if we introduce the tag type. 5544e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (!SemaRef.getLangOpts().CPlusPlus) 5556660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor return true; 5566660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor 5577a126a474fdde06382b315b4e3d8ef0a21d4dc31Sebastian Redl DeclContext *HiddenCtx = R.Declaration->getDeclContext()->getRedeclContext(); 5586660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor 5596660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor // There is no way to qualify a name declared in a function or method. 5606660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor if (HiddenCtx->isFunctionOrMethod()) 5616660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor return true; 5626660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor 5637a126a474fdde06382b315b4e3d8ef0a21d4dc31Sebastian Redl if (HiddenCtx == Hiding->getDeclContext()->getRedeclContext()) 5646660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor return true; 5656660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor 5666660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor // We can refer to the result with the appropriate qualification. Do it. 5676660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor R.Hidden = true; 5686660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor R.QualifierIsInformative = false; 5696660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor 5706660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor if (!R.Qualifier) 5716660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor R.Qualifier = getRequiredQualification(SemaRef.Context, 5726660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor CurContext, 5736660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor R.Declaration->getDeclContext()); 5746660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor return false; 5756660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor} 5766660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor 5771f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor/// \brief A simplified classification of types used to determine whether two 5781f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor/// types are "similar enough" when adjusting priorities. 5791827e10051638770ad9ccf3e285caf95f995afd1Douglas GregorSimplifiedTypeClass clang::getSimplifiedTypeClass(CanQualType T) { 5801f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor switch (T->getTypeClass()) { 5811f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::Builtin: 5821f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor switch (cast<BuiltinType>(T)->getKind()) { 5831f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case BuiltinType::Void: 5841f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Void; 5851f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 5861f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case BuiltinType::NullPtr: 5871f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Pointer; 5881f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 5891f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case BuiltinType::Overload: 5901f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case BuiltinType::Dependent: 5911f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Other; 5921f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 5931f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case BuiltinType::ObjCId: 5941f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case BuiltinType::ObjCClass: 5951f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case BuiltinType::ObjCSel: 5961f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_ObjectiveC; 5971f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 5981f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor default: 5991f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Arithmetic; 6001f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor } 6017530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie 6021f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::Complex: 6031f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Arithmetic; 6041f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 6051f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::Pointer: 6061f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Pointer; 6071f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 6081f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::BlockPointer: 6091f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Block; 6101f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 6111f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::LValueReference: 6121f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::RValueReference: 6131f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return getSimplifiedTypeClass(T->getAs<ReferenceType>()->getPointeeType()); 6141f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 6151f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::ConstantArray: 6161f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::IncompleteArray: 6171f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::VariableArray: 6181f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::DependentSizedArray: 6191f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Array; 6201f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 6211f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::DependentSizedExtVector: 6221f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::Vector: 6231f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::ExtVector: 6241f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Arithmetic; 6251f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 6261f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::FunctionProto: 6271f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::FunctionNoProto: 6281f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Function; 6291f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 6301f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::Record: 6311f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Record; 6321f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 6331f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::Enum: 6341f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Arithmetic; 6351f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 6361f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::ObjCObject: 6371f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::ObjCInterface: 6381f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::ObjCObjectPointer: 6391f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_ObjectiveC; 6401f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 6411f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor default: 6421f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Other; 6431f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor } 6441f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor} 6451f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 6461f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor/// \brief Get the type that a given expression will have if this declaration 6471f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor/// is used as an expression in its "typical" code-completion form. 6481827e10051638770ad9ccf3e285caf95f995afd1Douglas GregorQualType clang::getDeclUsageType(ASTContext &C, NamedDecl *ND) { 6491f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor ND = cast<NamedDecl>(ND->getUnderlyingDecl()); 6501f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 6511f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor if (TypeDecl *Type = dyn_cast<TypeDecl>(ND)) 6521f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return C.getTypeDeclType(Type); 6531f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor if (ObjCInterfaceDecl *Iface = dyn_cast<ObjCInterfaceDecl>(ND)) 6541f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return C.getObjCInterfaceType(Iface); 6551f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 6561f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor QualType T; 6571f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor if (FunctionDecl *Function = dyn_cast<FunctionDecl>(ND)) 6585291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor T = Function->getCallResultType(); 6591f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor else if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(ND)) 6605291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor T = Method->getSendResultType(); 6611f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor else if (FunctionTemplateDecl *FunTmpl = dyn_cast<FunctionTemplateDecl>(ND)) 6625291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor T = FunTmpl->getTemplatedDecl()->getCallResultType(); 6631f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor else if (EnumConstantDecl *Enumerator = dyn_cast<EnumConstantDecl>(ND)) 6641f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor T = C.getTypeDeclType(cast<EnumDecl>(Enumerator->getDeclContext())); 6651f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor else if (ObjCPropertyDecl *Property = dyn_cast<ObjCPropertyDecl>(ND)) 6661f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor T = Property->getType(); 6671f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor else if (ValueDecl *Value = dyn_cast<ValueDecl>(ND)) 6681f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor T = Value->getType(); 6691f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor else 6701f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return QualType(); 6713e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor 6723e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor // Dig through references, function pointers, and block pointers to 6733e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor // get down to the likely type of an expression when the entity is 6743e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor // used. 6753e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor do { 6763e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor if (const ReferenceType *Ref = T->getAs<ReferenceType>()) { 6773e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor T = Ref->getPointeeType(); 6783e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor continue; 6793e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor } 6803e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor 6813e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor if (const PointerType *Pointer = T->getAs<PointerType>()) { 6823e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor if (Pointer->getPointeeType()->isFunctionType()) { 6833e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor T = Pointer->getPointeeType(); 6843e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor continue; 6853e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor } 6863e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor 6873e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor break; 6883e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor } 6893e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor 6903e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor if (const BlockPointerType *Block = T->getAs<BlockPointerType>()) { 6913e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor T = Block->getPointeeType(); 6923e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor continue; 6933e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor } 6943e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor 6953e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor if (const FunctionType *Function = T->getAs<FunctionType>()) { 6963e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor T = Function->getResultType(); 6973e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor continue; 6983e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor } 6993e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor 7003e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor break; 7013e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor } while (true); 7023e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor 7033e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor return T; 7041f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor} 7051f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 706cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregorvoid ResultBuilder::AdjustResultPriorityForDecl(Result &R) { 707cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor // If this is an Objective-C method declaration whose selector matches our 708cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor // preferred selector, give it a priority boost. 709cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor if (!PreferredSelector.isNull()) 710cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(R.Declaration)) 711cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor if (PreferredSelector == Method->getSelector()) 712cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor R.Priority += CCD_SelectorMatch; 71308f43cd5d966fd31b32bd5c76c0645ebbf08b2f1Douglas Gregor 714cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor // If we have a preferred type, adjust the priority for results with exactly- 715cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor // matching or nearly-matching types. 716cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor if (!PreferredType.isNull()) { 717cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor QualType T = getDeclUsageType(SemaRef.Context, R.Declaration); 718cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor if (!T.isNull()) { 719cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor CanQualType TC = SemaRef.Context.getCanonicalType(T); 720cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor // Check for exactly-matching types (modulo qualifiers). 721cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor if (SemaRef.Context.hasSameUnqualifiedType(PreferredType, TC)) 722cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor R.Priority /= CCF_ExactTypeMatch; 723cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor // Check for nearly-matching types, based on classification of each. 724cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor else if ((getSimplifiedTypeClass(PreferredType) 7251f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor == getSimplifiedTypeClass(TC)) && 726cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor !(PreferredType->isEnumeralType() && TC->isEnumeralType())) 727cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor R.Priority /= CCF_SimilarTypeMatch; 728cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor } 729cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor } 7301f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor} 7311f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 7326f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregorvoid ResultBuilder::MaybeAddConstructorResults(Result R) { 7334e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (!SemaRef.getLangOpts().CPlusPlus || !R.Declaration || 7346f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor !CompletionContext.wantConstructorResults()) 7356f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor return; 7366f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 7376f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor ASTContext &Context = SemaRef.Context; 7386f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor NamedDecl *D = R.Declaration; 7396f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor CXXRecordDecl *Record = 0; 7406f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor if (ClassTemplateDecl *ClassTemplate = dyn_cast<ClassTemplateDecl>(D)) 7416f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor Record = ClassTemplate->getTemplatedDecl(); 7426f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor else if ((Record = dyn_cast<CXXRecordDecl>(D))) { 7436f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor // Skip specializations and partial specializations. 7446f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor if (isa<ClassTemplateSpecializationDecl>(Record)) 7456f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor return; 7466f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor } else { 7476f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor // There are no constructors here. 7486f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor return; 7496f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor } 7506f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 7516f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor Record = Record->getDefinition(); 7526f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor if (!Record) 7536f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor return; 7546f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 7556f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 7566f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor QualType RecordTy = Context.getTypeDeclType(Record); 7576f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor DeclarationName ConstructorName 7586f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor = Context.DeclarationNames.getCXXConstructorName( 7596f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor Context.getCanonicalType(RecordTy)); 7606f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor for (DeclContext::lookup_result Ctors = Record->lookup(ConstructorName); 7616f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor Ctors.first != Ctors.second; ++Ctors.first) { 7626f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor R.Declaration = *Ctors.first; 7636f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor R.CursorKind = getCursorKindForDecl(R.Declaration); 7646f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor Results.push_back(R); 7656f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor } 7666f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor} 7676f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 768e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregorvoid ResultBuilder::MaybeAddResult(Result R, DeclContext *CurContext) { 769e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor assert(!ShadowMaps.empty() && "Must enter into a results scope"); 770e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 771e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor if (R.Kind != Result::RK_Declaration) { 772e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor // For non-declaration results, just add the result. 773e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor Results.push_back(R); 774e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return; 775e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor } 776e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 777e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor // Look through using declarations. 778e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor if (UsingShadowDecl *Using = dyn_cast<UsingShadowDecl>(R.Declaration)) { 779e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor MaybeAddResult(Result(Using->getTargetDecl(), R.Qualifier), CurContext); 78086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return; 781e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor } 78286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 783e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor Decl *CanonDecl = R.Declaration->getCanonicalDecl(); 784e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor unsigned IDNS = CanonDecl->getIdentifierNamespace(); 785e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 78645bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor bool AsNestedNameSpecifier = false; 78745bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor if (!isInterestingDecl(R.Declaration, AsNestedNameSpecifier)) 788e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return; 789e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 7906f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor // C++ constructors are never found by name lookup. 7916f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor if (isa<CXXConstructorDecl>(R.Declaration)) 7926f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor return; 7936f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 79486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ShadowMap &SMap = ShadowMaps.back(); 795fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ShadowMapEntry::iterator I, IEnd; 796fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ShadowMap::iterator NamePos = SMap.find(R.Declaration->getDeclName()); 797fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (NamePos != SMap.end()) { 798fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor I = NamePos->second.begin(); 799fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor IEnd = NamePos->second.end(); 800fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 801fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 802fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor for (; I != IEnd; ++I) { 803fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor NamedDecl *ND = I->first; 804fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor unsigned Index = I->second; 80586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (ND->getCanonicalDecl() == CanonDecl) { 80686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // This is a redeclaration. Always pick the newer declaration. 80786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Results[Index].Declaration = R.Declaration; 80886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 80986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // We're done. 81086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return; 81186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 81286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 81386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 81486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // This is a new declaration in this scope. However, check whether this 81586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // declaration name is hidden by a similarly-named declaration in an outer 81686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // scope. 81786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor std::list<ShadowMap>::iterator SM, SMEnd = ShadowMaps.end(); 81886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor --SMEnd; 81986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor for (SM = ShadowMaps.begin(); SM != SMEnd; ++SM) { 820fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ShadowMapEntry::iterator I, IEnd; 821fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ShadowMap::iterator NamePos = SM->find(R.Declaration->getDeclName()); 822fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (NamePos != SM->end()) { 823fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor I = NamePos->second.begin(); 824fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor IEnd = NamePos->second.end(); 825fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 826fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor for (; I != IEnd; ++I) { 82786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // A tag declaration does not hide a non-tag declaration. 8280d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCall if (I->first->hasTagIdentifierNamespace() && 82986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor (IDNS & (Decl::IDNS_Member | Decl::IDNS_Ordinary | 83086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Decl::IDNS_ObjCProtocol))) 83186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor continue; 83286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 83386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Protocols are in distinct namespaces from everything else. 834fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (((I->first->getIdentifierNamespace() & Decl::IDNS_ObjCProtocol) 83586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor || (IDNS & Decl::IDNS_ObjCProtocol)) && 836fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor I->first->getIdentifierNamespace() != IDNS) 83786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor continue; 83886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 83986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // The newly-added result is hidden by an entry in the shadow map. 8406660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor if (CheckHiddenResult(R, CurContext, I->first)) 84186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return; 84286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 84386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor break; 84486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 84586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 84686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 84786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Make sure that any given declaration only shows up in the result set once. 84886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!AllDeclsFound.insert(CanonDecl)) 84986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return; 850265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor 851eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor // If the filter is for nested-name-specifiers, then this result starts a 852eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor // nested-name-specifier. 85312e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor if (AsNestedNameSpecifier) { 854eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor R.StartsNestedNameSpecifier = true; 85512e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor R.Priority = CCP_NestedNameSpecifier; 856cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor } else 857cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor AdjustResultPriorityForDecl(R); 858265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor 8590563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor // If this result is supposed to have an informative qualifier, add one. 860eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor if (R.QualifierIsInformative && !R.Qualifier && 861eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor !R.StartsNestedNameSpecifier) { 8620563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor DeclContext *Ctx = R.Declaration->getDeclContext(); 8630563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor if (NamespaceDecl *Namespace = dyn_cast<NamespaceDecl>(Ctx)) 8640563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor R.Qualifier = NestedNameSpecifier::Create(SemaRef.Context, 0, Namespace); 8650563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor else if (TagDecl *Tag = dyn_cast<TagDecl>(Ctx)) 8660563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor R.Qualifier = NestedNameSpecifier::Create(SemaRef.Context, 0, false, 8670563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor SemaRef.Context.getTypeDeclType(Tag).getTypePtr()); 8680563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor else 8690563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor R.QualifierIsInformative = false; 8700563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor } 871eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor 87286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Insert this result into the set of results and into the current shadow 87386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // map. 874fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor SMap[R.Declaration->getDeclName()].Add(R.Declaration, Results.size()); 87586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Results.push_back(R); 8766f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 8776f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor if (!AsNestedNameSpecifier) 8786f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor MaybeAddConstructorResults(R); 87986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 88086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 8811ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregorvoid ResultBuilder::AddResult(Result R, DeclContext *CurContext, 8820cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor NamedDecl *Hiding, bool InBaseClass = false) { 883a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor if (R.Kind != Result::RK_Declaration) { 884a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor // For non-declaration results, just add the result. 885a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.push_back(R); 886a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor return; 887a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor } 888a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor 8891ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor // Look through using declarations. 8901ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor if (UsingShadowDecl *Using = dyn_cast<UsingShadowDecl>(R.Declaration)) { 8911ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor AddResult(Result(Using->getTargetDecl(), R.Qualifier), CurContext, Hiding); 8921ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor return; 8931ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor } 8941ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 89545bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor bool AsNestedNameSpecifier = false; 89645bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor if (!isInterestingDecl(R.Declaration, AsNestedNameSpecifier)) 8971ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor return; 8981ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 8996f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor // C++ constructors are never found by name lookup. 9006f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor if (isa<CXXConstructorDecl>(R.Declaration)) 9016f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor return; 9026f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 9031ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor if (Hiding && CheckHiddenResult(R, CurContext, Hiding)) 9041ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor return; 905173a37a57b79bd8f94b85c2273039e760b159922Nick Lewycky 9061ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor // Make sure that any given declaration only shows up in the result set once. 9071ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor if (!AllDeclsFound.insert(R.Declaration->getCanonicalDecl())) 9081ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor return; 9091ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 9101ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor // If the filter is for nested-name-specifiers, then this result starts a 9111ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor // nested-name-specifier. 91212e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor if (AsNestedNameSpecifier) { 9131ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor R.StartsNestedNameSpecifier = true; 91412e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor R.Priority = CCP_NestedNameSpecifier; 91512e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor } 9160cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor else if (Filter == &ResultBuilder::IsMember && !R.Qualifier && InBaseClass && 9170cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor isa<CXXRecordDecl>(R.Declaration->getDeclContext() 9187a126a474fdde06382b315b4e3d8ef0a21d4dc31Sebastian Redl ->getRedeclContext())) 9190cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor R.QualifierIsInformative = true; 9200cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor 9211ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor // If this result is supposed to have an informative qualifier, add one. 9221ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor if (R.QualifierIsInformative && !R.Qualifier && 9231ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor !R.StartsNestedNameSpecifier) { 9241ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor DeclContext *Ctx = R.Declaration->getDeclContext(); 9251ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor if (NamespaceDecl *Namespace = dyn_cast<NamespaceDecl>(Ctx)) 9261ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor R.Qualifier = NestedNameSpecifier::Create(SemaRef.Context, 0, Namespace); 9271ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor else if (TagDecl *Tag = dyn_cast<TagDecl>(Ctx)) 9281ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor R.Qualifier = NestedNameSpecifier::Create(SemaRef.Context, 0, false, 92945bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor SemaRef.Context.getTypeDeclType(Tag).getTypePtr()); 9301ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor else 9311ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor R.QualifierIsInformative = false; 9321ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor } 9331ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 93412e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor // Adjust the priority if this result comes from a base class. 93512e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor if (InBaseClass) 93612e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor R.Priority += CCD_InBaseClass; 93712e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor 938cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor AdjustResultPriorityForDecl(R); 9395ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 9403cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor if (HasObjectTypeQualifiers) 9413cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(R.Declaration)) 9423cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor if (Method->isInstance()) { 9433cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor Qualifiers MethodQuals 9443cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor = Qualifiers::fromCVRMask(Method->getTypeQualifiers()); 9453cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor if (ObjectTypeQualifiers == MethodQuals) 9463cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor R.Priority += CCD_ObjectQualifierMatch; 9473cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor else if (ObjectTypeQualifiers - MethodQuals) { 9483cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor // The method cannot be invoked, because doing so would drop 9493cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor // qualifiers. 9503cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor return; 9513cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor } 9523cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor } 9533cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor 9541ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor // Insert this result into the set of results. 9551ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor Results.push_back(R); 9566f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 9576f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor if (!AsNestedNameSpecifier) 9586f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor MaybeAddConstructorResults(R); 9591ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor} 9601ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 961a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregorvoid ResultBuilder::AddResult(Result R) { 962a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor assert(R.Kind != Result::RK_Declaration && 963a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor "Declaration results need more context"); 964a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.push_back(R); 965a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor} 966a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor 96786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Enter into a new scope. 96886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorvoid ResultBuilder::EnterNewScope() { 96986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ShadowMaps.push_back(ShadowMap()); 97086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 97186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 97286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Exit from the current scope. 97386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorvoid ResultBuilder::ExitScope() { 974fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor for (ShadowMap::iterator E = ShadowMaps.back().begin(), 975fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor EEnd = ShadowMaps.back().end(); 976fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor E != EEnd; 977fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ++E) 978fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor E->second.Destroy(); 979fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 98086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ShadowMaps.pop_back(); 98186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 98286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 983791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor/// \brief Determines whether this given declaration will be found by 984791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor/// ordinary name lookup. 985791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregorbool ResultBuilder::IsOrdinaryName(NamedDecl *ND) const { 9864710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor ND = cast<NamedDecl>(ND->getUnderlyingDecl()); 9874710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor 988791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor unsigned IDNS = Decl::IDNS_Ordinary; 9894e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (SemaRef.getLangOpts().CPlusPlus) 9909b30b267e77d1778e1e9b7c44b6852489c2c5096Douglas Gregor IDNS |= Decl::IDNS_Tag | Decl::IDNS_Namespace | Decl::IDNS_Member; 9914e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie else if (SemaRef.getLangOpts().ObjC1) { 992ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor if (isa<ObjCIvarDecl>(ND)) 993ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor return true; 994ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor } 995ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor 996791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor return ND->getIdentifierNamespace() & IDNS; 997791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor} 998791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor 99901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor/// \brief Determines whether this given declaration will be found by 10004710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor/// ordinary name lookup but is not a type name. 10014710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregorbool ResultBuilder::IsOrdinaryNonTypeName(NamedDecl *ND) const { 10024710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor ND = cast<NamedDecl>(ND->getUnderlyingDecl()); 10034710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor if (isa<TypeDecl>(ND) || isa<ObjCInterfaceDecl>(ND)) 10044710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor return false; 10054710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor 10064710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor unsigned IDNS = Decl::IDNS_Ordinary; 10074e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (SemaRef.getLangOpts().CPlusPlus) 10089b30b267e77d1778e1e9b7c44b6852489c2c5096Douglas Gregor IDNS |= Decl::IDNS_Tag | Decl::IDNS_Namespace | Decl::IDNS_Member; 10094e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie else if (SemaRef.getLangOpts().ObjC1) { 1010ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor if (isa<ObjCIvarDecl>(ND)) 1011ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor return true; 1012ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor } 1013ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor 10144710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor return ND->getIdentifierNamespace() & IDNS; 10154710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor} 10164710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor 1017f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregorbool ResultBuilder::IsIntegralConstantValue(NamedDecl *ND) const { 1018f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor if (!IsOrdinaryNonTypeName(ND)) 1019f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor return 0; 1020f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor 1021f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor if (ValueDecl *VD = dyn_cast<ValueDecl>(ND->getUnderlyingDecl())) 1022f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor if (VD->getType()->isIntegralOrEnumerationType()) 1023f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor return true; 1024f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor 1025f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor return false; 1026f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor} 1027f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor 10284710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor/// \brief Determines whether this given declaration will be found by 102901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor/// ordinary name lookup. 103001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregorbool ResultBuilder::IsOrdinaryNonValueName(NamedDecl *ND) const { 10314710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor ND = cast<NamedDecl>(ND->getUnderlyingDecl()); 10324710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor 103301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor unsigned IDNS = Decl::IDNS_Ordinary; 10344e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (SemaRef.getLangOpts().CPlusPlus) 10350d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCall IDNS |= Decl::IDNS_Tag | Decl::IDNS_Namespace; 103601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 103701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor return (ND->getIdentifierNamespace() & IDNS) && 10384710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor !isa<ValueDecl>(ND) && !isa<FunctionTemplateDecl>(ND) && 10394710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor !isa<ObjCPropertyDecl>(ND); 104001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor} 104101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 104286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Determines whether the given declaration is suitable as the 104386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// start of a C++ nested-name-specifier, e.g., a class or namespace. 104486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsNestedNameSpecifier(NamedDecl *ND) const { 104586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Allow us to find class templates, too. 104686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (ClassTemplateDecl *ClassTemplate = dyn_cast<ClassTemplateDecl>(ND)) 104786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ND = ClassTemplate->getTemplatedDecl(); 104886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 104986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return SemaRef.isAcceptableNestedNameSpecifier(ND); 105086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 105186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 105286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Determines whether the given declaration is an enumeration. 105386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsEnum(NamedDecl *ND) const { 105486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return isa<EnumDecl>(ND); 105586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 105686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 105786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Determines whether the given declaration is a class or struct. 105886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsClassOrStruct(NamedDecl *ND) const { 105986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Allow us to find class templates, too. 106086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (ClassTemplateDecl *ClassTemplate = dyn_cast<ClassTemplateDecl>(ND)) 106186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ND = ClassTemplate->getTemplatedDecl(); 106286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 106386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (RecordDecl *RD = dyn_cast<RecordDecl>(ND)) 1064465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara return RD->getTagKind() == TTK_Class || 1065465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara RD->getTagKind() == TTK_Struct; 106686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 106786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return false; 106886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 106986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 107086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Determines whether the given declaration is a union. 107186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsUnion(NamedDecl *ND) const { 107286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Allow us to find class templates, too. 107386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (ClassTemplateDecl *ClassTemplate = dyn_cast<ClassTemplateDecl>(ND)) 107486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ND = ClassTemplate->getTemplatedDecl(); 107586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 107686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (RecordDecl *RD = dyn_cast<RecordDecl>(ND)) 1077465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara return RD->getTagKind() == TTK_Union; 107886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 107986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return false; 108086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 108186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 108286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Determines whether the given declaration is a namespace. 108386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsNamespace(NamedDecl *ND) const { 108486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return isa<NamespaceDecl>(ND); 108586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 108686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 108786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Determines whether the given declaration is a namespace or 108886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// namespace alias. 108986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsNamespaceOrAlias(NamedDecl *ND) const { 109086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return isa<NamespaceDecl>(ND) || isa<NamespaceAliasDecl>(ND); 109186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 109286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 10937628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor/// \brief Determines whether the given declaration is a type. 109486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsType(NamedDecl *ND) const { 1095d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor if (UsingShadowDecl *Using = dyn_cast<UsingShadowDecl>(ND)) 1096d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor ND = Using->getTargetDecl(); 1097d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor 1098d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor return isa<TypeDecl>(ND) || isa<ObjCInterfaceDecl>(ND); 109986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 110086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 11017628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor/// \brief Determines which members of a class should be visible via 11027628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor/// "." or "->". Only value declarations, nested name specifiers, and 11037628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor/// using declarations thereof should show up. 1104eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregorbool ResultBuilder::IsMember(NamedDecl *ND) const { 11057628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor if (UsingShadowDecl *Using = dyn_cast<UsingShadowDecl>(ND)) 11067628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor ND = Using->getTargetDecl(); 11077628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor 1108ce82196076cd15f5ecfa029fcda8b58dc0146cf1Douglas Gregor return isa<ValueDecl>(ND) || isa<FunctionTemplateDecl>(ND) || 1109ce82196076cd15f5ecfa029fcda8b58dc0146cf1Douglas Gregor isa<ObjCPropertyDecl>(ND); 1110eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor} 1111eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor 11128e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregorstatic bool isObjCReceiverType(ASTContext &C, QualType T) { 11138e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor T = C.getCanonicalType(T); 11148e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor switch (T->getTypeClass()) { 11158e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor case Type::ObjCObject: 11168e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor case Type::ObjCInterface: 11178e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor case Type::ObjCObjectPointer: 11188e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor return true; 11198e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 11208e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor case Type::Builtin: 11218e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor switch (cast<BuiltinType>(T)->getKind()) { 11228e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor case BuiltinType::ObjCId: 11238e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor case BuiltinType::ObjCClass: 11248e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor case BuiltinType::ObjCSel: 11258e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor return true; 11268e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 11278e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor default: 11288e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor break; 11298e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor } 11308e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor return false; 11318e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 11328e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor default: 11338e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor break; 11348e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor } 11358e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 11364e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (!C.getLangOpts().CPlusPlus) 11378e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor return false; 11388e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 11398e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor // FIXME: We could perform more analysis here to determine whether a 11408e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor // particular class type has any conversions to Objective-C types. For now, 11418e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor // just accept all class types. 11428e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor return T->isDependentType() || T->isRecordType(); 11438e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor} 11448e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 11458e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregorbool ResultBuilder::IsObjCMessageReceiver(NamedDecl *ND) const { 11468e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor QualType T = getDeclUsageType(SemaRef.Context, ND); 11478e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor if (T.isNull()) 11488e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor return false; 11498e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 11508e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor T = SemaRef.Context.getBaseElementType(T); 11518e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor return isObjCReceiverType(SemaRef.Context, T); 11528e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor} 11538e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 115481f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregorbool ResultBuilder::IsObjCMessageReceiverOrLambdaCapture(NamedDecl *ND) const { 115581f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor if (IsObjCMessageReceiver(ND)) 115681f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor return true; 115781f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor 115881f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor VarDecl *Var = dyn_cast<VarDecl>(ND); 115981f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor if (!Var) 116081f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor return false; 116181f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor 116281f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor return Var->hasLocalStorage() && !Var->hasAttr<BlocksAttr>(); 116381f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor} 116481f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor 1165fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregorbool ResultBuilder::IsObjCCollection(NamedDecl *ND) const { 11664e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if ((SemaRef.getLangOpts().CPlusPlus && !IsOrdinaryName(ND)) || 11674e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie (!SemaRef.getLangOpts().CPlusPlus && !IsOrdinaryNonTypeName(ND))) 1168fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor return false; 1169fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor 1170fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor QualType T = getDeclUsageType(SemaRef.Context, ND); 1171fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor if (T.isNull()) 1172fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor return false; 1173fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor 1174fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor T = SemaRef.Context.getBaseElementType(T); 1175fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor return T->isObjCObjectType() || T->isObjCObjectPointerType() || 1176fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor T->isObjCIdType() || 11774e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie (SemaRef.getLangOpts().CPlusPlus && T->isRecordType()); 1178fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor} 11798e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 118052779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregorbool ResultBuilder::IsImpossibleToSatisfy(NamedDecl *ND) const { 118152779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor return false; 118252779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor} 118352779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor 1184de23c7e9069b2ea2cd2633efd9566546e2c68926James Dennett/// \brief Determines whether the given declaration is an Objective-C 118580f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor/// instance variable. 118680f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregorbool ResultBuilder::IsObjCIvar(NamedDecl *ND) const { 118780f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor return isa<ObjCIvarDecl>(ND); 118880f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor} 118980f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor 11901ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregornamespace { 11911ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// \brief Visible declaration consumer that adds a code-completion result 11921ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// for each visible declaration. 11931ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor class CodeCompletionDeclConsumer : public VisibleDeclConsumer { 11941ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor ResultBuilder &Results; 11951ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor DeclContext *CurContext; 11961ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 11971ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor public: 11981ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor CodeCompletionDeclConsumer(ResultBuilder &Results, DeclContext *CurContext) 11991ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor : Results(Results), CurContext(CurContext) { } 12001ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 1201d12059673dcef32bc2b6bae5321654d33863afe6Erik Verbruggen virtual void FoundDecl(NamedDecl *ND, NamedDecl *Hiding, DeclContext *Ctx, 1202d12059673dcef32bc2b6bae5321654d33863afe6Erik Verbruggen bool InBaseClass) { 1203d12059673dcef32bc2b6bae5321654d33863afe6Erik Verbruggen bool Accessible = true; 120417015eff2b3166e445377b15913474b472775e7cDouglas Gregor if (Ctx) 120517015eff2b3166e445377b15913474b472775e7cDouglas Gregor Accessible = Results.getSema().IsSimplyAccessible(ND, Ctx); 120617015eff2b3166e445377b15913474b472775e7cDouglas Gregor 1207d12059673dcef32bc2b6bae5321654d33863afe6Erik Verbruggen ResultBuilder::Result Result(ND, 0, false, Accessible); 1208d12059673dcef32bc2b6bae5321654d33863afe6Erik Verbruggen Results.AddResult(Result, CurContext, Hiding, InBaseClass); 12091ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor } 12101ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor }; 12111ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor} 12121ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 121386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Add type specifiers for the current language as keyword results. 1214bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddTypeSpecifierResults(const LangOptions &LangOpts, 121586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ResultBuilder &Results) { 12160a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 121712e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("short", CCP_Type)); 121812e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("long", CCP_Type)); 121912e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("signed", CCP_Type)); 122012e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("unsigned", CCP_Type)); 122112e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("void", CCP_Type)); 122212e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("char", CCP_Type)); 122312e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("int", CCP_Type)); 122412e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("float", CCP_Type)); 122512e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("double", CCP_Type)); 122612e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("enum", CCP_Type)); 122712e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("struct", CCP_Type)); 122812e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("union", CCP_Type)); 122912e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("const", CCP_Type)); 123012e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("volatile", CCP_Type)); 123101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 123286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (LangOpts.C99) { 123386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // C99-specific 123412e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("_Complex", CCP_Type)); 123512e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("_Imaginary", CCP_Type)); 123612e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("_Bool", CCP_Type)); 123712e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("restrict", CCP_Type)); 123886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 123986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 124028a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Builder(Results.getAllocator(), 124128a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis Results.getCodeCompletionTUInfo()); 124286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (LangOpts.CPlusPlus) { 124386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // C++-specific 1244b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor Results.AddResult(Result("bool", CCP_Type + 1245b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor (LangOpts.ObjC1? CCD_bool_in_ObjC : 0))); 124612e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("class", CCP_Type)); 124712e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("wchar_t", CCP_Type)); 124886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 1249c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // typename qualified-id 1250218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("typename"); 1251218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1252218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("qualifier"); 1253218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("::"); 1254218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("name"); 1255218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1256d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor 125786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (LangOpts.CPlusPlus0x) { 125812e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("auto", CCP_Type)); 125912e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("char16_t", CCP_Type)); 126012e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("char32_t", CCP_Type)); 1261c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor 1262218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("decltype"); 1263218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1264218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1265218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1266218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 126786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 126886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 126986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 127086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // GNU extensions 127186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (LangOpts.GNUMode) { 127286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // FIXME: Enable when we actually support decimal floating point. 1273a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor // Results.AddResult(Result("_Decimal32")); 1274a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor // Results.AddResult(Result("_Decimal64")); 1275a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor // Results.AddResult(Result("_Decimal128")); 127601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1277218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("typeof"); 1278218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1279218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1280218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1281c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor 1282218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("typeof"); 1283218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1284218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("type"); 1285218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1286218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 128701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 128801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor} 128901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1290f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCallstatic void AddStorageSpecifiers(Sema::ParserCompletionContext CCC, 129101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor const LangOptions &LangOpts, 129201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor ResultBuilder &Results) { 12930a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 129401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Note: we don't suggest either "auto" or "register", because both 129501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // are pointless as storage specifiers. Elsewhere, we suggest "auto" 129601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // in C++0x as a type specifier. 1297a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("extern")); 1298a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("static")); 129901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor} 130001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1301f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCallstatic void AddFunctionSpecifiers(Sema::ParserCompletionContext CCC, 130201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor const LangOptions &LangOpts, 130301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor ResultBuilder &Results) { 13040a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 130501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor switch (CCC) { 1306f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Class: 1307f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_MemberTemplate: 130801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (LangOpts.CPlusPlus) { 1309a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("explicit")); 1310a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("friend")); 1311a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("mutable")); 1312a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("virtual")); 131301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 131401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Fall through 131501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1316f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ObjCInterface: 1317f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ObjCImplementation: 1318f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Namespace: 1319f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Template: 132001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (LangOpts.CPlusPlus || LangOpts.C99) 1321a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("inline")); 132201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 132301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1324f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ObjCInstanceVariableList: 1325f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Expression: 1326f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Statement: 1327f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ForInit: 1328f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Condition: 1329f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_RecoveryInFunction: 1330f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Type: 13310268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor case Sema::PCC_ParenthesizedExpression: 133268e3c2eef52701a178fbcc2bb424f31dd4b36931Douglas Gregor case Sema::PCC_LocalDeclarationSpecifiers: 133301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 133401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 133501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor} 133601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1337bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCExpressionResults(ResultBuilder &Results, bool NeedAt); 1338bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCStatementResults(ResultBuilder &Results, bool NeedAt); 1339bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCVisibilityResults(const LangOptions &LangOpts, 1340c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor ResultBuilder &Results, 1341c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor bool NeedAt); 1342bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCImplementationResults(const LangOptions &LangOpts, 1343b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor ResultBuilder &Results, 1344b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor bool NeedAt); 1345bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCInterfaceResults(const LangOptions &LangOpts, 1346b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor ResultBuilder &Results, 1347b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor bool NeedAt); 1348bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCTopLevelResults(ResultBuilder &Results, bool NeedAt); 1349b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 1350c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregorstatic void AddTypedefResult(ResultBuilder &Results) { 135128a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Builder(Results.getAllocator(), 135228a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis Results.getCodeCompletionTUInfo()); 1353218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("typedef"); 1354218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1355218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("type"); 1356218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1357218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("name"); 1358218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(CodeCompletionResult(Builder.TakeString())); 1359c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor} 1360c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor 1361f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCallstatic bool WantTypesInContext(Sema::ParserCompletionContext CCC, 13624710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor const LangOptions &LangOpts) { 13634710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor switch (CCC) { 1364f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Namespace: 1365f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Class: 1366f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ObjCInstanceVariableList: 1367f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Template: 1368f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_MemberTemplate: 1369f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Statement: 1370f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_RecoveryInFunction: 1371f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Type: 13720268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor case Sema::PCC_ParenthesizedExpression: 137368e3c2eef52701a178fbcc2bb424f31dd4b36931Douglas Gregor case Sema::PCC_LocalDeclarationSpecifiers: 13744710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor return true; 13754710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor 1376f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Expression: 1377f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Condition: 13780268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor return LangOpts.CPlusPlus; 13790268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor 13800268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor case Sema::PCC_ObjCInterface: 13810268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor case Sema::PCC_ObjCImplementation: 13824710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor return false; 13834710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor 1384f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ForInit: 13850268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor return LangOpts.CPlusPlus || LangOpts.ObjC1 || LangOpts.C99; 13864710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor } 13877530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie 13887530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie llvm_unreachable("Invalid ParserCompletionContext!"); 13894710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor} 13904710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor 1391ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidisstatic PrintingPolicy getCompletionPrintingPolicy(const ASTContext &Context, 1392ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis const Preprocessor &PP) { 1393ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis PrintingPolicy Policy = Sema::getPrintingPolicy(Context, PP); 13948ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Policy.AnonymousTagLocations = false; 13958ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Policy.SuppressStrongLifetime = true; 139625270b6e6a8416b7532cfe552b41794418ea19b1Douglas Gregor Policy.SuppressUnwrittenScope = true; 13978ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor return Policy; 13988ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor} 13998ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor 1400ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis/// \brief Retrieve a printing policy suitable for code completion. 1401ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidisstatic PrintingPolicy getCompletionPrintingPolicy(Sema &S) { 1402ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis return getCompletionPrintingPolicy(S.Context, S.PP); 1403ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis} 1404ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis 14058ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor/// \brief Retrieve the string representation of the given type as a string 14068ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor/// that has the appropriate lifetime for code completion. 14078ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor/// 14088ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor/// This routine provides a fast path where we provide constant strings for 14098ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor/// common type names. 14108ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregorstatic const char *GetCompletionTypeString(QualType T, 14118ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor ASTContext &Context, 14128ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor const PrintingPolicy &Policy, 14138ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor CodeCompletionAllocator &Allocator) { 14148ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor if (!T.getLocalQualifiers()) { 14158ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor // Built-in type names are constant strings. 14168ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor if (const BuiltinType *BT = dyn_cast<BuiltinType>(T)) 141727a00970bf4ababdc115e54383e6252cc3276dfaArgyrios Kyrtzidis return BT->getNameAsCString(Policy); 14188ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor 14198ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor // Anonymous tag types are constant strings. 14208ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor if (const TagType *TagT = dyn_cast<TagType>(T)) 14218ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor if (TagDecl *Tag = TagT->getDecl()) 14228ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor if (!Tag->getIdentifier() && !Tag->getTypedefNameForAnonDecl()) { 14238ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor switch (Tag->getTagKind()) { 14248ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor case TTK_Struct: return "struct <anonymous>"; 14258ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor case TTK_Class: return "class <anonymous>"; 14268ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor case TTK_Union: return "union <anonymous>"; 14278ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor case TTK_Enum: return "enum <anonymous>"; 14288ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor } 14298ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor } 14308ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor } 14318ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor 14328ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor // Slow path: format the type as a string. 14338ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor std::string Result; 14348ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor T.getAsStringInternal(Result, Policy); 14358ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor return Allocator.CopyString(Result); 14368ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor} 14378ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor 143881f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor/// \brief Add a completion for "this", if we're in a member function. 143981f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregorstatic void addThisCompletion(Sema &S, ResultBuilder &Results) { 144081f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor QualType ThisTy = S.getCurrentThisType(); 144181f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor if (ThisTy.isNull()) 144281f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor return; 144381f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor 144481f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor CodeCompletionAllocator &Allocator = Results.getAllocator(); 144528a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo()); 144681f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor PrintingPolicy Policy = getCompletionPrintingPolicy(S); 144781f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor Builder.AddResultTypeChunk(GetCompletionTypeString(ThisTy, 144881f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor S.Context, 144981f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor Policy, 145081f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor Allocator)); 145181f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor Builder.AddTypedTextChunk("this"); 145281f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor Results.AddResult(CodeCompletionResult(Builder.TakeString())); 145381f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor} 145481f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor 145501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor/// \brief Add language constructs that show up for "ordinary" names. 1456f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCallstatic void AddOrdinaryNameResults(Sema::ParserCompletionContext CCC, 145701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Scope *S, 145801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Sema &SemaRef, 145901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor ResultBuilder &Results) { 14608ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor CodeCompletionAllocator &Allocator = Results.getAllocator(); 146128a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo()); 14628ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor PrintingPolicy Policy = getCompletionPrintingPolicy(SemaRef); 1463218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor 14640a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 146501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor switch (CCC) { 1466f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Namespace: 14674e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (SemaRef.getLangOpts().CPlusPlus) { 1468c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor if (Results.includeCodePatterns()) { 1469c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // namespace <identifier> { declarations } 1470218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("namespace"); 1471218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1472218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("identifier"); 1473218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 1474218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("declarations"); 1475218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 1476218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 1477218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1478c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor } 1479c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor 148001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // namespace identifier = identifier ; 1481218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("namespace"); 1482218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1483218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("name"); 1484218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_Equal); 1485218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("namespace"); 1486218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 148701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 148801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Using directives 1489218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("using"); 1490218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1491218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("namespace"); 1492218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1493218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("identifier"); 1494218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 149501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 149601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // asm(string-literal) 1497218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("asm"); 1498218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1499218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("string-literal"); 1500218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1501218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 150201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1503c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor if (Results.includeCodePatterns()) { 1504c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // Explicit template instantiation 1505218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("template"); 1506218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1507218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("declaration"); 1508218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1509c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor } 151001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 1511b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 15124e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (SemaRef.getLangOpts().ObjC1) 1513bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCTopLevelResults(Results, true); 1514b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 1515c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor AddTypedefResult(Results); 151601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Fall through 151701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1518f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Class: 15194e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (SemaRef.getLangOpts().CPlusPlus) { 152001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Using declaration 1521218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("using"); 1522218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1523218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("qualifier"); 1524218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("::"); 1525218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("name"); 1526218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 152701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1528c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // using typename qualifier::name (only in a dependent context) 152901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (SemaRef.CurContext->isDependentContext()) { 1530218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("using"); 1531218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1532218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("typename"); 1533218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1534218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("qualifier"); 1535218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("::"); 1536218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("name"); 1537218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 153801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 153901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1540f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall if (CCC == Sema::PCC_Class) { 1541c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor AddTypedefResult(Results); 1542c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor 154301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // public: 1544218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("public"); 154510ccf12a06cc1ef5b778c20565945f313a9a2c26Douglas Gregor if (Results.includeCodePatterns()) 154610ccf12a06cc1ef5b778c20565945f313a9a2c26Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_Colon); 1547218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 154801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 154901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // protected: 1550218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("protected"); 155110ccf12a06cc1ef5b778c20565945f313a9a2c26Douglas Gregor if (Results.includeCodePatterns()) 155210ccf12a06cc1ef5b778c20565945f313a9a2c26Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_Colon); 1553218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 155401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 155501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // private: 1556218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("private"); 155710ccf12a06cc1ef5b778c20565945f313a9a2c26Douglas Gregor if (Results.includeCodePatterns()) 155810ccf12a06cc1ef5b778c20565945f313a9a2c26Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_Colon); 1559218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 156001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 156101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 156201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Fall through 156301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1564f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Template: 1565f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_MemberTemplate: 15664e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (SemaRef.getLangOpts().CPlusPlus && Results.includeCodePatterns()) { 156701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // template < parameters > 1568218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("template"); 1569218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftAngle); 1570218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("parameters"); 1571218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightAngle); 1572218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 157301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 157401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 15754e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie AddStorageSpecifiers(CCC, SemaRef.getLangOpts(), Results); 15764e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie AddFunctionSpecifiers(CCC, SemaRef.getLangOpts(), Results); 157701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 157801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1579f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ObjCInterface: 15804e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie AddObjCInterfaceResults(SemaRef.getLangOpts(), Results, true); 15814e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie AddStorageSpecifiers(CCC, SemaRef.getLangOpts(), Results); 15824e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie AddFunctionSpecifiers(CCC, SemaRef.getLangOpts(), Results); 1583b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor break; 1584b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 1585f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ObjCImplementation: 15864e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie AddObjCImplementationResults(SemaRef.getLangOpts(), Results, true); 15874e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie AddStorageSpecifiers(CCC, SemaRef.getLangOpts(), Results); 15884e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie AddFunctionSpecifiers(CCC, SemaRef.getLangOpts(), Results); 1589b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor break; 1590b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 1591f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ObjCInstanceVariableList: 15924e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie AddObjCVisibilityResults(SemaRef.getLangOpts(), Results, true); 1593c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor break; 1594c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor 1595f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_RecoveryInFunction: 1596f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Statement: { 1597c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor AddTypedefResult(Results); 159801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 15994e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (SemaRef.getLangOpts().CPlusPlus && Results.includeCodePatterns() && 16004e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie SemaRef.getLangOpts().CXXExceptions) { 1601218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("try"); 1602218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 1603218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("statements"); 1604218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 1605218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 1606218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("catch"); 1607218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1608218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("declaration"); 1609218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1610218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 1611218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("statements"); 1612218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 1613218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 1614218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 161501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 16164e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (SemaRef.getLangOpts().ObjC1) 1617bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCStatementResults(Results, true); 1618b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 1619d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor if (Results.includeCodePatterns()) { 1620d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor // if (condition) { statements } 1621218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("if"); 1622218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 16234e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (SemaRef.getLangOpts().CPlusPlus) 1624218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("condition"); 1625d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor else 1626218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1627218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1628218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 1629218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("statements"); 1630218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 1631218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 1632218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 163301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1634d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor // switch (condition) { } 1635218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("switch"); 1636218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 16374e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (SemaRef.getLangOpts().CPlusPlus) 1638218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("condition"); 1639d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor else 1640218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1641218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1642218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 1643218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 1644218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 1645218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1646d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor } 1647d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor 164801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Switch-specific statements. 1649781472fe99a120098c631b0cbe33c89f8cef5e70John McCall if (!SemaRef.getCurFunction()->SwitchStack.empty()) { 165001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // case expression: 1651218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("case"); 1652218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1653218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1654218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_Colon); 1655218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 165601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 165701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // default: 1658218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("default"); 1659218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_Colon); 1660218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 166101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 166201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1663d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor if (Results.includeCodePatterns()) { 1664d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor /// while (condition) { statements } 1665218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("while"); 1666218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 16674e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (SemaRef.getLangOpts().CPlusPlus) 1668218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("condition"); 1669d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor else 1670218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1671218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1672218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 1673218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("statements"); 1674218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 1675218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 1676218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 167701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1678d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor // do { statements } while ( expression ); 1679218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("do"); 1680218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 1681218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("statements"); 1682218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 1683218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 1684218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("while"); 1685218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1686218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1687218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1688218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 168901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1690d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor // for ( for-init-statement ; condition ; expression ) { statements } 1691218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("for"); 1692218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 16934e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (SemaRef.getLangOpts().CPlusPlus || SemaRef.getLangOpts().C99) 1694218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("init-statement"); 1695d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor else 1696218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("init-expression"); 1697218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_SemiColon); 1698218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("condition"); 1699218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_SemiColon); 1700218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("inc-expression"); 1701218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1702218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 1703218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 1704218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("statements"); 1705218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 1706218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 1707218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1708d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor } 170901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 171001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (S->getContinueParent()) { 171101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // continue ; 1712218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("continue"); 1713218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 171401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 171501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 171601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (S->getBreakParent()) { 171701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // break ; 1718218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("break"); 1719218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 172001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 172101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 172201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // "return expression ;" or "return ;", depending on whether we 172301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // know the function is void or not. 172401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor bool isVoid = false; 172501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (FunctionDecl *Function = dyn_cast<FunctionDecl>(SemaRef.CurContext)) 172601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor isVoid = Function->getResultType()->isVoidType(); 172701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor else if (ObjCMethodDecl *Method 172801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor = dyn_cast<ObjCMethodDecl>(SemaRef.CurContext)) 172901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor isVoid = Method->getResultType()->isVoidType(); 17309ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor else if (SemaRef.getCurBlock() && 17319ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor !SemaRef.getCurBlock()->ReturnType.isNull()) 17329ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor isVoid = SemaRef.getCurBlock()->ReturnType->isVoidType(); 1733218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("return"); 17349329800d6f4c4ea8778aabd64cde1b712b290b00Douglas Gregor if (!isVoid) { 1735218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1736218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 17379329800d6f4c4ea8778aabd64cde1b712b290b00Douglas Gregor } 1738218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 173901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1740c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // goto identifier ; 1741218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("goto"); 1742218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1743218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("label"); 1744218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 174501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1746c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // Using directives 1747218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("using"); 1748218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1749218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("namespace"); 1750218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1751218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("identifier"); 1752218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 175301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 175401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 175501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Fall through (for statement expressions). 1756f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ForInit: 1757f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Condition: 17584e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie AddStorageSpecifiers(CCC, SemaRef.getLangOpts(), Results); 175901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Fall through: conditions and statements can have expressions. 176001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 17610268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor case Sema::PCC_ParenthesizedExpression: 17624e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (SemaRef.getLangOpts().ObjCAutoRefCount && 1763f85e193739c953358c865005855253af4f68a497John McCall CCC == Sema::PCC_ParenthesizedExpression) { 1764f85e193739c953358c865005855253af4f68a497John McCall // (__bridge <type>)<expression> 1765f85e193739c953358c865005855253af4f68a497John McCall Builder.AddTypedTextChunk("__bridge"); 1766f85e193739c953358c865005855253af4f68a497John McCall Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1767f85e193739c953358c865005855253af4f68a497John McCall Builder.AddPlaceholderChunk("type"); 1768f85e193739c953358c865005855253af4f68a497John McCall Builder.AddChunk(CodeCompletionString::CK_RightParen); 1769f85e193739c953358c865005855253af4f68a497John McCall Builder.AddPlaceholderChunk("expression"); 1770f85e193739c953358c865005855253af4f68a497John McCall Results.AddResult(Result(Builder.TakeString())); 1771f85e193739c953358c865005855253af4f68a497John McCall 1772f85e193739c953358c865005855253af4f68a497John McCall // (__bridge_transfer <Objective-C type>)<expression> 1773f85e193739c953358c865005855253af4f68a497John McCall Builder.AddTypedTextChunk("__bridge_transfer"); 1774f85e193739c953358c865005855253af4f68a497John McCall Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1775f85e193739c953358c865005855253af4f68a497John McCall Builder.AddPlaceholderChunk("Objective-C type"); 1776f85e193739c953358c865005855253af4f68a497John McCall Builder.AddChunk(CodeCompletionString::CK_RightParen); 1777f85e193739c953358c865005855253af4f68a497John McCall Builder.AddPlaceholderChunk("expression"); 1778f85e193739c953358c865005855253af4f68a497John McCall Results.AddResult(Result(Builder.TakeString())); 1779f85e193739c953358c865005855253af4f68a497John McCall 1780f85e193739c953358c865005855253af4f68a497John McCall // (__bridge_retained <CF type>)<expression> 1781f85e193739c953358c865005855253af4f68a497John McCall Builder.AddTypedTextChunk("__bridge_retained"); 1782f85e193739c953358c865005855253af4f68a497John McCall Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1783f85e193739c953358c865005855253af4f68a497John McCall Builder.AddPlaceholderChunk("CF type"); 1784f85e193739c953358c865005855253af4f68a497John McCall Builder.AddChunk(CodeCompletionString::CK_RightParen); 1785f85e193739c953358c865005855253af4f68a497John McCall Builder.AddPlaceholderChunk("expression"); 1786f85e193739c953358c865005855253af4f68a497John McCall Results.AddResult(Result(Builder.TakeString())); 1787f85e193739c953358c865005855253af4f68a497John McCall } 1788f85e193739c953358c865005855253af4f68a497John McCall // Fall through 1789f85e193739c953358c865005855253af4f68a497John McCall 1790f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Expression: { 17914e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (SemaRef.getLangOpts().CPlusPlus) { 179201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // 'this', if we're in a non-static member function. 179381f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor addThisCompletion(SemaRef, Results); 17948ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor 17958ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor // true 17968ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("bool"); 17978ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddTypedTextChunk("true"); 17988ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 179901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 18008ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor // false 18018ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("bool"); 18028ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddTypedTextChunk("false"); 18038ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 180401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 18054e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (SemaRef.getLangOpts().RTTI) { 1806ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor // dynamic_cast < type-id > ( expression ) 1807ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddTypedTextChunk("dynamic_cast"); 1808ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftAngle); 1809ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddPlaceholderChunk("type"); 1810ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightAngle); 1811ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1812ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1813ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1814ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1815ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor } 1816c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor 1817c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // static_cast < type-id > ( expression ) 1818218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("static_cast"); 1819218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftAngle); 1820218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("type"); 1821218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightAngle); 1822218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1823218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1824218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1825218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1826d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor 1827c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // reinterpret_cast < type-id > ( expression ) 1828218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("reinterpret_cast"); 1829218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftAngle); 1830218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("type"); 1831218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightAngle); 1832218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1833218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1834218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1835218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1836d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor 1837c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // const_cast < type-id > ( expression ) 1838218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("const_cast"); 1839218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftAngle); 1840218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("type"); 1841218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightAngle); 1842218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1843218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1844218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1845218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1846d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor 18474e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (SemaRef.getLangOpts().RTTI) { 1848ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor // typeid ( expression-or-type ) 18498ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("std::type_info"); 1850ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddTypedTextChunk("typeid"); 1851ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1852ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddPlaceholderChunk("expression-or-type"); 1853ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1854ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1855ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor } 1856ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor 1857c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // new T ( ... ) 1858218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("new"); 1859218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1860218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("type"); 1861218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1862218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expressions"); 1863218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1864218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 186501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1866c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // new T [ ] ( ... ) 1867218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("new"); 1868218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1869218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("type"); 1870218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBracket); 1871218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("size"); 1872218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBracket); 1873218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1874218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expressions"); 1875218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1876218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 187701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1878c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // delete expression 18798ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("void"); 1880218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("delete"); 1881218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1882218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1883218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 188401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1885c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // delete [] expression 18868ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("void"); 1887218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("delete"); 1888218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1889218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBracket); 1890218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBracket); 1891218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1892218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1893218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1894c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor 18954e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (SemaRef.getLangOpts().CXXExceptions) { 1896ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor // throw expression 18978ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("void"); 1898ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddTypedTextChunk("throw"); 1899ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1900ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1901ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1902ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor } 1903a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor 190412e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor // FIXME: Rethrow? 1905a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor 19064e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (SemaRef.getLangOpts().CPlusPlus0x) { 1907a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor // nullptr 19088ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("std::nullptr_t"); 1909a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddTypedTextChunk("nullptr"); 1910a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1911a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor 1912a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor // alignof 19138ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("size_t"); 1914a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddTypedTextChunk("alignof"); 1915a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1916a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddPlaceholderChunk("type"); 1917a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1918a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1919a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor 1920a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor // noexcept 19218ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("bool"); 1922a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddTypedTextChunk("noexcept"); 1923a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1924a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1925a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1926a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1927a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor 1928a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor // sizeof... expression 19298ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("size_t"); 1930a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddTypedTextChunk("sizeof..."); 1931a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1932a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddPlaceholderChunk("parameter-pack"); 1933a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1934a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1935a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor } 193601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 193701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 19384e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (SemaRef.getLangOpts().ObjC1) { 193901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Add "super", if we're in an Objective-C class with a superclass. 1940681e256048cf9d3d226b9d0699f3df22c2500ef4Ted Kremenek if (ObjCMethodDecl *Method = SemaRef.getCurMethodDecl()) { 1941681e256048cf9d3d226b9d0699f3df22c2500ef4Ted Kremenek // The interface can be NULL. 1942681e256048cf9d3d226b9d0699f3df22c2500ef4Ted Kremenek if (ObjCInterfaceDecl *ID = Method->getClassInterface()) 19438ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor if (ID->getSuperClass()) { 19448ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor std::string SuperType; 19458ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor SuperType = ID->getSuperClass()->getNameAsString(); 19468ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor if (Method->isInstanceMethod()) 19478ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor SuperType += " *"; 19488ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor 19498ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk(Allocator.CopyString(SuperType)); 19508ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddTypedTextChunk("super"); 19518ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 19528ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor } 1953681e256048cf9d3d226b9d0699f3df22c2500ef4Ted Kremenek } 1954681e256048cf9d3d226b9d0699f3df22c2500ef4Ted Kremenek 1955bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCExpressionResults(Results, true); 195601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 195701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1958f70a88612a4bc2de2872a518267b9b4891ab6431Jordan Rose if (SemaRef.getLangOpts().C11) { 1959f70a88612a4bc2de2872a518267b9b4891ab6431Jordan Rose // _Alignof 1960f70a88612a4bc2de2872a518267b9b4891ab6431Jordan Rose Builder.AddResultTypeChunk("size_t"); 1961f70a88612a4bc2de2872a518267b9b4891ab6431Jordan Rose if (SemaRef.getASTContext().Idents.get("alignof").hasMacroDefinition()) 1962f70a88612a4bc2de2872a518267b9b4891ab6431Jordan Rose Builder.AddTypedTextChunk("alignof"); 1963f70a88612a4bc2de2872a518267b9b4891ab6431Jordan Rose else 1964f70a88612a4bc2de2872a518267b9b4891ab6431Jordan Rose Builder.AddTypedTextChunk("_Alignof"); 1965f70a88612a4bc2de2872a518267b9b4891ab6431Jordan Rose Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1966f70a88612a4bc2de2872a518267b9b4891ab6431Jordan Rose Builder.AddPlaceholderChunk("type"); 1967f70a88612a4bc2de2872a518267b9b4891ab6431Jordan Rose Builder.AddChunk(CodeCompletionString::CK_RightParen); 1968f70a88612a4bc2de2872a518267b9b4891ab6431Jordan Rose Results.AddResult(Result(Builder.TakeString())); 1969f70a88612a4bc2de2872a518267b9b4891ab6431Jordan Rose } 1970f70a88612a4bc2de2872a518267b9b4891ab6431Jordan Rose 1971c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // sizeof expression 19728ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("size_t"); 1973218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("sizeof"); 1974218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1975218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression-or-type"); 1976218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1977218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 197801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 197986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 1980d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor 1981f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Type: 198268e3c2eef52701a178fbcc2bb424f31dd4b36931Douglas Gregor case Sema::PCC_LocalDeclarationSpecifiers: 1983d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor break; 198401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 198501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 19864e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (WantTypesInContext(CCC, SemaRef.getLangOpts())) 19874e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie AddTypeSpecifierResults(SemaRef.getLangOpts(), Results); 198801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 19894e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (SemaRef.getLangOpts().CPlusPlus && CCC != Sema::PCC_Type) 1990a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("operator")); 199186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 199286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 1993ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor/// \brief If the given declaration has an associated type, add it as a result 1994ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor/// type chunk. 1995ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregorstatic void AddResultTypeChunk(ASTContext &Context, 19968987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor const PrintingPolicy &Policy, 1997ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor NamedDecl *ND, 1998218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder &Result) { 1999ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor if (!ND) 2000ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor return; 20016f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 20026f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor // Skip constructors and conversion functions, which have their return types 20036f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor // built into their names. 20046f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor if (isa<CXXConstructorDecl>(ND) || isa<CXXConversionDecl>(ND)) 20056f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor return; 20066f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 2007ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor // Determine the type of the declaration (if it has a type). 20086f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor QualType T; 2009ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor if (FunctionDecl *Function = dyn_cast<FunctionDecl>(ND)) 2010ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor T = Function->getResultType(); 2011ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor else if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(ND)) 2012ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor T = Method->getResultType(); 2013ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor else if (FunctionTemplateDecl *FunTmpl = dyn_cast<FunctionTemplateDecl>(ND)) 2014ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor T = FunTmpl->getTemplatedDecl()->getResultType(); 2015ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor else if (EnumConstantDecl *Enumerator = dyn_cast<EnumConstantDecl>(ND)) 2016ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor T = Context.getTypeDeclType(cast<TypeDecl>(Enumerator->getDeclContext())); 2017ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor else if (isa<UnresolvedUsingValueDecl>(ND)) { 2018ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor /* Do nothing: ignore unresolved using declarations*/ 2019f85e193739c953358c865005855253af4f68a497John McCall } else if (ValueDecl *Value = dyn_cast<ValueDecl>(ND)) { 2020ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor T = Value->getType(); 2021f85e193739c953358c865005855253af4f68a497John McCall } else if (ObjCPropertyDecl *Property = dyn_cast<ObjCPropertyDecl>(ND)) 2022ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor T = Property->getType(); 2023ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor 2024ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor if (T.isNull() || Context.hasSameType(T, Context.DependentTy)) 2025ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor return; 2026ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor 20278987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor Result.AddResultTypeChunk(GetCompletionTypeString(T, Context, Policy, 2028a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor Result.getAllocator())); 2029ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor} 2030ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor 2031aaa107acc8f906203101af259e8d764b5027700aDouglas Gregorstatic void MaybeAddSentinel(ASTContext &Context, NamedDecl *FunctionOrMethod, 2032218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder &Result) { 2033aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor if (SentinelAttr *Sentinel = FunctionOrMethod->getAttr<SentinelAttr>()) 2034aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor if (Sentinel->getSentinel() == 0) { 20354e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (Context.getLangOpts().ObjC1 && 2036aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor Context.Idents.get("nil").hasMacroDefinition()) 2037218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddTextChunk(", nil"); 2038aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor else if (Context.Idents.get("NULL").hasMacroDefinition()) 2039218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddTextChunk(", NULL"); 2040aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor else 2041218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddTextChunk(", (void*)0"); 2042aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor } 2043aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor} 2044aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor 20456fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregorstatic std::string formatObjCParamQualifiers(unsigned ObjCQuals) { 20466fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor std::string Result; 20476fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor if (ObjCQuals & Decl::OBJC_TQ_In) 20486ef920976a86aa710ccfeeeb7e14e9b38aef5007Douglas Gregor Result += "in "; 20496fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor else if (ObjCQuals & Decl::OBJC_TQ_Inout) 20506ef920976a86aa710ccfeeeb7e14e9b38aef5007Douglas Gregor Result += "inout "; 20516fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor else if (ObjCQuals & Decl::OBJC_TQ_Out) 20526ef920976a86aa710ccfeeeb7e14e9b38aef5007Douglas Gregor Result += "out "; 20536fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor if (ObjCQuals & Decl::OBJC_TQ_Bycopy) 20546ef920976a86aa710ccfeeeb7e14e9b38aef5007Douglas Gregor Result += "bycopy "; 20556fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor else if (ObjCQuals & Decl::OBJC_TQ_Byref) 20566ef920976a86aa710ccfeeeb7e14e9b38aef5007Douglas Gregor Result += "byref "; 20576fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor if (ObjCQuals & Decl::OBJC_TQ_Oneway) 20586ef920976a86aa710ccfeeeb7e14e9b38aef5007Douglas Gregor Result += "oneway "; 20596fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor return Result; 20606fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor} 20616fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor 206283482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregorstatic std::string FormatFunctionParameter(ASTContext &Context, 20638987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor const PrintingPolicy &Policy, 2064aba480862485ea1140a81f25c23f43bb080edc90Douglas Gregor ParmVarDecl *Param, 2065ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor bool SuppressName = false, 2066ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor bool SuppressBlock = false) { 206783482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor bool ObjCMethodParam = isa<ObjCMethodDecl>(Param->getDeclContext()); 206883482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor if (Param->getType()->isDependentType() || 206983482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor !Param->getType()->isBlockPointerType()) { 207083482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor // The argument for a dependent or non-block parameter is a placeholder 207183482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor // containing that parameter's type. 207283482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor std::string Result; 207383482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor 2074aba480862485ea1140a81f25c23f43bb080edc90Douglas Gregor if (Param->getIdentifier() && !ObjCMethodParam && !SuppressName) 207583482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor Result = Param->getIdentifier()->getName(); 207683482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor 2077f85e193739c953358c865005855253af4f68a497John McCall Param->getType().getAsStringInternal(Result, Policy); 207883482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor 207983482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor if (ObjCMethodParam) { 20806fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor Result = "(" + formatObjCParamQualifiers(Param->getObjCDeclQualifier()) 20816fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor + Result + ")"; 2082aba480862485ea1140a81f25c23f43bb080edc90Douglas Gregor if (Param->getIdentifier() && !SuppressName) 208383482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor Result += Param->getIdentifier()->getName(); 208483482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor } 208583482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor return Result; 208683482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor } 208783482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor 208883482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor // The argument for a block pointer parameter is a block literal with 208983482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor // the appropriate type. 2090830072c2de881aadfe0f6efd3baccc9129a77e37Douglas Gregor FunctionTypeLoc *Block = 0; 2091830072c2de881aadfe0f6efd3baccc9129a77e37Douglas Gregor FunctionProtoTypeLoc *BlockProto = 0; 209283482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor TypeLoc TL; 209383482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor if (TypeSourceInfo *TSInfo = Param->getTypeSourceInfo()) { 209483482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor TL = TSInfo->getTypeLoc().getUnqualifiedLoc(); 209583482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor while (true) { 209683482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor // Look through typedefs. 2097ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor if (!SuppressBlock) { 2098ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor if (TypedefTypeLoc *TypedefTL = dyn_cast<TypedefTypeLoc>(&TL)) { 2099ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor if (TypeSourceInfo *InnerTSInfo 2100ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor = TypedefTL->getTypedefNameDecl()->getTypeSourceInfo()) { 2101ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor TL = InnerTSInfo->getTypeLoc().getUnqualifiedLoc(); 2102ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor continue; 2103ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor } 2104ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor } 2105ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor 2106ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor // Look through qualified types 2107ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor if (QualifiedTypeLoc *QualifiedTL = dyn_cast<QualifiedTypeLoc>(&TL)) { 2108ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor TL = QualifiedTL->getUnqualifiedLoc(); 210983482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor continue; 211083482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor } 211183482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor } 211283482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor 211383482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor // Try to get the function prototype behind the block pointer type, 211483482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor // then we're done. 211583482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor if (BlockPointerTypeLoc *BlockPtr 211683482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor = dyn_cast<BlockPointerTypeLoc>(&TL)) { 2117723df245307a530da5433dfb43accf187dc3e243Abramo Bagnara TL = BlockPtr->getPointeeLoc().IgnoreParens(); 2118830072c2de881aadfe0f6efd3baccc9129a77e37Douglas Gregor Block = dyn_cast<FunctionTypeLoc>(&TL); 2119830072c2de881aadfe0f6efd3baccc9129a77e37Douglas Gregor BlockProto = dyn_cast<FunctionProtoTypeLoc>(&TL); 212083482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor } 212183482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor break; 212283482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor } 212383482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor } 212483482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor 212583482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor if (!Block) { 212683482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor // We were unable to find a FunctionProtoTypeLoc with parameter names 212783482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor // for the block; just use the parameter type as a placeholder. 212883482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor std::string Result; 2129ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor if (!ObjCMethodParam && Param->getIdentifier()) 2130ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Result = Param->getIdentifier()->getName(); 2131ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor 2132f85e193739c953358c865005855253af4f68a497John McCall Param->getType().getUnqualifiedType().getAsStringInternal(Result, Policy); 213383482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor 213483482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor if (ObjCMethodParam) { 21356fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor Result = "(" + formatObjCParamQualifiers(Param->getObjCDeclQualifier()) 21366fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor + Result + ")"; 213783482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor if (Param->getIdentifier()) 213883482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor Result += Param->getIdentifier()->getName(); 213983482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor } 214083482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor 214183482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor return Result; 214283482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor } 2143ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor 214483482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor // We have the function prototype behind the block pointer type, as it was 214583482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor // written in the source. 2146382762582c8fcbc06b395a806fd57879381897a8Douglas Gregor std::string Result; 2147382762582c8fcbc06b395a806fd57879381897a8Douglas Gregor QualType ResultType = Block->getTypePtr()->getResultType(); 2148ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor if (!ResultType->isVoidType() || SuppressBlock) 2149f85e193739c953358c865005855253af4f68a497John McCall ResultType.getAsStringInternal(Result, Policy); 2150ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor 2151ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor // Format the parameter list. 2152ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor std::string Params; 2153830072c2de881aadfe0f6efd3baccc9129a77e37Douglas Gregor if (!BlockProto || Block->getNumArgs() == 0) { 2154830072c2de881aadfe0f6efd3baccc9129a77e37Douglas Gregor if (BlockProto && BlockProto->getTypePtr()->isVariadic()) 2155ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Params = "(...)"; 2156c2760bc8e99510c4b3848fcd21323afd711ee269Douglas Gregor else 2157ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Params = "(void)"; 2158382762582c8fcbc06b395a806fd57879381897a8Douglas Gregor } else { 2159ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Params += "("; 2160382762582c8fcbc06b395a806fd57879381897a8Douglas Gregor for (unsigned I = 0, N = Block->getNumArgs(); I != N; ++I) { 2161382762582c8fcbc06b395a806fd57879381897a8Douglas Gregor if (I) 2162ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Params += ", "; 2163ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Params += FormatFunctionParameter(Context, Policy, Block->getArg(I), 2164ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor /*SuppressName=*/false, 2165ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor /*SuppressBlock=*/true); 2166382762582c8fcbc06b395a806fd57879381897a8Douglas Gregor 2167830072c2de881aadfe0f6efd3baccc9129a77e37Douglas Gregor if (I == N - 1 && BlockProto->getTypePtr()->isVariadic()) 2168ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Params += ", ..."; 2169382762582c8fcbc06b395a806fd57879381897a8Douglas Gregor } 2170ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Params += ")"; 2171ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor } 2172ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor 2173ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor if (SuppressBlock) { 2174ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor // Format as a parameter. 2175ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Result = Result + " (^"; 2176ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor if (Param->getIdentifier()) 2177ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Result += Param->getIdentifier()->getName(); 2178382762582c8fcbc06b395a806fd57879381897a8Douglas Gregor Result += ")"; 2179ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Result += Params; 2180ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor } else { 2181ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor // Format as a block literal argument. 2182ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Result = '^' + Result; 2183ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Result += Params; 2184ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor 2185ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor if (Param->getIdentifier()) 2186ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Result += Param->getIdentifier()->getName(); 2187e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor } 2188382762582c8fcbc06b395a806fd57879381897a8Douglas Gregor 218983482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor return Result; 219083482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor} 219183482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor 219286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Add function parameter chunks to the given code completion string. 219386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorstatic void AddFunctionParameterChunks(ASTContext &Context, 21948987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor const PrintingPolicy &Policy, 219586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor FunctionDecl *Function, 2196218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder &Result, 2197218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor unsigned Start = 0, 2198218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor bool InOptional = false) { 2199218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor bool FirstParameter = true; 22000c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 2201218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor for (unsigned P = Start, N = Function->getNumParams(); P != N; ++P) { 220286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ParmVarDecl *Param = Function->getParamDecl(P); 220386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 2204218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor if (Param->hasDefaultArg() && !InOptional) { 220586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // When we see an optional default argument, put that argument and 220686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // the remaining default arguments into a new, optional string. 220728a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Opt(Result.getAllocator(), 220828a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis Result.getCodeCompletionTUInfo()); 2209218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor if (!FirstParameter) 22101eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Opt.AddChunk(CodeCompletionString::CK_Comma); 22118987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor AddFunctionParameterChunks(Context, Policy, Function, Opt, P, true); 2212218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddOptionalChunk(Opt.TakeString()); 2213218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor break; 221486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 221586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 2216218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor if (FirstParameter) 2217218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor FirstParameter = false; 2218218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor else 22191eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.AddChunk(CodeCompletionString::CK_Comma); 2220218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor 2221218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor InOptional = false; 222286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 222386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Format the placeholder string. 22248987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor std::string PlaceholderStr = FormatFunctionParameter(Context, Policy, 22258987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor Param); 222683482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor 2227e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor if (Function->isVariadic() && P == N - 1) 2228e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor PlaceholderStr += ", ..."; 2229e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor 223086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add the placeholder string. 2231dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddPlaceholderChunk( 2232dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.getAllocator().CopyString(PlaceholderStr)); 223386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 2234b3d4525c65cf456d3f1f4338afdcac83afc7be02Douglas Gregor 2235b3d4525c65cf456d3f1f4338afdcac83afc7be02Douglas Gregor if (const FunctionProtoType *Proto 2236b3d4525c65cf456d3f1f4338afdcac83afc7be02Douglas Gregor = Function->getType()->getAs<FunctionProtoType>()) 2237aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor if (Proto->isVariadic()) { 2238e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor if (Proto->getNumArgs() == 0) 2239218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddPlaceholderChunk("..."); 2240aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor 2241218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor MaybeAddSentinel(Context, Function, Result); 2242aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor } 224386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 224486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 224586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Add template parameter chunks to the given code completion string. 224686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorstatic void AddTemplateParameterChunks(ASTContext &Context, 22478987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor const PrintingPolicy &Policy, 224886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor TemplateDecl *Template, 2249218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder &Result, 2250218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor unsigned MaxParameters = 0, 2251218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor unsigned Start = 0, 2252218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor bool InDefaultArg = false) { 225386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool FirstParameter = true; 225486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 225586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor TemplateParameterList *Params = Template->getTemplateParameters(); 225686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor TemplateParameterList::iterator PEnd = Params->end(); 225786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (MaxParameters) 225886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PEnd = Params->begin() + MaxParameters; 2259218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor for (TemplateParameterList::iterator P = Params->begin() + Start; 2260218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor P != PEnd; ++P) { 226186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool HasDefaultArg = false; 226286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor std::string PlaceholderStr; 226386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(*P)) { 226486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (TTP->wasDeclaredWithTypename()) 226586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr = "typename"; 226686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor else 226786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr = "class"; 226886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 226986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (TTP->getIdentifier()) { 227086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr += ' '; 227186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr += TTP->getIdentifier()->getName(); 227286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 227386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 227486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor HasDefaultArg = TTP->hasDefaultArgument(); 227586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } else if (NonTypeTemplateParmDecl *NTTP 2276218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor = dyn_cast<NonTypeTemplateParmDecl>(*P)) { 227786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (NTTP->getIdentifier()) 227886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr = NTTP->getIdentifier()->getName(); 2279f85e193739c953358c865005855253af4f68a497John McCall NTTP->getType().getAsStringInternal(PlaceholderStr, Policy); 228086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor HasDefaultArg = NTTP->hasDefaultArgument(); 228186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } else { 228286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor assert(isa<TemplateTemplateParmDecl>(*P)); 228386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor TemplateTemplateParmDecl *TTP = cast<TemplateTemplateParmDecl>(*P); 228486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 228586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Since putting the template argument list into the placeholder would 228686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // be very, very long, we just use an abbreviation. 228786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr = "template<...> class"; 228886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (TTP->getIdentifier()) { 228986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr += ' '; 229086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr += TTP->getIdentifier()->getName(); 229186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 229286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 229386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor HasDefaultArg = TTP->hasDefaultArgument(); 229486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 229586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 2296218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor if (HasDefaultArg && !InDefaultArg) { 229786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // When we see an optional default argument, put that argument and 229886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // the remaining default arguments into a new, optional string. 229928a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Opt(Result.getAllocator(), 230028a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis Result.getCodeCompletionTUInfo()); 2301218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor if (!FirstParameter) 23021eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Opt.AddChunk(CodeCompletionString::CK_Comma); 23038987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor AddTemplateParameterChunks(Context, Policy, Template, Opt, MaxParameters, 2304218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor P - Params->begin(), true); 2305218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddOptionalChunk(Opt.TakeString()); 2306218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor break; 230786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 230886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 2309218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor InDefaultArg = false; 2310218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor 231186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (FirstParameter) 231286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor FirstParameter = false; 231386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor else 23141eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.AddChunk(CodeCompletionString::CK_Comma); 231586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 231686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add the placeholder string. 2317dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddPlaceholderChunk( 2318dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.getAllocator().CopyString(PlaceholderStr)); 231986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 232086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 232186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 2322b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor/// \brief Add a qualifier to the given code-completion string, if the 2323b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor/// provided nested-name-specifier is non-NULL. 2324a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregorstatic void 2325218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas GregorAddQualifierToCompletionString(CodeCompletionBuilder &Result, 2326a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor NestedNameSpecifier *Qualifier, 2327a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor bool QualifierIsInformative, 23288987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor ASTContext &Context, 23298987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor const PrintingPolicy &Policy) { 2330b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor if (!Qualifier) 2331b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor return; 2332b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor 2333b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor std::string PrintedNNS; 2334b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor { 2335b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor llvm::raw_string_ostream OS(PrintedNNS); 23368987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor Qualifier->print(OS, Policy); 2337b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor } 23380563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor if (QualifierIsInformative) 2339dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddInformativeChunk(Result.getAllocator().CopyString(PrintedNNS)); 23400563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor else 2341dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTextChunk(Result.getAllocator().CopyString(PrintedNNS)); 2342b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor} 2343b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor 2344218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregorstatic void 2345218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas GregorAddFunctionTypeQualsToCompletionString(CodeCompletionBuilder &Result, 2346218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor FunctionDecl *Function) { 2347a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor const FunctionProtoType *Proto 2348a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor = Function->getType()->getAs<FunctionProtoType>(); 2349a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor if (!Proto || !Proto->getTypeQuals()) 2350a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor return; 2351a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor 2352a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor // FIXME: Add ref-qualifier! 2353a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor 2354a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor // Handle single qualifiers without copying 2355a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor if (Proto->getTypeQuals() == Qualifiers::Const) { 2356a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor Result.AddInformativeChunk(" const"); 2357a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor return; 2358a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor } 2359a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor 2360a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor if (Proto->getTypeQuals() == Qualifiers::Volatile) { 2361a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor Result.AddInformativeChunk(" volatile"); 2362a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor return; 2363a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor } 2364a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor 2365a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor if (Proto->getTypeQuals() == Qualifiers::Restrict) { 2366a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor Result.AddInformativeChunk(" restrict"); 2367a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor return; 2368a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor } 2369a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor 2370a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor // Handle multiple qualifiers. 2371a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor std::string QualsStr; 2372a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor if (Proto->getTypeQuals() & Qualifiers::Const) 2373a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor QualsStr += " const"; 2374a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor if (Proto->getTypeQuals() & Qualifiers::Volatile) 2375a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor QualsStr += " volatile"; 2376a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor if (Proto->getTypeQuals() & Qualifiers::Restrict) 2377a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor QualsStr += " restrict"; 2378dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddInformativeChunk(Result.getAllocator().CopyString(QualsStr)); 2379a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor} 2380a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor 23816f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor/// \brief Add the name of the given declaration 23828987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregorstatic void AddTypedNameChunk(ASTContext &Context, const PrintingPolicy &Policy, 23838987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor NamedDecl *ND, CodeCompletionBuilder &Result) { 23846f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor DeclarationName Name = ND->getDeclName(); 23856f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor if (!Name) 23866f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor return; 23876f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 23886f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor switch (Name.getNameKind()) { 2389a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor case DeclarationName::CXXOperatorName: { 2390a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor const char *OperatorName = 0; 2391a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor switch (Name.getCXXOverloadedOperator()) { 2392a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor case OO_None: 2393a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor case OO_Conditional: 2394a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor case NUM_OVERLOADED_OPERATORS: 2395a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor OperatorName = "operator"; 2396a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor break; 2397a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor 2398a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 2399a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor case OO_##Name: OperatorName = "operator" Spelling; break; 2400a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor#define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly) 2401a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor#include "clang/Basic/OperatorKinds.def" 2402a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor 2403a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor case OO_New: OperatorName = "operator new"; break; 2404a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor case OO_Delete: OperatorName = "operator delete"; break; 2405a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor case OO_Array_New: OperatorName = "operator new[]"; break; 2406a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor case OO_Array_Delete: OperatorName = "operator delete[]"; break; 2407a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor case OO_Call: OperatorName = "operator()"; break; 2408a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor case OO_Subscript: OperatorName = "operator[]"; break; 2409a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor } 2410a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor Result.AddTypedTextChunk(OperatorName); 2411a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor break; 2412a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor } 2413a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor 24146f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case DeclarationName::Identifier: 24156f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case DeclarationName::CXXConversionFunctionName: 24166f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case DeclarationName::CXXDestructorName: 24176f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case DeclarationName::CXXLiteralOperatorName: 2418dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTypedTextChunk( 2419dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.getAllocator().CopyString(ND->getNameAsString())); 24206f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor break; 24216f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 24226f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case DeclarationName::CXXUsingDirective: 24236f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case DeclarationName::ObjCZeroArgSelector: 24246f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case DeclarationName::ObjCOneArgSelector: 24256f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case DeclarationName::ObjCMultiArgSelector: 24266f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor break; 24276f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 24286f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case DeclarationName::CXXConstructorName: { 24296f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor CXXRecordDecl *Record = 0; 24306f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor QualType Ty = Name.getCXXNameType(); 24316f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor if (const RecordType *RecordTy = Ty->getAs<RecordType>()) 24326f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor Record = cast<CXXRecordDecl>(RecordTy->getDecl()); 24336f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor else if (const InjectedClassNameType *InjectedTy 24346f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor = Ty->getAs<InjectedClassNameType>()) 24356f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor Record = InjectedTy->getDecl(); 24366f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor else { 2437dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTypedTextChunk( 2438dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.getAllocator().CopyString(ND->getNameAsString())); 24396f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor break; 24406f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor } 24416f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 2442dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTypedTextChunk( 2443dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.getAllocator().CopyString(Record->getNameAsString())); 24446f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor if (ClassTemplateDecl *Template = Record->getDescribedClassTemplate()) { 24451eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.AddChunk(CodeCompletionString::CK_LeftAngle); 24468987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor AddTemplateParameterChunks(Context, Policy, Template, Result); 24471eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.AddChunk(CodeCompletionString::CK_RightAngle); 24486f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor } 24496f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor break; 24506f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor } 24516f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor } 24526f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor} 24536f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 2454ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios KyrtzidisCodeCompletionString *CodeCompletionResult::CreateCodeCompletionString(Sema &S, 245528a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionAllocator &Allocator, 2456d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko CodeCompletionTUInfo &CCTUInfo, 2457d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko bool IncludeBriefComments) { 2458d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko return CreateCodeCompletionString(S.Context, S.PP, Allocator, CCTUInfo, 2459d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko IncludeBriefComments); 2460ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis} 2461ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis 246286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief If possible, create a new code completion string for the given 246386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// result. 246486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// 246586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \returns Either a new, heap-allocated code completion string describing 246686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// how to use this result, or NULL to indicate that the string or name of the 246786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// result is all that is needed. 246886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas GregorCodeCompletionString * 2469ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios KyrtzidisCodeCompletionResult::CreateCodeCompletionString(ASTContext &Ctx, 2470ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis Preprocessor &PP, 247128a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionAllocator &Allocator, 2472d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko CodeCompletionTUInfo &CCTUInfo, 2473d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko bool IncludeBriefComments) { 247428a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Result(Allocator, CCTUInfo, Priority, Availability); 24750c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 2476ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis PrintingPolicy Policy = getCompletionPrintingPolicy(Ctx, PP); 2477218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor if (Kind == RK_Pattern) { 2478218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Pattern->Priority = Priority; 2479218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Pattern->Availability = Availability; 2480ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor 2481ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor if (Declaration) { 2482ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor Result.addParentContext(Declaration->getDeclContext()); 2483ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor Pattern->ParentKind = Result.getParentKind(); 2484ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor Pattern->ParentName = Result.getParentName(); 2485ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor } 2486ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor 2487218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Pattern; 2488218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor } 24892b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 24902b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor if (Kind == RK_Keyword) { 2491218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddTypedTextChunk(Keyword); 2492218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Result.TakeString(); 24932b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor } 249486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 24953f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor if (Kind == RK_Macro) { 2496ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis MacroInfo *MI = PP.getMacroInfo(Macro); 24972b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor assert(MI && "Not a macro?"); 24982b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 2499dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTypedTextChunk( 2500dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.getAllocator().CopyString(Macro->getName())); 25012b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 25022b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor if (!MI->isFunctionLike()) 2503218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Result.TakeString(); 25043f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor 25053f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor // Format a function-like macro with placeholders for the arguments. 25061eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.AddChunk(CodeCompletionString::CK_LeftParen); 2507e42447021239015db97202fb04c304d82e84135fDouglas Gregor MacroInfo::arg_iterator A = MI->arg_begin(), AEnd = MI->arg_end(); 2508c8dc1352071575c36401158094a865ad682fb886Douglas Gregor 2509c8dc1352071575c36401158094a865ad682fb886Douglas Gregor // C99 variadic macros add __VA_ARGS__ at the end. Skip it. 2510c8dc1352071575c36401158094a865ad682fb886Douglas Gregor if (MI->isC99Varargs()) { 2511c8dc1352071575c36401158094a865ad682fb886Douglas Gregor --AEnd; 2512c8dc1352071575c36401158094a865ad682fb886Douglas Gregor 2513c8dc1352071575c36401158094a865ad682fb886Douglas Gregor if (A == AEnd) { 2514c8dc1352071575c36401158094a865ad682fb886Douglas Gregor Result.AddPlaceholderChunk("..."); 2515c8dc1352071575c36401158094a865ad682fb886Douglas Gregor } 2516e42447021239015db97202fb04c304d82e84135fDouglas Gregor } 2517c8dc1352071575c36401158094a865ad682fb886Douglas Gregor 2518e42447021239015db97202fb04c304d82e84135fDouglas Gregor for (MacroInfo::arg_iterator A = MI->arg_begin(); A != AEnd; ++A) { 25193f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor if (A != MI->arg_begin()) 25201eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.AddChunk(CodeCompletionString::CK_Comma); 2521c8dc1352071575c36401158094a865ad682fb886Douglas Gregor 2522c8dc1352071575c36401158094a865ad682fb886Douglas Gregor if (MI->isVariadic() && (A+1) == AEnd) { 2523f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith SmallString<32> Arg = (*A)->getName(); 2524c8dc1352071575c36401158094a865ad682fb886Douglas Gregor if (MI->isC99Varargs()) 2525c8dc1352071575c36401158094a865ad682fb886Douglas Gregor Arg += ", ..."; 2526c8dc1352071575c36401158094a865ad682fb886Douglas Gregor else 2527c8dc1352071575c36401158094a865ad682fb886Douglas Gregor Arg += "..."; 2528dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddPlaceholderChunk(Result.getAllocator().CopyString(Arg)); 2529c8dc1352071575c36401158094a865ad682fb886Douglas Gregor break; 25303f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor } 2531c8dc1352071575c36401158094a865ad682fb886Douglas Gregor 2532c8dc1352071575c36401158094a865ad682fb886Douglas Gregor // Non-variadic macros are simple. 2533c8dc1352071575c36401158094a865ad682fb886Douglas Gregor Result.AddPlaceholderChunk( 2534c8dc1352071575c36401158094a865ad682fb886Douglas Gregor Result.getAllocator().CopyString((*A)->getName())); 2535e42447021239015db97202fb04c304d82e84135fDouglas Gregor } 25361eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.AddChunk(CodeCompletionString::CK_RightParen); 2537218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Result.TakeString(); 25383f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor } 25393f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor 2540d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor assert(Kind == RK_Declaration && "Missed a result kind?"); 254186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NamedDecl *ND = Declaration; 2542ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor Result.addParentContext(ND->getDeclContext()); 2543d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko 2544d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko if (IncludeBriefComments) { 2545d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko // Add documentation comment, if it exists. 2546d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko if (const RawComment *RC = Ctx.getRawCommentForDecl(ND)) { 2547d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko Result.addBriefComment(RC->getBriefText(Ctx)); 2548d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko } 2549d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko } 2550d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko 25510c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor if (StartsNestedNameSpecifier) { 2552dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTypedTextChunk( 2553dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.getAllocator().CopyString(ND->getNameAsString())); 2554218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddTextChunk("::"); 2555218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Result.TakeString(); 25560c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor } 25576164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen 25586164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen for (Decl::attr_iterator i = ND->attr_begin(); i != ND->attr_end(); ++i) { 25596164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen if (AnnotateAttr *Attr = dyn_cast_or_null<AnnotateAttr>(*i)) { 25606164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen Result.AddAnnotation(Result.getAllocator().CopyString(Attr->getAnnotation())); 25616164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen } 25626164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen } 25630c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 2564ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis AddResultTypeChunk(Ctx, Policy, ND, Result); 2565ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor 256686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (FunctionDecl *Function = dyn_cast<FunctionDecl>(ND)) { 25670563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative, 2568ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis Ctx, Policy); 2569ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis AddTypedNameChunk(Ctx, Policy, ND, Result); 25701eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.AddChunk(CodeCompletionString::CK_LeftParen); 2571ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis AddFunctionParameterChunks(Ctx, Policy, Function, Result); 25721eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.AddChunk(CodeCompletionString::CK_RightParen); 2573a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor AddFunctionTypeQualsToCompletionString(Result, Function); 2574218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Result.TakeString(); 257586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 257686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 257786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (FunctionTemplateDecl *FunTmpl = dyn_cast<FunctionTemplateDecl>(ND)) { 25780563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative, 2579ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis Ctx, Policy); 258086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor FunctionDecl *Function = FunTmpl->getTemplatedDecl(); 2581ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis AddTypedNameChunk(Ctx, Policy, Function, Result); 25826f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 258386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Figure out which template parameters are deduced (or have default 258486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // arguments). 2585013b3668b67c8cb3ad2ee516c5607a3eba11829fBenjamin Kramer llvm::SmallBitVector Deduced; 2586ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis Sema::MarkDeducedTemplateParameters(Ctx, FunTmpl, Deduced); 258786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor unsigned LastDeducibleArgument; 258886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor for (LastDeducibleArgument = Deduced.size(); LastDeducibleArgument > 0; 258986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor --LastDeducibleArgument) { 259086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!Deduced[LastDeducibleArgument - 1]) { 259186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // C++0x: Figure out if the template argument has a default. If so, 259286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // the user doesn't need to type this argument. 259386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // FIXME: We need to abstract template parameters better! 259486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool HasDefaultArg = false; 259586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NamedDecl *Param = FunTmpl->getTemplateParameters()->getParam( 2596218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor LastDeducibleArgument - 1); 259786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(Param)) 259886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor HasDefaultArg = TTP->hasDefaultArgument(); 259986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor else if (NonTypeTemplateParmDecl *NTTP 260086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor = dyn_cast<NonTypeTemplateParmDecl>(Param)) 260186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor HasDefaultArg = NTTP->hasDefaultArgument(); 260286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor else { 260386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor assert(isa<TemplateTemplateParmDecl>(Param)); 260486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor HasDefaultArg 26050c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor = cast<TemplateTemplateParmDecl>(Param)->hasDefaultArgument(); 260686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 260786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 260886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!HasDefaultArg) 260986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor break; 261086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 261186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 261286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 261386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (LastDeducibleArgument) { 261486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Some of the function template arguments cannot be deduced from a 261586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // function call, so we introduce an explicit template argument list 261686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // containing all of the arguments up to the first deducible argument. 26171eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.AddChunk(CodeCompletionString::CK_LeftAngle); 2618ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis AddTemplateParameterChunks(Ctx, Policy, FunTmpl, Result, 261986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor LastDeducibleArgument); 26201eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.AddChunk(CodeCompletionString::CK_RightAngle); 262186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 262286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 262386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add the function parameters 26241eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.AddChunk(CodeCompletionString::CK_LeftParen); 2625ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis AddFunctionParameterChunks(Ctx, Policy, Function, Result); 26261eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.AddChunk(CodeCompletionString::CK_RightParen); 2627a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor AddFunctionTypeQualsToCompletionString(Result, Function); 2628218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Result.TakeString(); 262986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 263086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 263186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (TemplateDecl *Template = dyn_cast<TemplateDecl>(ND)) { 26320563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative, 2633ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis Ctx, Policy); 2634dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTypedTextChunk( 2635dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.getAllocator().CopyString(Template->getNameAsString())); 26361eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.AddChunk(CodeCompletionString::CK_LeftAngle); 2637ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis AddTemplateParameterChunks(Ctx, Policy, Template, Result); 26381eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.AddChunk(CodeCompletionString::CK_RightAngle); 2639218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Result.TakeString(); 264086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 264186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 26429630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(ND)) { 26439630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor Selector Sel = Method->getSelector(); 26449630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor if (Sel.isUnarySelector()) { 2645dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTypedTextChunk(Result.getAllocator().CopyString( 2646813d8346529bf094eb2b249648906ba7fd226688Douglas Gregor Sel.getNameForSlot(0))); 2647218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Result.TakeString(); 26489630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor } 26499630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor 2650813d8346529bf094eb2b249648906ba7fd226688Douglas Gregor std::string SelName = Sel.getNameForSlot(0).str(); 2651d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor SelName += ':'; 2652d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor if (StartParameter == 0) 2653dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTypedTextChunk(Result.getAllocator().CopyString(SelName)); 2654d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor else { 2655dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddInformativeChunk(Result.getAllocator().CopyString(SelName)); 2656d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor 2657d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor // If there is only one parameter, and we're past it, add an empty 2658d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor // typed-text chunk since there is nothing to type. 2659d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor if (Method->param_size() == 1) 2660218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddTypedTextChunk(""); 2661d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor } 26629630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor unsigned Idx = 0; 26639630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor for (ObjCMethodDecl::param_iterator P = Method->param_begin(), 26649630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor PEnd = Method->param_end(); 26659630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor P != PEnd; (void)++P, ++Idx) { 26669630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor if (Idx > 0) { 2667d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor std::string Keyword; 2668d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor if (Idx > StartParameter) 2669218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(CodeCompletionString::CK_HorizontalSpace); 26709630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor if (IdentifierInfo *II = Sel.getIdentifierInfoForSlot(Idx)) 2671a0651c5f5d1c8928d3ae062435ed9cf0aa0d04baBenjamin Kramer Keyword += II->getName(); 26729630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor Keyword += ":"; 26731f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor if (Idx < StartParameter || AllParametersAreInformative) 2674dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddInformativeChunk(Result.getAllocator().CopyString(Keyword)); 2675c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor else 2676dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTypedTextChunk(Result.getAllocator().CopyString(Keyword)); 26779630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor } 2678d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor 2679d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor // If we're before the starting parameter, skip the placeholder. 2680d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor if (Idx < StartParameter) 2681d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor continue; 26829630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor 26839630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor std::string Arg; 268483482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor 268583482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor if ((*P)->getType()->isBlockPointerType() && !DeclaringEntity) 2686ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis Arg = FormatFunctionParameter(Ctx, Policy, *P, true); 268783482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor else { 2688f85e193739c953358c865005855253af4f68a497John McCall (*P)->getType().getAsStringInternal(Arg, Policy); 26896fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor Arg = "(" + formatObjCParamQualifiers((*P)->getObjCDeclQualifier()) 26906fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor + Arg + ")"; 269183482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor if (IdentifierInfo *II = (*P)->getIdentifier()) 2692aba480862485ea1140a81f25c23f43bb080edc90Douglas Gregor if (DeclaringEntity || AllParametersAreInformative) 2693a0651c5f5d1c8928d3ae062435ed9cf0aa0d04baBenjamin Kramer Arg += II->getName(); 269483482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor } 269583482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor 2696e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor if (Method->isVariadic() && (P + 1) == PEnd) 2697e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor Arg += ", ..."; 2698e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor 26991f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor if (DeclaringEntity) 2700dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTextChunk(Result.getAllocator().CopyString(Arg)); 27011f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor else if (AllParametersAreInformative) 2702dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddInformativeChunk(Result.getAllocator().CopyString(Arg)); 27034ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor else 2704dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddPlaceholderChunk(Result.getAllocator().CopyString(Arg)); 27059630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor } 27069630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor 27072a17af0c7e05500e25d4cc71341f1f232085ebeaDouglas Gregor if (Method->isVariadic()) { 2708e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor if (Method->param_size() == 0) { 2709e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor if (DeclaringEntity) 2710218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddTextChunk(", ..."); 2711e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor else if (AllParametersAreInformative) 2712218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddInformativeChunk(", ..."); 2713e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor else 2714218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddPlaceholderChunk(", ..."); 2715e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor } 2716aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor 2717ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis MaybeAddSentinel(Ctx, Method, Result); 27182a17af0c7e05500e25d4cc71341f1f232085ebeaDouglas Gregor } 27192a17af0c7e05500e25d4cc71341f1f232085ebeaDouglas Gregor 2720218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Result.TakeString(); 27219630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor } 27229630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor 27232b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor if (Qualifier) 27240563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative, 2725ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis Ctx, Policy); 27262b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 2727dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTypedTextChunk( 2728dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.getAllocator().CopyString(ND->getNameAsString())); 2729218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Result.TakeString(); 273086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 273186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 273286d802e03a267af79663990c39865c67e0645238Douglas GregorCodeCompletionString * 273386d802e03a267af79663990c39865c67e0645238Douglas GregorCodeCompleteConsumer::OverloadCandidate::CreateSignatureString( 273486d802e03a267af79663990c39865c67e0645238Douglas Gregor unsigned CurrentArg, 273532be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor Sema &S, 273628a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionAllocator &Allocator, 273728a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionTUInfo &CCTUInfo) const { 27388987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor PrintingPolicy Policy = getCompletionPrintingPolicy(S); 2739f85e193739c953358c865005855253af4f68a497John McCall 2740218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor // FIXME: Set priority, availability appropriately. 274128a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Result(Allocator,CCTUInfo, 1, CXAvailability_Available); 274286d802e03a267af79663990c39865c67e0645238Douglas Gregor FunctionDecl *FDecl = getFunction(); 27438987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor AddResultTypeChunk(S.Context, Policy, FDecl, Result); 274486d802e03a267af79663990c39865c67e0645238Douglas Gregor const FunctionProtoType *Proto 274586d802e03a267af79663990c39865c67e0645238Douglas Gregor = dyn_cast<FunctionProtoType>(getFunctionType()); 274686d802e03a267af79663990c39865c67e0645238Douglas Gregor if (!FDecl && !Proto) { 274786d802e03a267af79663990c39865c67e0645238Douglas Gregor // Function without a prototype. Just give the return type and a 274886d802e03a267af79663990c39865c67e0645238Douglas Gregor // highlighted ellipsis. 274986d802e03a267af79663990c39865c67e0645238Douglas Gregor const FunctionType *FT = getFunctionType(); 2750a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor Result.AddTextChunk(GetCompletionTypeString(FT->getResultType(), 27518987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor S.Context, Policy, 2752a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor Result.getAllocator())); 27531eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.AddChunk(CodeCompletionString::CK_LeftParen); 27541eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.AddChunk(CodeCompletionString::CK_CurrentParameter, "..."); 27551eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.AddChunk(CodeCompletionString::CK_RightParen); 2756218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Result.TakeString(); 275786d802e03a267af79663990c39865c67e0645238Douglas Gregor } 275886d802e03a267af79663990c39865c67e0645238Douglas Gregor 275986d802e03a267af79663990c39865c67e0645238Douglas Gregor if (FDecl) 2760dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTextChunk( 2761dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.getAllocator().CopyString(FDecl->getNameAsString())); 276286d802e03a267af79663990c39865c67e0645238Douglas Gregor else 2763218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddTextChunk( 2764dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.getAllocator().CopyString( 2765f85e193739c953358c865005855253af4f68a497John McCall Proto->getResultType().getAsString(Policy))); 276686d802e03a267af79663990c39865c67e0645238Douglas Gregor 27671eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.AddChunk(CodeCompletionString::CK_LeftParen); 276886d802e03a267af79663990c39865c67e0645238Douglas Gregor unsigned NumParams = FDecl? FDecl->getNumParams() : Proto->getNumArgs(); 276986d802e03a267af79663990c39865c67e0645238Douglas Gregor for (unsigned I = 0; I != NumParams; ++I) { 277086d802e03a267af79663990c39865c67e0645238Douglas Gregor if (I) 27711eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.AddChunk(CodeCompletionString::CK_Comma); 277286d802e03a267af79663990c39865c67e0645238Douglas Gregor 277386d802e03a267af79663990c39865c67e0645238Douglas Gregor std::string ArgString; 277486d802e03a267af79663990c39865c67e0645238Douglas Gregor QualType ArgType; 277586d802e03a267af79663990c39865c67e0645238Douglas Gregor 277686d802e03a267af79663990c39865c67e0645238Douglas Gregor if (FDecl) { 277786d802e03a267af79663990c39865c67e0645238Douglas Gregor ArgString = FDecl->getParamDecl(I)->getNameAsString(); 277886d802e03a267af79663990c39865c67e0645238Douglas Gregor ArgType = FDecl->getParamDecl(I)->getOriginalType(); 277986d802e03a267af79663990c39865c67e0645238Douglas Gregor } else { 278086d802e03a267af79663990c39865c67e0645238Douglas Gregor ArgType = Proto->getArgType(I); 278186d802e03a267af79663990c39865c67e0645238Douglas Gregor } 278286d802e03a267af79663990c39865c67e0645238Douglas Gregor 2783f85e193739c953358c865005855253af4f68a497John McCall ArgType.getAsStringInternal(ArgString, Policy); 278486d802e03a267af79663990c39865c67e0645238Douglas Gregor 278586d802e03a267af79663990c39865c67e0645238Douglas Gregor if (I == CurrentArg) 27861eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.AddChunk(CodeCompletionString::CK_CurrentParameter, 27871eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.getAllocator().CopyString(ArgString)); 278886d802e03a267af79663990c39865c67e0645238Douglas Gregor else 2789dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTextChunk(Result.getAllocator().CopyString(ArgString)); 279086d802e03a267af79663990c39865c67e0645238Douglas Gregor } 279186d802e03a267af79663990c39865c67e0645238Douglas Gregor 279286d802e03a267af79663990c39865c67e0645238Douglas Gregor if (Proto && Proto->isVariadic()) { 27931eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.AddChunk(CodeCompletionString::CK_Comma); 279486d802e03a267af79663990c39865c67e0645238Douglas Gregor if (CurrentArg < NumParams) 2795218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddTextChunk("..."); 279686d802e03a267af79663990c39865c67e0645238Douglas Gregor else 27971eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.AddChunk(CodeCompletionString::CK_CurrentParameter, "..."); 279886d802e03a267af79663990c39865c67e0645238Douglas Gregor } 27991eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.AddChunk(CodeCompletionString::CK_RightParen); 280086d802e03a267af79663990c39865c67e0645238Douglas Gregor 2801218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Result.TakeString(); 280286d802e03a267af79663990c39865c67e0645238Douglas Gregor} 280386d802e03a267af79663990c39865c67e0645238Douglas Gregor 28045f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerunsigned clang::getMacroUsagePriority(StringRef MacroName, 2805b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor const LangOptions &LangOpts, 28061827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor bool PreferredTypeIsPointer) { 28071827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor unsigned Priority = CCP_Macro; 28081827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor 2809b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor // Treat the "nil", "Nil" and "NULL" macros as null pointer constants. 2810b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor if (MacroName.equals("nil") || MacroName.equals("NULL") || 2811b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor MacroName.equals("Nil")) { 28121827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor Priority = CCP_Constant; 28131827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor if (PreferredTypeIsPointer) 28141827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor Priority = Priority / CCF_SimilarTypeMatch; 2815b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor } 2816b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor // Treat "YES", "NO", "true", and "false" as constants. 2817b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor else if (MacroName.equals("YES") || MacroName.equals("NO") || 2818b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor MacroName.equals("true") || MacroName.equals("false")) 2819b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor Priority = CCP_Constant; 2820b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor // Treat "bool" as a type. 2821b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor else if (MacroName.equals("bool")) 2822b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor Priority = CCP_Type + (LangOpts.ObjC1? CCD_bool_in_ObjC : 0); 2823b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor 28241827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor 28251827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor return Priority; 28261827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor} 28271827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor 2828e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas GregorCXCursorKind clang::getCursorKindForDecl(Decl *D) { 2829e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor if (!D) 2830e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor return CXCursor_UnexposedDecl; 2831e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor 2832e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor switch (D->getKind()) { 2833e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::Enum: return CXCursor_EnumDecl; 2834e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::EnumConstant: return CXCursor_EnumConstantDecl; 2835e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::Field: return CXCursor_FieldDecl; 2836e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::Function: 2837e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor return CXCursor_FunctionDecl; 2838e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::ObjCCategory: return CXCursor_ObjCCategoryDecl; 2839e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::ObjCCategoryImpl: return CXCursor_ObjCCategoryImplDecl; 2840e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::ObjCImplementation: return CXCursor_ObjCImplementationDecl; 2841375bb1413c041055262c8a416f20d10474a5eda9Douglas Gregor 2842c15707d8da08df2eb22f6ed047743fa3f7c9831bArgyrios Kyrtzidis case Decl::ObjCInterface: return CXCursor_ObjCInterfaceDecl; 2843e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::ObjCIvar: return CXCursor_ObjCIvarDecl; 2844e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::ObjCMethod: 2845e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor return cast<ObjCMethodDecl>(D)->isInstanceMethod() 2846e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor ? CXCursor_ObjCInstanceMethodDecl : CXCursor_ObjCClassMethodDecl; 2847e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::CXXMethod: return CXCursor_CXXMethod; 2848e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::CXXConstructor: return CXCursor_Constructor; 2849e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::CXXDestructor: return CXCursor_Destructor; 2850e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::CXXConversion: return CXCursor_ConversionFunction; 2851e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::ObjCProperty: return CXCursor_ObjCPropertyDecl; 2852c15707d8da08df2eb22f6ed047743fa3f7c9831bArgyrios Kyrtzidis case Decl::ObjCProtocol: return CXCursor_ObjCProtocolDecl; 2853e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::ParmVar: return CXCursor_ParmDecl; 2854e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::Typedef: return CXCursor_TypedefDecl; 2855162e1c1b487352434552147967c3dd296ebee2f7Richard Smith case Decl::TypeAlias: return CXCursor_TypeAliasDecl; 2856e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::Var: return CXCursor_VarDecl; 2857e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::Namespace: return CXCursor_Namespace; 2858e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::NamespaceAlias: return CXCursor_NamespaceAlias; 2859e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::TemplateTypeParm: return CXCursor_TemplateTypeParameter; 2860e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::NonTypeTemplateParm:return CXCursor_NonTypeTemplateParameter; 2861e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::TemplateTemplateParm:return CXCursor_TemplateTemplateParameter; 2862e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::FunctionTemplate: return CXCursor_FunctionTemplate; 2863e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::ClassTemplate: return CXCursor_ClassTemplate; 28642dfdb948bef51a601e763191e4becfe59880d382Argyrios Kyrtzidis case Decl::AccessSpec: return CXCursor_CXXAccessSpecifier; 2865e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::ClassTemplatePartialSpecialization: 2866e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor return CXCursor_ClassTemplatePartialSpecialization; 2867e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::UsingDirective: return CXCursor_UsingDirective; 28688e5900c8e9bd32bcc385124f564f3d38a11d0e28Douglas Gregor case Decl::TranslationUnit: return CXCursor_TranslationUnit; 2869e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor 2870e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::Using: 2871e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::UnresolvedUsingValue: 2872e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::UnresolvedUsingTypename: 2873e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor return CXCursor_UsingDeclaration; 2874e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor 2875352697a87bca664356f21a838b162084013625eaDouglas Gregor case Decl::ObjCPropertyImpl: 2876352697a87bca664356f21a838b162084013625eaDouglas Gregor switch (cast<ObjCPropertyImplDecl>(D)->getPropertyImplementation()) { 2877352697a87bca664356f21a838b162084013625eaDouglas Gregor case ObjCPropertyImplDecl::Dynamic: 2878352697a87bca664356f21a838b162084013625eaDouglas Gregor return CXCursor_ObjCDynamicDecl; 2879352697a87bca664356f21a838b162084013625eaDouglas Gregor 2880352697a87bca664356f21a838b162084013625eaDouglas Gregor case ObjCPropertyImplDecl::Synthesize: 2881352697a87bca664356f21a838b162084013625eaDouglas Gregor return CXCursor_ObjCSynthesizeDecl; 2882352697a87bca664356f21a838b162084013625eaDouglas Gregor } 2883352697a87bca664356f21a838b162084013625eaDouglas Gregor 2884e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor default: 2885e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor if (TagDecl *TD = dyn_cast<TagDecl>(D)) { 2886e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor switch (TD->getTagKind()) { 2887e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case TTK_Struct: return CXCursor_StructDecl; 2888e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case TTK_Class: return CXCursor_ClassDecl; 2889e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case TTK_Union: return CXCursor_UnionDecl; 2890e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case TTK_Enum: return CXCursor_EnumDecl; 2891e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor } 2892e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor } 2893e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor } 2894e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor 2895e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor return CXCursor_UnexposedDecl; 2896e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor} 2897e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor 2898590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregorstatic void AddMacroResults(Preprocessor &PP, ResultBuilder &Results, 2899590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregor bool TargetTypeIsPointer = false) { 29000a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 2901590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregor 29023f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor Results.EnterNewScope(); 2903c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor 29040c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor for (Preprocessor::macro_iterator M = PP.macro_begin(), 29050c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor MEnd = PP.macro_end(); 2906590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregor M != MEnd; ++M) { 29071827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor Results.AddResult(Result(M->first, 29081827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor getMacroUsagePriority(M->first->getName(), 29094e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie PP.getLangOpts(), 29101827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor TargetTypeIsPointer))); 2911590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregor } 2912c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor 29133f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor Results.ExitScope(); 2914c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor 29153f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor} 29163f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor 2917aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregorstatic void AddPrettyFunctionResults(const LangOptions &LangOpts, 2918aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor ResultBuilder &Results) { 29190a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 2920aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor 2921aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor Results.EnterNewScope(); 2922c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor 2923aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor Results.AddResult(Result("__PRETTY_FUNCTION__", CCP_Constant)); 2924aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor Results.AddResult(Result("__FUNCTION__", CCP_Constant)); 2925aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor if (LangOpts.C99 || LangOpts.CPlusPlus0x) 2926aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor Results.AddResult(Result("__func__", CCP_Constant)); 2927aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor Results.ExitScope(); 2928aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor} 2929aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor 29303a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbarstatic void HandleCodeCompleteResults(Sema *S, 29313a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar CodeCompleteConsumer *CodeCompleter, 2932e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext Context, 29330a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall CodeCompletionResult *Results, 2934e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor unsigned NumResults) { 293586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (CodeCompleter) 2936e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompleter->ProcessCodeCompleteResults(*S, Context, Results, NumResults); 293786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 293886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 2939e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregorstatic enum CodeCompletionContext::Kind mapCodeCompletionContext(Sema &S, 2940e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Sema::ParserCompletionContext PCC) { 2941e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor switch (PCC) { 2942f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Namespace: 2943e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor return CodeCompletionContext::CCC_TopLevel; 2944e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor 2945f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Class: 2946e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor return CodeCompletionContext::CCC_ClassStructUnion; 2947e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor 2948f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ObjCInterface: 2949e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor return CodeCompletionContext::CCC_ObjCInterface; 2950e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor 2951f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ObjCImplementation: 2952e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor return CodeCompletionContext::CCC_ObjCImplementation; 2953e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor 2954f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ObjCInstanceVariableList: 2955e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor return CodeCompletionContext::CCC_ObjCIvarList; 2956e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor 2957f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Template: 2958f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_MemberTemplate: 295952779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor if (S.CurContext->isFileContext()) 296052779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor return CodeCompletionContext::CCC_TopLevel; 29617530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie if (S.CurContext->isRecord()) 296252779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor return CodeCompletionContext::CCC_ClassStructUnion; 29637530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie return CodeCompletionContext::CCC_Other; 296452779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor 2965f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_RecoveryInFunction: 296652779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor return CodeCompletionContext::CCC_Recovery; 2967a5450a097e83072c0e545ccd8df8b07e172f1b09Douglas Gregor 2968f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ForInit: 29694e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (S.getLangOpts().CPlusPlus || S.getLangOpts().C99 || 29704e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie S.getLangOpts().ObjC1) 2971a5450a097e83072c0e545ccd8df8b07e172f1b09Douglas Gregor return CodeCompletionContext::CCC_ParenthesizedExpression; 2972a5450a097e83072c0e545ccd8df8b07e172f1b09Douglas Gregor else 2973a5450a097e83072c0e545ccd8df8b07e172f1b09Douglas Gregor return CodeCompletionContext::CCC_Expression; 2974a5450a097e83072c0e545ccd8df8b07e172f1b09Douglas Gregor 2975a5450a097e83072c0e545ccd8df8b07e172f1b09Douglas Gregor case Sema::PCC_Expression: 2976f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Condition: 2977e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor return CodeCompletionContext::CCC_Expression; 2978e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor 2979f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Statement: 2980e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor return CodeCompletionContext::CCC_Statement; 298172db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor 2982f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Type: 298372db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor return CodeCompletionContext::CCC_Type; 29840268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor 29850268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor case Sema::PCC_ParenthesizedExpression: 29860268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor return CodeCompletionContext::CCC_ParenthesizedExpression; 298768e3c2eef52701a178fbcc2bb424f31dd4b36931Douglas Gregor 298868e3c2eef52701a178fbcc2bb424f31dd4b36931Douglas Gregor case Sema::PCC_LocalDeclarationSpecifiers: 298968e3c2eef52701a178fbcc2bb424f31dd4b36931Douglas Gregor return CodeCompletionContext::CCC_Type; 2990e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor } 29917530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie 29927530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie llvm_unreachable("Invalid ParserCompletionContext!"); 2993e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor} 2994e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor 2995f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor/// \brief If we're in a C++ virtual member function, add completion results 2996f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor/// that invoke the functions we override, since it's common to invoke the 2997f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor/// overridden function as well as adding new functionality. 2998f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor/// 2999f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor/// \param S The semantic analysis object for which we are generating results. 3000f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor/// 3001f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor/// \param InContext This context in which the nested-name-specifier preceding 3002f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor/// the code-completion point 3003f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregorstatic void MaybeAddOverrideCalls(Sema &S, DeclContext *InContext, 3004f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor ResultBuilder &Results) { 3005f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor // Look through blocks. 3006f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor DeclContext *CurContext = S.CurContext; 3007f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor while (isa<BlockDecl>(CurContext)) 3008f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor CurContext = CurContext->getParent(); 3009f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor 3010f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor 3011f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(CurContext); 3012f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor if (!Method || !Method->isVirtual()) 3013f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor return; 3014f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor 3015f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor // We need to have names for all of the parameters, if we're going to 3016f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor // generate a forwarding call. 3017f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor for (CXXMethodDecl::param_iterator P = Method->param_begin(), 3018f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor PEnd = Method->param_end(); 3019f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor P != PEnd; 3020f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor ++P) { 3021f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor if (!(*P)->getDeclName()) 3022f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor return; 3023f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor } 3024f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor 30258987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor PrintingPolicy Policy = getCompletionPrintingPolicy(S); 3026f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor for (CXXMethodDecl::method_iterator M = Method->begin_overridden_methods(), 3027f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor MEnd = Method->end_overridden_methods(); 3028f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor M != MEnd; ++M) { 302928a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Builder(Results.getAllocator(), 303028a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis Results.getCodeCompletionTUInfo()); 3031f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor CXXMethodDecl *Overridden = const_cast<CXXMethodDecl *>(*M); 3032f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor if (Overridden->getCanonicalDecl() == Method->getCanonicalDecl()) 3033f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor continue; 3034f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor 3035f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor // If we need a nested-name-specifier, add one now. 3036f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor if (!InContext) { 3037f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor NestedNameSpecifier *NNS 3038f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor = getRequiredQualification(S.Context, CurContext, 3039f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor Overridden->getDeclContext()); 3040f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor if (NNS) { 3041f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor std::string Str; 3042f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor llvm::raw_string_ostream OS(Str); 30438987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor NNS->print(OS, Policy); 3044dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddTextChunk(Results.getAllocator().CopyString(OS.str())); 3045f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor } 3046f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor } else if (!InContext->Equals(Overridden->getDeclContext())) 3047f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor continue; 3048f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor 3049dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddTypedTextChunk(Results.getAllocator().CopyString( 3050218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Overridden->getNameAsString())); 3051218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 3052f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor bool FirstParam = true; 3053f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor for (CXXMethodDecl::param_iterator P = Method->param_begin(), 3054f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor PEnd = Method->param_end(); 3055f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor P != PEnd; ++P) { 3056f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor if (FirstParam) 3057f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor FirstParam = false; 3058f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor else 3059218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_Comma); 3060f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor 3061dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddPlaceholderChunk(Results.getAllocator().CopyString( 3062218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor (*P)->getIdentifier()->getName())); 3063f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor } 3064218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 3065218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(CodeCompletionResult(Builder.TakeString(), 3066f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor CCP_SuperCompletion, 3067ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor CXCursor_CXXMethod, 3068ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor CXAvailability_Available, 3069ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor Overridden)); 3070f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor Results.Ignore(Overridden); 3071f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor } 3072f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor} 3073f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor 3074c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregorvoid Sema::CodeCompleteModuleImport(SourceLocation ImportLoc, 3075c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor ModuleIdPath Path) { 3076c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor typedef CodeCompletionResult Result; 3077c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 307828a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 3079c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor CodeCompletionContext::CCC_Other); 3080c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor Results.EnterNewScope(); 3081c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor 3082c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor CodeCompletionAllocator &Allocator = Results.getAllocator(); 308328a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo()); 3084c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor typedef CodeCompletionResult Result; 3085c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor if (Path.empty()) { 3086c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor // Enumerate all top-level modules. 3087c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor llvm::SmallVector<Module *, 8> Modules; 3088c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor PP.getHeaderSearchInfo().collectAllModules(Modules); 3089c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor for (unsigned I = 0, N = Modules.size(); I != N; ++I) { 3090c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor Builder.AddTypedTextChunk( 3091c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor Builder.getAllocator().CopyString(Modules[I]->Name)); 3092c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor Results.AddResult(Result(Builder.TakeString(), 3093c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor CCP_Declaration, 3094c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor CXCursor_NotImplemented, 3095c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor Modules[I]->isAvailable() 3096c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor ? CXAvailability_Available 3097c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor : CXAvailability_NotAvailable)); 3098c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor } 3099c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor } else { 3100c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor // Load the named module. 3101c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor Module *Mod = PP.getModuleLoader().loadModule(ImportLoc, Path, 3102c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor Module::AllVisible, 3103c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor /*IsInclusionDirective=*/false); 3104c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor // Enumerate submodules. 3105c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor if (Mod) { 3106c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor for (Module::submodule_iterator Sub = Mod->submodule_begin(), 3107c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor SubEnd = Mod->submodule_end(); 3108c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor Sub != SubEnd; ++Sub) { 3109c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor 3110c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor Builder.AddTypedTextChunk( 3111c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor Builder.getAllocator().CopyString((*Sub)->Name)); 3112c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor Results.AddResult(Result(Builder.TakeString(), 3113c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor CCP_Declaration, 3114c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor CXCursor_NotImplemented, 3115c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor (*Sub)->isAvailable() 3116c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor ? CXAvailability_Available 3117c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor : CXAvailability_NotAvailable)); 3118c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor } 3119c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor } 3120c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor } 3121c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor Results.ExitScope(); 3122c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 3123c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor Results.data(),Results.size()); 3124c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor} 3125c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor 312601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregorvoid Sema::CodeCompleteOrdinaryName(Scope *S, 3127e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor ParserCompletionContext CompletionContext) { 31280a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 3129218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 313028a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 313152779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor mapCodeCompletionContext(*this, CompletionContext)); 3132f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor Results.EnterNewScope(); 3133cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor 313401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Determine how to filter results, e.g., so that the names of 313501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // values (functions, enumerators, function templates, etc.) are 313601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // only allowed where we can have an expression. 313701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor switch (CompletionContext) { 3138e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_Namespace: 3139e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_Class: 3140e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_ObjCInterface: 3141e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_ObjCImplementation: 3142e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_ObjCInstanceVariableList: 3143e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_Template: 3144e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_MemberTemplate: 314572db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_Type: 314668e3c2eef52701a178fbcc2bb424f31dd4b36931Douglas Gregor case PCC_LocalDeclarationSpecifiers: 314701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Results.setFilter(&ResultBuilder::IsOrdinaryNonValueName); 314801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 314901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 3150e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_Statement: 31510268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor case PCC_ParenthesizedExpression: 3152eb0d0145910f3024d9bdefe279a1e9b95495f2fdDouglas Gregor case PCC_Expression: 3153e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_ForInit: 3154e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_Condition: 31554e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (WantTypesInContext(CompletionContext, getLangOpts())) 31564710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor Results.setFilter(&ResultBuilder::IsOrdinaryName); 31574710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor else 31584710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor Results.setFilter(&ResultBuilder::IsOrdinaryNonTypeName); 3159f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor 31604e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (getLangOpts().CPlusPlus) 3161f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor MaybeAddOverrideCalls(*this, /*InContext=*/0, Results); 316201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 3163dc8453422bec3bbf70c03920e01498d75783d122Douglas Gregor 3164e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_RecoveryInFunction: 3165dc8453422bec3bbf70c03920e01498d75783d122Douglas Gregor // Unfiltered 3166dc8453422bec3bbf70c03920e01498d75783d122Douglas Gregor break; 316701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 316801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 31693cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor // If we are in a C++ non-static member function, check the qualifiers on 31703cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor // the member function to filter/prioritize the results list. 31713cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor if (CXXMethodDecl *CurMethod = dyn_cast<CXXMethodDecl>(CurContext)) 31723cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor if (CurMethod->isInstance()) 31733cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor Results.setObjectTypeQualifiers( 31743cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor Qualifiers::fromCVRMask(CurMethod->getTypeQualifiers())); 31753cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor 31761ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 31778071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 31788071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompleter->includeGlobals()); 31792a7925c4abe45650f3ab27be09468e3a3a98084aDouglas Gregor 3180bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddOrdinaryNameResults(CompletionContext, S, *this, Results); 31812a7925c4abe45650f3ab27be09468e3a3a98084aDouglas Gregor Results.ExitScope(); 31822a7925c4abe45650f3ab27be09468e3a3a98084aDouglas Gregor 3183aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor switch (CompletionContext) { 31840268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor case PCC_ParenthesizedExpression: 318572db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_Expression: 318672db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_Statement: 318772db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_RecoveryInFunction: 318872db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor if (S->getFnParent()) 31894e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie AddPrettyFunctionResults(PP.getLangOpts(), Results); 319072db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor break; 319172db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor 319272db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_Namespace: 319372db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_Class: 319472db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_ObjCInterface: 319572db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_ObjCImplementation: 319672db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_ObjCInstanceVariableList: 319772db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_Template: 319872db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_MemberTemplate: 319972db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_ForInit: 320072db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_Condition: 320172db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_Type: 320268e3c2eef52701a178fbcc2bb424f31dd4b36931Douglas Gregor case PCC_LocalDeclarationSpecifiers: 320372db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor break; 3204aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor } 3205aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor 32060c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor if (CodeCompleter->includeMacros()) 3207bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddMacroResults(PP, Results); 3208aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor 3209cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 3210e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 3211791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor} 3212791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor 3213c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregorstatic void AddClassMessageCompletions(Sema &SemaRef, Scope *S, 3214c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor ParsedType Receiver, 3215c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor IdentifierInfo **SelIdents, 3216c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor unsigned NumSelIdents, 321770c5ac70ace21b011dc2d4001bae26cdcf62ff8dDouglas Gregor bool AtArgumentExpression, 3218c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor bool IsSuper, 3219c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor ResultBuilder &Results); 3220c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor 3221c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregorvoid Sema::CodeCompleteDeclSpec(Scope *S, DeclSpec &DS, 3222c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor bool AllowNonIdentifiers, 3223c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor bool AllowNestedNameSpecifiers) { 32240a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 3225218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 322628a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 322752779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor AllowNestedNameSpecifiers 322852779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor ? CodeCompletionContext::CCC_PotentiallyQualifiedName 322952779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor : CodeCompletionContext::CCC_Name); 32302ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor Results.EnterNewScope(); 32312ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor 32322ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor // Type qualifiers can come after names. 32332ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor Results.AddResult(Result("const")); 32342ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor Results.AddResult(Result("volatile")); 32354e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (getLangOpts().C99) 32362ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor Results.AddResult(Result("restrict")); 32372ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor 32384e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (getLangOpts().CPlusPlus) { 32392ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor if (AllowNonIdentifiers) { 32402ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor Results.AddResult(Result("operator")); 32412ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor } 32422ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor 32432ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor // Add nested-name-specifiers. 32442ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor if (AllowNestedNameSpecifiers) { 32452ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor Results.allowNestedNameSpecifiers(); 324652779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor Results.setFilter(&ResultBuilder::IsImpossibleToSatisfy); 32472ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 32482ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor LookupVisibleDecls(S, LookupNestedNameSpecifierName, Consumer, 32492ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor CodeCompleter->includeGlobals()); 325052779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor Results.setFilter(0); 32512ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor } 32522ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor } 32532ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor Results.ExitScope(); 32542ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor 3255c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor // If we're in a context where we might have an expression (rather than a 3256c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor // declaration), and what we've seen so far is an Objective-C type that could 3257c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor // be a receiver of a class message, this may be a class message send with 3258c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor // the initial opening bracket '[' missing. Add appropriate completions. 3259c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor if (AllowNonIdentifiers && !AllowNestedNameSpecifiers && 3260c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor DS.getTypeSpecType() == DeclSpec::TST_typename && 3261c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor DS.getStorageClassSpecAsWritten() == DeclSpec::SCS_unspecified && 3262c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor !DS.isThreadSpecified() && !DS.isExternInLinkageSpec() && 3263c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor DS.getTypeSpecComplex() == DeclSpec::TSC_unspecified && 3264c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor DS.getTypeSpecSign() == DeclSpec::TSS_unspecified && 3265c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor DS.getTypeQualifiers() == 0 && 3266c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor S && 3267c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor (S->getFlags() & Scope::DeclScope) != 0 && 3268c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor (S->getFlags() & (Scope::ClassScope | Scope::TemplateParamScope | 3269c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor Scope::FunctionPrototypeScope | 3270c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor Scope::AtCatchScope)) == 0) { 3271c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor ParsedType T = DS.getRepAsType(); 3272c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor if (!T.get().isNull() && T.get()->isObjCObjectOrInterfaceType()) 327370c5ac70ace21b011dc2d4001bae26cdcf62ff8dDouglas Gregor AddClassMessageCompletions(*this, S, T, 0, 0, false, false, Results); 3274c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor } 3275c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor 32764497dd49f78eb5e1a7c3f19d1a13564f79e12341Douglas Gregor // Note that we intentionally suppress macro results here, since we do not 32774497dd49f78eb5e1a7c3f19d1a13564f79e12341Douglas Gregor // encourage using macros to produce the names of entities. 32784497dd49f78eb5e1a7c3f19d1a13564f79e12341Douglas Gregor 327952779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 328052779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor Results.getCompletionContext(), 32812ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor Results.data(), Results.size()); 32822ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor} 32832ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor 3284fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregorstruct Sema::CodeCompleteExpressionData { 3285fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor CodeCompleteExpressionData(QualType PreferredType = QualType()) 3286fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor : PreferredType(PreferredType), IntegralConstantExpression(false), 3287fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor ObjCCollection(false) { } 3288fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor 3289fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor QualType PreferredType; 3290fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor bool IntegralConstantExpression; 3291fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor bool ObjCCollection; 32925f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<Decl *, 4> IgnoreDecls; 3293fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor}; 3294fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor 32955ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor/// \brief Perform code-completion in an expression context when we know what 32965ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor/// type we're looking for. 3297fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregorvoid Sema::CodeCompleteExpression(Scope *S, 3298fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor const CodeCompleteExpressionData &Data) { 32990a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 3300218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 330128a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 3302218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Expression); 3303fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor if (Data.ObjCCollection) 3304fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor Results.setFilter(&ResultBuilder::IsObjCCollection); 3305fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor else if (Data.IntegralConstantExpression) 3306f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor Results.setFilter(&ResultBuilder::IsIntegralConstantValue); 33074e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie else if (WantTypesInContext(PCC_Expression, getLangOpts())) 33085ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor Results.setFilter(&ResultBuilder::IsOrdinaryName); 33095ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor else 33105ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor Results.setFilter(&ResultBuilder::IsOrdinaryNonTypeName); 3311fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor 3312fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor if (!Data.PreferredType.isNull()) 3313fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor Results.setPreferredType(Data.PreferredType.getNonReferenceType()); 3314fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor 3315fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor // Ignore any declarations that we were told that we don't care about. 3316fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor for (unsigned I = 0, N = Data.IgnoreDecls.size(); I != N; ++I) 3317fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor Results.Ignore(Data.IgnoreDecls[I]); 33185ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 33195ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 33208071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 33218071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompleter->includeGlobals()); 33225ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 33235ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor Results.EnterNewScope(); 3324e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor AddOrdinaryNameResults(PCC_Expression, S, *this, Results); 33255ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor Results.ExitScope(); 33265ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 3327590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregor bool PreferredTypeIsPointer = false; 3328fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor if (!Data.PreferredType.isNull()) 3329fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor PreferredTypeIsPointer = Data.PreferredType->isAnyPointerType() 3330fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor || Data.PreferredType->isMemberPointerType() 3331fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor || Data.PreferredType->isBlockPointerType(); 3332590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregor 3333aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor if (S->getFnParent() && 3334aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor !Data.ObjCCollection && 3335aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor !Data.IntegralConstantExpression) 33364e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie AddPrettyFunctionResults(PP.getLangOpts(), Results); 3337aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor 33385ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (CodeCompleter->includeMacros()) 3339590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregor AddMacroResults(PP, Results, PreferredTypeIsPointer); 3340e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 3341fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor CodeCompletionContext(CodeCompletionContext::CCC_Expression, 3342fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor Data.PreferredType), 3343e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 33445ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor} 33455ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 3346ac5fd8404fa8ecfae28be76f98fd0d926350354cDouglas Gregorvoid Sema::CodeCompletePostfixExpression(Scope *S, ExprResult E) { 3347ac5fd8404fa8ecfae28be76f98fd0d926350354cDouglas Gregor if (E.isInvalid()) 3348ac5fd8404fa8ecfae28be76f98fd0d926350354cDouglas Gregor CodeCompleteOrdinaryName(S, PCC_RecoveryInFunction); 33494e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie else if (getLangOpts().ObjC1) 3350ac5fd8404fa8ecfae28be76f98fd0d926350354cDouglas Gregor CodeCompleteObjCInstanceMessage(S, E.take(), 0, 0, false); 335178edf515544f0b9dddf69d6c1678fd83e94d8352Douglas Gregor} 33525ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 33537344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor/// \brief The set of properties that have already been added, referenced by 33547344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor/// property name. 33557344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregortypedef llvm::SmallPtrSet<IdentifierInfo*, 16> AddedPropertiesSet; 33567344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor 3357b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor/// \brief Retrieve the container definition, if any? 3358b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregorstatic ObjCContainerDecl *getContainerDef(ObjCContainerDecl *Container) { 3359b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor if (ObjCInterfaceDecl *Interface = dyn_cast<ObjCInterfaceDecl>(Container)) { 3360b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor if (Interface->hasDefinition()) 3361b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor return Interface->getDefinition(); 3362b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor 3363b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor return Interface; 3364b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor } 3365b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor 3366b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) { 3367b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor if (Protocol->hasDefinition()) 3368b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor return Protocol->getDefinition(); 3369b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor 3370b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor return Protocol; 3371b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor } 3372b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor return Container; 3373b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor} 3374b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor 3375b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregorstatic void AddObjCProperties(ObjCContainerDecl *Container, 3376322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor bool AllowCategories, 33774b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor bool AllowNullaryMethods, 337895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor DeclContext *CurContext, 33797344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor AddedPropertiesSet &AddedProperties, 338095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor ResultBuilder &Results) { 33810a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 338295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 3383b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor // Retrieve the definition. 3384b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor Container = getContainerDef(Container); 3385b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor 338695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Add properties in this container. 338795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor for (ObjCContainerDecl::prop_iterator P = Container->prop_begin(), 338895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor PEnd = Container->prop_end(); 338995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor P != PEnd; 33907344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor ++P) { 33917344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor if (AddedProperties.insert(P->getIdentifier())) 3392581deb3da481053c4993c7600f97acf7768caac5David Blaikie Results.MaybeAddResult(Result(*P, 0), CurContext); 33937344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor } 339495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 33954b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor // Add nullary methods 33964b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor if (AllowNullaryMethods) { 33974b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor ASTContext &Context = Container->getASTContext(); 33988987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor PrintingPolicy Policy = getCompletionPrintingPolicy(Results.getSema()); 33994b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor for (ObjCContainerDecl::method_iterator M = Container->meth_begin(), 34004b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor MEnd = Container->meth_end(); 34014b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor M != MEnd; ++M) { 34024b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor if (M->getSelector().isUnarySelector()) 34034b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor if (IdentifierInfo *Name = M->getSelector().getIdentifierInfoForSlot(0)) 34044b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor if (AddedProperties.insert(Name)) { 340528a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Builder(Results.getAllocator(), 340628a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis Results.getCodeCompletionTUInfo()); 3407581deb3da481053c4993c7600f97acf7768caac5David Blaikie AddResultTypeChunk(Context, Policy, *M, Builder); 34084b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor Builder.AddTypedTextChunk( 34094b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor Results.getAllocator().CopyString(Name->getName())); 34104b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor 3411581deb3da481053c4993c7600f97acf7768caac5David Blaikie Results.MaybeAddResult(Result(Builder.TakeString(), *M, 3412ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor CCP_MemberDeclaration + CCD_MethodAsProperty), 34134b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor CurContext); 34144b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor } 34154b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor } 34164b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor } 34174b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor 34184b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor 341995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Add properties in referenced protocols. 342095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) { 342195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor for (ObjCProtocolDecl::protocol_iterator P = Protocol->protocol_begin(), 342295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor PEnd = Protocol->protocol_end(); 342395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor P != PEnd; ++P) 34244b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddObjCProperties(*P, AllowCategories, AllowNullaryMethods, CurContext, 34254b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddedProperties, Results); 342695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } else if (ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container)){ 3427322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor if (AllowCategories) { 3428322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Look through categories. 3429322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor for (ObjCCategoryDecl *Category = IFace->getCategoryList(); 3430322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Category; Category = Category->getNextClassCategory()) 34314b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddObjCProperties(Category, AllowCategories, AllowNullaryMethods, 34324b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor CurContext, AddedProperties, Results); 3433322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor } 343495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 343595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Look through protocols. 343653b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek for (ObjCInterfaceDecl::all_protocol_iterator 343753b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek I = IFace->all_referenced_protocol_begin(), 343853b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek E = IFace->all_referenced_protocol_end(); I != E; ++I) 34394b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddObjCProperties(*I, AllowCategories, AllowNullaryMethods, CurContext, 34404b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddedProperties, Results); 344195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 344295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Look in the superclass. 344395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (IFace->getSuperClass()) 34444b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddObjCProperties(IFace->getSuperClass(), AllowCategories, 34454b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AllowNullaryMethods, CurContext, 34467344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor AddedProperties, Results); 344795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } else if (const ObjCCategoryDecl *Category 344895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor = dyn_cast<ObjCCategoryDecl>(Container)) { 344995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Look through protocols. 345053b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek for (ObjCCategoryDecl::protocol_iterator P = Category->protocol_begin(), 345153b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek PEnd = Category->protocol_end(); 345295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor P != PEnd; ++P) 34534b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddObjCProperties(*P, AllowCategories, AllowNullaryMethods, CurContext, 34544b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddedProperties, Results); 345595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } 345695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor} 345795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 3458f5cd27d7eef3fd4021545dd76a1faf7152fda344Douglas Gregorvoid Sema::CodeCompleteMemberReferenceExpr(Scope *S, Expr *Base, 345981b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor SourceLocation OpLoc, 346081b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor bool IsArrow) { 3461f5cd27d7eef3fd4021545dd76a1faf7152fda344Douglas Gregor if (!Base || !CodeCompleter) 346281b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor return; 346381b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor 3464f5cd27d7eef3fd4021545dd76a1faf7152fda344Douglas Gregor ExprResult ConvertedBase = PerformMemberExprBaseConversion(Base, IsArrow); 3465f5cd27d7eef3fd4021545dd76a1faf7152fda344Douglas Gregor if (ConvertedBase.isInvalid()) 3466f5cd27d7eef3fd4021545dd76a1faf7152fda344Douglas Gregor return; 3467f5cd27d7eef3fd4021545dd76a1faf7152fda344Douglas Gregor Base = ConvertedBase.get(); 3468f5cd27d7eef3fd4021545dd76a1faf7152fda344Douglas Gregor 34690a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 347086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 347181b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor QualType BaseType = Base->getType(); 347286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 347386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (IsArrow) { 347486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (const PointerType *Ptr = BaseType->getAs<PointerType>()) 347586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor BaseType = Ptr->getPointeeType(); 347686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor else if (BaseType->isObjCObjectPointerType()) 34773cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor /*Do nothing*/ ; 347886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor else 347986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return; 348086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 348186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 34823da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor enum CodeCompletionContext::Kind contextKind; 34833da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor 34843da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor if (IsArrow) { 34853da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contextKind = CodeCompletionContext::CCC_ArrowMemberAccess; 34863da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 34873da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor else { 34883da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor if (BaseType->isObjCObjectPointerType() || 34893da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor BaseType->isObjCObjectOrInterfaceType()) { 34903da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contextKind = CodeCompletionContext::CCC_ObjCPropertyAccess; 34913da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 34923da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor else { 34933da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contextKind = CodeCompletionContext::CCC_DotMemberAccess; 34943da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 34953da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 34963da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor 3497218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 349828a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 34993da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CodeCompletionContext(contextKind, 350052779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor BaseType), 350152779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor &ResultBuilder::IsMember); 350295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor Results.EnterNewScope(); 350395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (const RecordType *Record = BaseType->getAs<RecordType>()) { 35043cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor // Indicate that we are performing a member access, and the cv-qualifiers 35053cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor // for the base object type. 35063cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor Results.setObjectTypeQualifiers(BaseType.getQualifiers()); 35073cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor 350895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Access to a C/C++ class, struct, or union. 350945bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor Results.allowNestedNameSpecifiers(); 35100cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 35118071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(Record->getDecl(), LookupMemberName, Consumer, 35128071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompleter->includeGlobals()); 35133a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar 35144e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (getLangOpts().CPlusPlus) { 351595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (!Results.empty()) { 351695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // The "template" keyword can follow "->" or "." in the grammar. 351795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // However, we only want to suggest the template keyword if something 351895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // is dependent. 351995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor bool IsDependent = BaseType->isDependentType(); 352095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (!IsDependent) { 352195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor for (Scope *DepScope = S; DepScope; DepScope = DepScope->getParent()) 352295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (DeclContext *Ctx = (DeclContext *)DepScope->getEntity()) { 352395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor IsDependent = Ctx->isDependentContext(); 352495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor break; 352595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } 352695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } 35273a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar 352895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (IsDependent) 3529a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("template")); 353086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 353195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } 353295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } else if (!IsArrow && BaseType->getAsObjCInterfacePointerType()) { 353395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Objective-C property reference. 35347344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor AddedPropertiesSet AddedProperties; 353595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 353695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Add property results based on our interface. 353795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor const ObjCObjectPointerType *ObjCPtr 353895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor = BaseType->getAsObjCInterfacePointerType(); 353995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor assert(ObjCPtr && "Non-NULL pointer guaranteed above!"); 35404b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddObjCProperties(ObjCPtr->getInterfaceDecl(), true, 35414b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor /*AllowNullaryMethods=*/true, CurContext, 35427344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor AddedProperties, Results); 354395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 354495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Add properties from the protocols in a qualified interface. 354595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor for (ObjCObjectPointerType::qual_iterator I = ObjCPtr->qual_begin(), 354695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor E = ObjCPtr->qual_end(); 354795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor I != E; ++I) 35484b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddObjCProperties(*I, true, /*AllowNullaryMethods=*/true, CurContext, 35494b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddedProperties, Results); 355095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } else if ((IsArrow && BaseType->isObjCObjectPointerType()) || 3551c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall (!IsArrow && BaseType->isObjCObjectType())) { 355295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Objective-C instance variable access. 355395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor ObjCInterfaceDecl *Class = 0; 355495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (const ObjCObjectPointerType *ObjCPtr 355595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor = BaseType->getAs<ObjCObjectPointerType>()) 355695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor Class = ObjCPtr->getInterfaceDecl(); 355795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor else 3558c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall Class = BaseType->getAs<ObjCObjectType>()->getInterface(); 355995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 356095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Add all ivars from this class and its superclasses. 356180f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor if (Class) { 356280f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 356380f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor Results.setFilter(&ResultBuilder::IsObjCIvar); 35648071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(Class, LookupMemberName, Consumer, 35658071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompleter->includeGlobals()); 356686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 356786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 356895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 356995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // FIXME: How do we cope with isa? 357095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 357195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor Results.ExitScope(); 35723a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar 35733a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar // Hand off the results found for code completion. 3574e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 357552779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor Results.getCompletionContext(), 3576e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 357781b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor} 357881b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor 3579374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregorvoid Sema::CodeCompleteTag(Scope *S, unsigned TagSpec) { 3580374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor if (!CodeCompleter) 3581374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor return; 3582374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor 35830a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 358486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ResultBuilder::LookupFilter Filter = 0; 3585e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor enum CodeCompletionContext::Kind ContextKind 3586e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor = CodeCompletionContext::CCC_Other; 3587374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor switch ((DeclSpec::TST)TagSpec) { 3588374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor case DeclSpec::TST_enum: 358986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Filter = &ResultBuilder::IsEnum; 3590e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor ContextKind = CodeCompletionContext::CCC_EnumTag; 3591374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor break; 3592374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor 3593374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor case DeclSpec::TST_union: 359486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Filter = &ResultBuilder::IsUnion; 3595e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor ContextKind = CodeCompletionContext::CCC_UnionTag; 3596374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor break; 3597374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor 3598374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor case DeclSpec::TST_struct: 3599374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor case DeclSpec::TST_class: 360086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Filter = &ResultBuilder::IsClassOrStruct; 3601e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor ContextKind = CodeCompletionContext::CCC_ClassOrStructTag; 3602374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor break; 3603374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor 3604374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor default: 3605b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("Unknown type specifier kind in CodeCompleteTag"); 3606374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor } 360786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 360828a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis ResultBuilder Results(*this, CodeCompleter->getAllocator(), 360928a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), ContextKind); 36105d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 36110d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCall 36120d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCall // First pass: look for tags. 36130d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCall Results.setFilter(Filter); 36148071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(S, LookupTagName, Consumer, 36158071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompleter->includeGlobals()); 36160d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCall 36178071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor if (CodeCompleter->includeGlobals()) { 36188071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor // Second pass: look for nested name specifiers. 36198071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor Results.setFilter(&ResultBuilder::IsNestedNameSpecifier); 36208071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(S, LookupNestedNameSpecifierName, Consumer); 36218071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor } 362286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 362352779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 3624e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 3625374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor} 3626374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor 36271a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregorvoid Sema::CodeCompleteTypeQualifiers(DeclSpec &DS) { 3628218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 362928a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 3630218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_TypeQualifiers); 36311a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor Results.EnterNewScope(); 36321a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor if (!(DS.getTypeQualifiers() & DeclSpec::TQ_const)) 36331a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor Results.AddResult("const"); 36341a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor if (!(DS.getTypeQualifiers() & DeclSpec::TQ_volatile)) 36351a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor Results.AddResult("volatile"); 36364e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (getLangOpts().C99 && 36371a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor !(DS.getTypeQualifiers() & DeclSpec::TQ_restrict)) 36381a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor Results.AddResult("restrict"); 36391a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor Results.ExitScope(); 36401a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 364152779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor Results.getCompletionContext(), 36421a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor Results.data(), Results.size()); 36431a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor} 36441a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor 36453e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregorvoid Sema::CodeCompleteCase(Scope *S) { 3646781472fe99a120098c631b0cbe33c89f8cef5e70John McCall if (getCurFunction()->SwitchStack.empty() || !CodeCompleter) 36473e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor return; 3648a8e0cd8cdecc7e0ba1792e46773b884c6eed4829John McCall 3649781472fe99a120098c631b0cbe33c89f8cef5e70John McCall SwitchStmt *Switch = getCurFunction()->SwitchStack.back(); 3650a8e0cd8cdecc7e0ba1792e46773b884c6eed4829John McCall QualType type = Switch->getCond()->IgnoreImplicit()->getType(); 3651a8e0cd8cdecc7e0ba1792e46773b884c6eed4829John McCall if (!type->isEnumeralType()) { 3652a8e0cd8cdecc7e0ba1792e46773b884c6eed4829John McCall CodeCompleteExpressionData Data(type); 3653fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor Data.IntegralConstantExpression = true; 3654fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor CodeCompleteExpression(S, Data); 36553e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor return; 3656f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor } 36573e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 36583e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // Code-complete the cases of a switch statement over an enumeration type 36593e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // by providing the list of 3660a8e0cd8cdecc7e0ba1792e46773b884c6eed4829John McCall EnumDecl *Enum = type->castAs<EnumType>()->getDecl(); 3661b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor if (EnumDecl *Def = Enum->getDefinition()) 3662b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor Enum = Def; 36633e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 36643e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // Determine which enumerators we have already seen in the switch statement. 36653e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // FIXME: Ideally, we would also be able to look *past* the code-completion 36663e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // token, in case we are code-completing in the middle of the switch and not 36673e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // at the end. However, we aren't able to do so at the moment. 36683e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor llvm::SmallPtrSet<EnumConstantDecl *, 8> EnumeratorsSeen; 3669b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor NestedNameSpecifier *Qualifier = 0; 36703e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor for (SwitchCase *SC = Switch->getSwitchCaseList(); SC; 36713e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor SC = SC->getNextSwitchCase()) { 36723e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor CaseStmt *Case = dyn_cast<CaseStmt>(SC); 36733e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor if (!Case) 36743e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor continue; 36753e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 36763e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor Expr *CaseVal = Case->getLHS()->IgnoreParenCasts(); 36773e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(CaseVal)) 36783e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor if (EnumConstantDecl *Enumerator 36793e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor = dyn_cast<EnumConstantDecl>(DRE->getDecl())) { 36803e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // We look into the AST of the case statement to determine which 36813e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // enumerator was named. Alternatively, we could compute the value of 36823e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // the integral constant expression, then compare it against the 36833e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // values of each enumerator. However, value-based approach would not 36843e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // work as well with C++ templates where enumerators declared within a 36853e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // template are type- and value-dependent. 36863e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor EnumeratorsSeen.insert(Enumerator); 36873e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 3688b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // If this is a qualified-id, keep track of the nested-name-specifier 3689b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // so that we can reproduce it as part of code completion, e.g., 36903e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // 36913e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // switch (TagD.getKind()) { 36923e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // case TagDecl::TK_enum: 36933e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // break; 36943e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // case XXX 36953e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // 3696b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // At the XXX, our completions are TagDecl::TK_union, 36973e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // TagDecl::TK_struct, and TagDecl::TK_class, rather than TK_union, 36983e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // TK_struct, and TK_class. 3699a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor Qualifier = DRE->getQualifier(); 37003e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor } 37013e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor } 37023e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 37034e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (getLangOpts().CPlusPlus && !Qualifier && EnumeratorsSeen.empty()) { 3704b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // If there are no prior enumerators in C++, check whether we have to 3705b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // qualify the names of the enumerators that we suggest, because they 3706b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // may not be visible in this scope. 3707b223d8c4266655fe7a9491a0aff0263597672823Douglas Gregor Qualifier = getRequiredQualification(Context, CurContext, Enum); 3708b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor } 3709b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor 37103e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // Add any enumerators that have not yet been mentioned. 3711218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 371228a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 3713218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Expression); 37143e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor Results.EnterNewScope(); 37153e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor for (EnumDecl::enumerator_iterator E = Enum->enumerator_begin(), 37163e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor EEnd = Enum->enumerator_end(); 37173e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor E != EEnd; ++E) { 3718581deb3da481053c4993c7600f97acf7768caac5David Blaikie if (EnumeratorsSeen.count(*E)) 37193e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor continue; 37203e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 3721581deb3da481053c4993c7600f97acf7768caac5David Blaikie CodeCompletionResult R(*E, Qualifier); 37225c722c7020b33da57090422b854072258a50b3f0Douglas Gregor R.Priority = CCP_EnumInCase; 37235c722c7020b33da57090422b854072258a50b3f0Douglas Gregor Results.AddResult(R, CurContext, 0, false); 37243e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor } 37253e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor Results.ExitScope(); 37262f880e47ca32d007d7e9e5ff5efa05f5c3432744Douglas Gregor 37273da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor //We need to make sure we're setting the right context, 37283da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor //so only say we include macros if the code completer says we do 37293da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor enum CodeCompletionContext::Kind kind = CodeCompletionContext::CCC_Other; 37303da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor if (CodeCompleter->includeMacros()) { 3731bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddMacroResults(PP, Results); 37323da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor kind = CodeCompletionContext::CCC_OtherWithMacros; 37333da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 37343da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor 3735e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 37363da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor kind, 3737e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 37383e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor} 37393e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 37409c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregornamespace { 37419c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor struct IsBetterOverloadCandidate { 37429c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor Sema &S; 37435769d6195087229770d7ac90449443e026c47103John McCall SourceLocation Loc; 37449c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 37459c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor public: 37465769d6195087229770d7ac90449443e026c47103John McCall explicit IsBetterOverloadCandidate(Sema &S, SourceLocation Loc) 37475769d6195087229770d7ac90449443e026c47103John McCall : S(S), Loc(Loc) { } 37489c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 37499c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor bool 37509c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor operator()(const OverloadCandidate &X, const OverloadCandidate &Y) const { 3751120d63cd4465230c2cd56508c7cd8e0ad00848e7John McCall return isBetterOverloadCandidate(S, X, Y, Loc); 37529c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor } 37539c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor }; 37549c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor} 37559c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 375613a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charlesstatic bool anyNullArguments(llvm::ArrayRef<Expr*> Args) { 375713a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles if (Args.size() && !Args.data()) 3758d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor return true; 375913a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles 376013a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles for (unsigned I = 0; I != Args.size(); ++I) 3761d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor if (!Args[I]) 3762d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor return true; 376313a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles 3764d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor return false; 3765d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor} 3766d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor 3767f81e5a9e3f3ff80c56e4afb4fe6311a8735f36e8Richard Trieuvoid Sema::CodeCompleteCall(Scope *S, Expr *FnIn, 376813a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles llvm::ArrayRef<Expr *> Args) { 37699c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor if (!CodeCompleter) 37709c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor return; 3771ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor 3772ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor // When we're code-completing for a call, we fall back to ordinary 3773ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor // name code-completion whenever we can't produce specific 3774ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor // results. We may want to revisit this strategy in the future, 3775ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor // e.g., by merging the two kinds of results. 3776ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor 37779c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor Expr *Fn = (Expr *)FnIn; 3778ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor 37799c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor // Ignore type-dependent call expressions entirely. 378013a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles if (!Fn || Fn->isTypeDependent() || anyNullArguments(Args) || 378113a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles Expr::hasAnyTypeDependentArguments(Args)) { 3782e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompleteOrdinaryName(S, PCC_Expression); 37839c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor return; 3784ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor } 37859c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 37863b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall // Build an overload candidate set based on the functions we find. 37875769d6195087229770d7ac90449443e026c47103John McCall SourceLocation Loc = Fn->getExprLoc(); 37885769d6195087229770d7ac90449443e026c47103John McCall OverloadCandidateSet CandidateSet(Loc); 37893b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall 37909c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor // FIXME: What if we're calling something that isn't a function declaration? 37919c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor // FIXME: What if we're calling a pseudo-destructor? 37929c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor // FIXME: What if we're calling a member function? 37939c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 3794c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor typedef CodeCompleteConsumer::OverloadCandidate ResultCandidate; 37955f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<ResultCandidate, 8> Results; 3796c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor 37973b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall Expr *NakedFn = Fn->IgnoreParenCasts(); 37983b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(NakedFn)) 379913a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles AddOverloadedCallCandidates(ULE, Args, CandidateSet, 38003b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall /*PartialOverloading=*/ true); 38013b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall else if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(NakedFn)) { 38023b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall FunctionDecl *FDecl = dyn_cast<FunctionDecl>(DRE->getDecl()); 3803c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor if (FDecl) { 38044e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (!getLangOpts().CPlusPlus || 3805d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor !FDecl->getType()->getAs<FunctionProtoType>()) 3806c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor Results.push_back(ResultCandidate(FDecl)); 3807c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor else 380886820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall // FIXME: access? 380913a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles AddOverloadCandidate(FDecl, DeclAccessPair::make(FDecl, AS_none), Args, 381013a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles CandidateSet, false, /*PartialOverloading*/true); 3811c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor } 38123b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall } 38139c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 38145ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor QualType ParamType; 38155ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 3816c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor if (!CandidateSet.empty()) { 3817c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor // Sort the overload candidate set by placing the best overloads first. 3818c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor std::stable_sort(CandidateSet.begin(), CandidateSet.end(), 38195769d6195087229770d7ac90449443e026c47103John McCall IsBetterOverloadCandidate(*this, Loc)); 3820c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor 3821c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor // Add the remaining viable overload candidates as code-completion reslults. 3822c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor for (OverloadCandidateSet::iterator Cand = CandidateSet.begin(), 3823c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor CandEnd = CandidateSet.end(); 3824c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor Cand != CandEnd; ++Cand) { 3825c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor if (Cand->Viable) 3826c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor Results.push_back(ResultCandidate(Cand->Function)); 3827c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor } 38285ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 38295ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor // From the viable candidates, try to determine the type of this parameter. 38305ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor for (unsigned I = 0, N = Results.size(); I != N; ++I) { 38315ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (const FunctionType *FType = Results[I].getFunctionType()) 38325ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (const FunctionProtoType *Proto = dyn_cast<FunctionProtoType>(FType)) 383313a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles if (Args.size() < Proto->getNumArgs()) { 38345ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (ParamType.isNull()) 383513a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles ParamType = Proto->getArgType(Args.size()); 38365ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor else if (!Context.hasSameUnqualifiedType( 38375ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor ParamType.getNonReferenceType(), 383813a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles Proto->getArgType(Args.size()).getNonReferenceType())) { 38395ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor ParamType = QualType(); 38405ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor break; 38415ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor } 38425ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor } 38435ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor } 38445ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor } else { 38455ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor // Try to determine the parameter type from the type of the expression 38465ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor // being called. 38475ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor QualType FunctionType = Fn->getType(); 38485ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (const PointerType *Ptr = FunctionType->getAs<PointerType>()) 38495ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor FunctionType = Ptr->getPointeeType(); 38505ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor else if (const BlockPointerType *BlockPtr 38515ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor = FunctionType->getAs<BlockPointerType>()) 38525ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor FunctionType = BlockPtr->getPointeeType(); 38535ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor else if (const MemberPointerType *MemPtr 38545ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor = FunctionType->getAs<MemberPointerType>()) 38555ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor FunctionType = MemPtr->getPointeeType(); 38565ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 38575ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (const FunctionProtoType *Proto 38585ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor = FunctionType->getAs<FunctionProtoType>()) { 385913a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles if (Args.size() < Proto->getNumArgs()) 386013a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles ParamType = Proto->getArgType(Args.size()); 38615ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor } 38629c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor } 3863ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor 38645ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (ParamType.isNull()) 3865e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompleteOrdinaryName(S, PCC_Expression); 38665ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor else 38675ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor CodeCompleteExpression(S, ParamType); 38685ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 38692e4c7a5865739709a310d847da34096aa402d183Douglas Gregor if (!Results.empty()) 387013a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles CodeCompleter->ProcessOverloadCandidates(*this, Args.size(), Results.data(), 3871ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor Results.size()); 38729c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor} 38739c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 3874d226f65006733ed7f709c3174f22ce33391cb58fJohn McCallvoid Sema::CodeCompleteInitializer(Scope *S, Decl *D) { 3875d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall ValueDecl *VD = dyn_cast_or_null<ValueDecl>(D); 38765ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (!VD) { 3877e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompleteOrdinaryName(S, PCC_Expression); 38785ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor return; 38795ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor } 38805ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 38815ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor CodeCompleteExpression(S, VD->getType()); 38825ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor} 38835ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 38845ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregorvoid Sema::CodeCompleteReturn(Scope *S) { 38855ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor QualType ResultType; 38865ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (isa<BlockDecl>(CurContext)) { 38875ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (BlockScopeInfo *BSI = getCurBlock()) 38885ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor ResultType = BSI->ReturnType; 38895ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor } else if (FunctionDecl *Function = dyn_cast<FunctionDecl>(CurContext)) 38905ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor ResultType = Function->getResultType(); 38915ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor else if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(CurContext)) 38925ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor ResultType = Method->getResultType(); 38935ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 38945ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (ResultType.isNull()) 3895e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompleteOrdinaryName(S, PCC_Expression); 38965ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor else 38975ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor CodeCompleteExpression(S, ResultType); 38985ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor} 38995ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 3900d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregorvoid Sema::CodeCompleteAfterIf(Scope *S) { 3901d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor typedef CodeCompletionResult Result; 3902d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 390328a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 3904d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor mapCodeCompletionContext(*this, PCC_Statement)); 3905d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Results.setFilter(&ResultBuilder::IsOrdinaryName); 3906d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Results.EnterNewScope(); 3907d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor 3908d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 3909d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 3910d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor CodeCompleter->includeGlobals()); 3911d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor 3912d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor AddOrdinaryNameResults(PCC_Statement, S, *this, Results); 3913d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor 3914d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor // "else" block 391528a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Builder(Results.getAllocator(), 391628a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis Results.getCodeCompletionTUInfo()); 3917d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddTypedTextChunk("else"); 3918f11641a2c651e4e9733c5f5011993554d7c635e5Douglas Gregor if (Results.includeCodePatterns()) { 3919f11641a2c651e4e9733c5f5011993554d7c635e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 3920f11641a2c651e4e9733c5f5011993554d7c635e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 3921f11641a2c651e4e9733c5f5011993554d7c635e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 3922f11641a2c651e4e9733c5f5011993554d7c635e5Douglas Gregor Builder.AddPlaceholderChunk("statements"); 3923f11641a2c651e4e9733c5f5011993554d7c635e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 3924f11641a2c651e4e9733c5f5011993554d7c635e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 3925f11641a2c651e4e9733c5f5011993554d7c635e5Douglas Gregor } 3926d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Results.AddResult(Builder.TakeString()); 3927d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor 3928d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor // "else if" block 3929d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddTypedTextChunk("else"); 3930d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 3931d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddTextChunk("if"); 3932d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 3933d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 39344e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (getLangOpts().CPlusPlus) 3935d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddPlaceholderChunk("condition"); 3936d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor else 3937d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddPlaceholderChunk("expression"); 3938d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 3939f11641a2c651e4e9733c5f5011993554d7c635e5Douglas Gregor if (Results.includeCodePatterns()) { 3940f11641a2c651e4e9733c5f5011993554d7c635e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 3941f11641a2c651e4e9733c5f5011993554d7c635e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 3942f11641a2c651e4e9733c5f5011993554d7c635e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 3943f11641a2c651e4e9733c5f5011993554d7c635e5Douglas Gregor Builder.AddPlaceholderChunk("statements"); 3944f11641a2c651e4e9733c5f5011993554d7c635e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 3945f11641a2c651e4e9733c5f5011993554d7c635e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 3946f11641a2c651e4e9733c5f5011993554d7c635e5Douglas Gregor } 3947d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Results.AddResult(Builder.TakeString()); 3948d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor 3949d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Results.ExitScope(); 3950d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor 3951d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor if (S->getFnParent()) 39524e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie AddPrettyFunctionResults(PP.getLangOpts(), Results); 3953d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor 3954d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor if (CodeCompleter->includeMacros()) 3955d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor AddMacroResults(PP, Results); 3956d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor 3957d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 3958d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Results.data(),Results.size()); 3959d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor} 3960d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor 3961f81e5a9e3f3ff80c56e4afb4fe6311a8735f36e8Richard Trieuvoid Sema::CodeCompleteAssignmentRHS(Scope *S, Expr *LHS) { 39625ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (LHS) 39635ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor CodeCompleteExpression(S, static_cast<Expr *>(LHS)->getType()); 39645ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor else 3965e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompleteOrdinaryName(S, PCC_Expression); 39665ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor} 39675ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 39689ab14541716928894821cf5d53d6b4c95ffdf3a3Jeffrey Yasskinvoid Sema::CodeCompleteQualifiedId(Scope *S, CXXScopeSpec &SS, 396981b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor bool EnteringContext) { 397081b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor if (!SS.getScopeRep() || !CodeCompleter) 397181b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor return; 397281b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor 397386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor DeclContext *Ctx = computeDeclContext(SS, EnteringContext); 397486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!Ctx) 397586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return; 3976d1cd31aeb806077340be94e32429f3192cf139b0Douglas Gregor 3977d1cd31aeb806077340be94e32429f3192cf139b0Douglas Gregor // Try to instantiate any non-dependent declaration contexts before 3978d1cd31aeb806077340be94e32429f3192cf139b0Douglas Gregor // we look in them. 397977bb1aa78bcd26e42c0382043e65a2b03242be4dJohn McCall if (!isDependentScopeSpecifier(SS) && RequireCompleteDeclContext(SS, Ctx)) 3980d1cd31aeb806077340be94e32429f3192cf139b0Douglas Gregor return; 3981d1cd31aeb806077340be94e32429f3192cf139b0Douglas Gregor 3982218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 398328a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 3984218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Name); 3985f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor Results.EnterNewScope(); 398652779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor 398786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // The "template" keyword can follow "::" in the grammar, but only 398886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // put it into the grammar if the nested-name-specifier is dependent. 398986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NestedNameSpecifier *NNS = (NestedNameSpecifier *)SS.getScopeRep(); 399086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!Results.empty() && NNS->isDependent()) 3991a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult("template"); 3992f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor 3993f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor // Add calls to overridden virtual functions, if there are any. 3994f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor // 3995f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor // FIXME: This isn't wonderful, because we don't know whether we're actually 3996f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor // in a context that permits expressions. This is a general issue with 3997f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor // qualified-id completions. 3998f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor if (!EnteringContext) 3999f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor MaybeAddOverrideCalls(*this, Ctx, Results); 4000f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor Results.ExitScope(); 400186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 4002f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 4003f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor LookupVisibleDecls(Ctx, LookupOrdinaryName, Consumer); 4004f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor 4005e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 4006430d7a1a621a126a9ffe442ad8987ba02b46dae9Douglas Gregor Results.getCompletionContext(), 4007e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 400881b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor} 400949f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 401049f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregorvoid Sema::CodeCompleteUsing(Scope *S) { 401149f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor if (!CodeCompleter) 401249f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor return; 401349f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 4014218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 401528a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 401652779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor CodeCompletionContext::CCC_PotentiallyQualifiedName, 401752779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor &ResultBuilder::IsNestedNameSpecifier); 40188e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.EnterNewScope(); 401986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 402086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // If we aren't in class scope, we could see the "namespace" keyword. 402186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!S->isClassScope()) 40220a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall Results.AddResult(CodeCompletionResult("namespace")); 402386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 402486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // After "using", we can see anything that would start a 402586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // nested-name-specifier. 40265d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 40278071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 40288071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompleter->includeGlobals()); 40298e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.ExitScope(); 403086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 4031e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 403252779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor CodeCompletionContext::CCC_PotentiallyQualifiedName, 4033e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 403449f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor} 403549f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 403649f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregorvoid Sema::CodeCompleteUsingDirective(Scope *S) { 403749f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor if (!CodeCompleter) 403849f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor return; 403949f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 404086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // After "using namespace", we expect to see a namespace name or namespace 404186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // alias. 4042218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 404328a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 4044218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Namespace, 404552779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor &ResultBuilder::IsNamespaceOrAlias); 40468e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.EnterNewScope(); 40475d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 40488071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 40498071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompleter->includeGlobals()); 40508e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.ExitScope(); 4051e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 40528071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompletionContext::CCC_Namespace, 4053e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 405449f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor} 405549f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 405649f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregorvoid Sema::CodeCompleteNamespaceDecl(Scope *S) { 405749f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor if (!CodeCompleter) 405849f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor return; 405949f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 406086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor DeclContext *Ctx = (DeclContext *)S->getEntity(); 406186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!S->getParent()) 406286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Ctx = Context.getTranslationUnitDecl(); 406386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 406452779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor bool SuppressedGlobalResults 406552779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor = Ctx && !CodeCompleter->includeGlobals() && isa<TranslationUnitDecl>(Ctx); 406652779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor 4067218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 406828a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 406952779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor SuppressedGlobalResults 407052779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor ? CodeCompletionContext::CCC_Namespace 407152779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor : CodeCompletionContext::CCC_Other, 407252779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor &ResultBuilder::IsNamespace); 407352779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor 407452779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor if (Ctx && Ctx->isFileContext() && !SuppressedGlobalResults) { 407586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // We only want to see those namespaces that have already been defined 407686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // within this scope, because its likely that the user is creating an 407786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // extended namespace declaration. Keep track of the most recent 407886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // definition of each namespace. 407986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor std::map<NamespaceDecl *, NamespaceDecl *> OrigToLatest; 408086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor for (DeclContext::specific_decl_iterator<NamespaceDecl> 408186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NS(Ctx->decls_begin()), NSEnd(Ctx->decls_end()); 408286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NS != NSEnd; ++NS) 4083581deb3da481053c4993c7600f97acf7768caac5David Blaikie OrigToLatest[NS->getOriginalNamespace()] = *NS; 408486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 408586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add the most recent definition (or extended definition) of each 408686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // namespace to the list of results. 40878e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.EnterNewScope(); 408886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor for (std::map<NamespaceDecl *, NamespaceDecl *>::iterator 4089ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor NS = OrigToLatest.begin(), 4090ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor NSEnd = OrigToLatest.end(); 409186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NS != NSEnd; ++NS) 40920a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall Results.AddResult(CodeCompletionResult(NS->second, 0), 4093608300be1972c43fe99154d25d62d697e7c0a0c2Douglas Gregor CurContext, 0, false); 40948e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.ExitScope(); 409586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 409686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 4097e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 409852779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor Results.getCompletionContext(), 4099e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 410049f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor} 410149f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 410249f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregorvoid Sema::CodeCompleteNamespaceAliasDecl(Scope *S) { 410349f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor if (!CodeCompleter) 410449f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor return; 410549f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 410686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // After "namespace", we expect to see a namespace or alias. 4107218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 410828a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 4109218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Namespace, 411052779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor &ResultBuilder::IsNamespaceOrAlias); 41115d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 41128071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 41138071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompleter->includeGlobals()); 4114e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 411552779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor Results.getCompletionContext(), 4116e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 411749f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor} 411849f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 4119ed8d322b4086b8b1e1f78b21389cabb23457dcb3Douglas Gregorvoid Sema::CodeCompleteOperatorName(Scope *S) { 4120ed8d322b4086b8b1e1f78b21389cabb23457dcb3Douglas Gregor if (!CodeCompleter) 4121ed8d322b4086b8b1e1f78b21389cabb23457dcb3Douglas Gregor return; 412286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 41230a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 4124218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 412528a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 4126218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Type, 412752779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor &ResultBuilder::IsType); 41288e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.EnterNewScope(); 412986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 413086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add the names of overloadable operators. 413186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 413286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (std::strcmp(Spelling, "?")) \ 4133a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Spelling)); 413486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor#include "clang/Basic/OperatorKinds.def" 413586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 413686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add any type names visible from the current scope 413745bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor Results.allowNestedNameSpecifiers(); 41385d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 41398071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 41408071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompleter->includeGlobals()); 414186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 414286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add any type specifiers 41434e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie AddTypeSpecifierResults(getLangOpts(), Results); 41448e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.ExitScope(); 4145ed8d322b4086b8b1e1f78b21389cabb23457dcb3Douglas Gregor 4146e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 41478071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompletionContext::CCC_Type, 4148e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 4149c464ae8444edb6d07ea49b7a0eae1674c0fa1bb8Douglas Gregor} 4150c464ae8444edb6d07ea49b7a0eae1674c0fa1bb8Douglas Gregor 41510133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregorvoid Sema::CodeCompleteConstructorInitializer(Decl *ConstructorD, 4152cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt CXXCtorInitializer** Initializers, 41530133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor unsigned NumInitializers) { 41548987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor PrintingPolicy Policy = getCompletionPrintingPolicy(*this); 41550133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor CXXConstructorDecl *Constructor 41560133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor = static_cast<CXXConstructorDecl *>(ConstructorD); 41570133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor if (!Constructor) 41580133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor return; 41590133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor 4160218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 416128a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 416252779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor CodeCompletionContext::CCC_PotentiallyQualifiedName); 41630133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor Results.EnterNewScope(); 41640133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor 41650133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor // Fill in any already-initialized fields or base classes. 41660133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor llvm::SmallPtrSet<FieldDecl *, 4> InitializedFields; 41670133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor llvm::SmallPtrSet<CanQualType, 4> InitializedBases; 41680133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor for (unsigned I = 0; I != NumInitializers; ++I) { 41690133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor if (Initializers[I]->isBaseInitializer()) 41700133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor InitializedBases.insert( 41710133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor Context.getCanonicalType(QualType(Initializers[I]->getBaseClass(), 0))); 41720133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor else 417300eb3f9c5b33e3d99aee1f8b75dd9c9678fdd66bFrancois Pichet InitializedFields.insert(cast<FieldDecl>( 417400eb3f9c5b33e3d99aee1f8b75dd9c9678fdd66bFrancois Pichet Initializers[I]->getAnyMember())); 41750133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor } 41760133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor 41770133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor // Add completions for base classes. 417828a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Builder(Results.getAllocator(), 417928a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis Results.getCodeCompletionTUInfo()); 41800c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor bool SawLastInitializer = (NumInitializers == 0); 41810133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor CXXRecordDecl *ClassDecl = Constructor->getParent(); 41820133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor for (CXXRecordDecl::base_class_iterator Base = ClassDecl->bases_begin(), 41830133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor BaseEnd = ClassDecl->bases_end(); 41840133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor Base != BaseEnd; ++Base) { 41850c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor if (!InitializedBases.insert(Context.getCanonicalType(Base->getType()))) { 41860c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor SawLastInitializer 41870c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor = NumInitializers > 0 && 41880c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor Initializers[NumInitializers - 1]->isBaseInitializer() && 41890c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor Context.hasSameUnqualifiedType(Base->getType(), 41900c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor QualType(Initializers[NumInitializers - 1]->getBaseClass(), 0)); 41910133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor continue; 41920c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor } 41930133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor 4194218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk( 4195dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Results.getAllocator().CopyString( 4196f85e193739c953358c865005855253af4f68a497John McCall Base->getType().getAsString(Policy))); 4197218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4198218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("args"); 4199218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 4200218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(CodeCompletionResult(Builder.TakeString(), 42010c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor SawLastInitializer? CCP_NextInitializer 42020c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor : CCP_MemberDeclaration)); 42030c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor SawLastInitializer = false; 42040133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor } 42050133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor 42060133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor // Add completions for virtual base classes. 42070133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor for (CXXRecordDecl::base_class_iterator Base = ClassDecl->vbases_begin(), 42080133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor BaseEnd = ClassDecl->vbases_end(); 42090133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor Base != BaseEnd; ++Base) { 42100c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor if (!InitializedBases.insert(Context.getCanonicalType(Base->getType()))) { 42110c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor SawLastInitializer 42120c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor = NumInitializers > 0 && 42130c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor Initializers[NumInitializers - 1]->isBaseInitializer() && 42140c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor Context.hasSameUnqualifiedType(Base->getType(), 42150c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor QualType(Initializers[NumInitializers - 1]->getBaseClass(), 0)); 42160133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor continue; 42170c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor } 42180133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor 4219218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk( 4220dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.getAllocator().CopyString( 4221f85e193739c953358c865005855253af4f68a497John McCall Base->getType().getAsString(Policy))); 4222218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4223218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("args"); 4224218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 4225218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(CodeCompletionResult(Builder.TakeString(), 42260c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor SawLastInitializer? CCP_NextInitializer 42270c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor : CCP_MemberDeclaration)); 42280c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor SawLastInitializer = false; 42290133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor } 42300133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor 42310133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor // Add completions for members. 42320133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor for (CXXRecordDecl::field_iterator Field = ClassDecl->field_begin(), 42330133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor FieldEnd = ClassDecl->field_end(); 42340133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor Field != FieldEnd; ++Field) { 42350c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor if (!InitializedFields.insert(cast<FieldDecl>(Field->getCanonicalDecl()))) { 42360c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor SawLastInitializer 42370c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor = NumInitializers > 0 && 423800eb3f9c5b33e3d99aee1f8b75dd9c9678fdd66bFrancois Pichet Initializers[NumInitializers - 1]->isAnyMemberInitializer() && 4239581deb3da481053c4993c7600f97acf7768caac5David Blaikie Initializers[NumInitializers - 1]->getAnyMember() == *Field; 42400133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor continue; 42410c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor } 42420133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor 42430133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor if (!Field->getDeclName()) 42440133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor continue; 42450133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor 4246dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddTypedTextChunk(Builder.getAllocator().CopyString( 4247218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Field->getIdentifier()->getName())); 4248218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4249218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("args"); 4250218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 4251218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(CodeCompletionResult(Builder.TakeString(), 42520c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor SawLastInitializer? CCP_NextInitializer 4253a67e03fdf1ae8a1f92463a307d0b6281f1161f40Douglas Gregor : CCP_MemberDeclaration, 4254ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor CXCursor_MemberRef, 4255ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor CXAvailability_Available, 4256581deb3da481053c4993c7600f97acf7768caac5David Blaikie *Field)); 42570c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor SawLastInitializer = false; 42580133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor } 42590133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor Results.ExitScope(); 42600133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor 426152779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 42620133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor Results.data(), Results.size()); 42630133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor} 42640133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor 426581f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor/// \brief Determine whether this scope denotes a namespace. 426681f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregorstatic bool isNamespaceScope(Scope *S) { 426781f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor DeclContext *DC = static_cast<DeclContext *>(S->getEntity()); 426881f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor if (!DC) 426981f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor return false; 427081f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor 427181f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor return DC->isFileContext(); 427281f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor} 427381f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor 427481f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregorvoid Sema::CodeCompleteLambdaIntroducer(Scope *S, LambdaIntroducer &Intro, 427581f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor bool AfterAmpersand) { 427681f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 427728a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 427881f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor CodeCompletionContext::CCC_Other); 427981f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor Results.EnterNewScope(); 428081f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor 428181f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor // Note what has already been captured. 428281f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor llvm::SmallPtrSet<IdentifierInfo *, 4> Known; 428381f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor bool IncludedThis = false; 428481f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor for (SmallVectorImpl<LambdaCapture>::iterator C = Intro.Captures.begin(), 428581f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor CEnd = Intro.Captures.end(); 428681f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor C != CEnd; ++C) { 428781f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor if (C->Kind == LCK_This) { 428881f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor IncludedThis = true; 428981f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor continue; 429081f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor } 429181f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor 429281f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor Known.insert(C->Id); 429381f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor } 429481f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor 429581f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor // Look for other capturable variables. 429681f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor for (; S && !isNamespaceScope(S); S = S->getParent()) { 429781f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor for (Scope::decl_iterator D = S->decl_begin(), DEnd = S->decl_end(); 429881f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor D != DEnd; ++D) { 429981f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor VarDecl *Var = dyn_cast<VarDecl>(*D); 430081f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor if (!Var || 430181f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor !Var->hasLocalStorage() || 430281f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor Var->hasAttr<BlocksAttr>()) 430381f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor continue; 430481f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor 430581f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor if (Known.insert(Var->getIdentifier())) 430681f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor Results.AddResult(CodeCompletionResult(Var), CurContext, 0, false); 430781f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor } 430881f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor } 430981f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor 431081f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor // Add 'this', if it would be valid. 431181f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor if (!IncludedThis && !AfterAmpersand && Intro.Default != LCD_ByCopy) 431281f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor addThisCompletion(*this, Results); 431381f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor 431481f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor Results.ExitScope(); 431581f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor 431681f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 431781f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor Results.data(), Results.size()); 431881f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor} 431981f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor 4320a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett/// Macro that optionally prepends an "@" to the string literal passed in via 4321a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett/// Keyword, depending on whether NeedAt is true or false. 4322a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett#define OBJC_AT_KEYWORD_NAME(NeedAt,Keyword) ((NeedAt)? "@" Keyword : Keyword) 4323a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett 4324bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCImplementationResults(const LangOptions &LangOpts, 4325b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor ResultBuilder &Results, 4326b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor bool NeedAt) { 43270a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 4328b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // Since we have an implementation, we can end it. 4329a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,"end"))); 4330b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 433128a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Builder(Results.getAllocator(), 433228a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis Results.getCodeCompletionTUInfo()); 4333b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor if (LangOpts.ObjC2) { 4334b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @dynamic 4335a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"dynamic")); 4336218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4337218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("property"); 4338218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 4339b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 4340b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @synthesize 4341a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"synthesize")); 4342218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4343218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("property"); 4344218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 4345b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor } 4346b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor} 4347c464ae8444edb6d07ea49b7a0eae1674c0fa1bb8Douglas Gregor 4348bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCInterfaceResults(const LangOptions &LangOpts, 4349b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor ResultBuilder &Results, 4350b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor bool NeedAt) { 43510a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 4352b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 4353b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // Since we have an interface or protocol, we can end it. 4354a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,"end"))); 4355b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 4356b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor if (LangOpts.ObjC2) { 4357b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @property 4358a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,"property"))); 4359b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 4360b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @required 4361a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,"required"))); 4362b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 4363b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @optional 4364a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,"optional"))); 4365b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor } 4366b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor} 4367834389b87451b24618513b907b4dfb5b00d211f3Douglas Gregor 4368bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCTopLevelResults(ResultBuilder &Results, bool NeedAt) { 43690a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 437028a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Builder(Results.getAllocator(), 437128a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis Results.getCodeCompletionTUInfo()); 4372b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 4373b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @class name ; 4374a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"class")); 4375218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4376218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("name"); 4377218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 4378b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 4379c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor if (Results.includeCodePatterns()) { 4380c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // @interface name 4381c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // FIXME: Could introduce the whole pattern, including superclasses and 4382c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // such. 4383a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"interface")); 4384218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4385218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("class"); 4386218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 4387b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 4388c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // @protocol name 4389a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"protocol")); 4390218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4391218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("protocol"); 4392218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 4393c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor 4394c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // @implementation name 4395a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"implementation")); 4396218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4397218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("class"); 4398218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 4399c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor } 4400b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 4401b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @compatibility_alias name 4402a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"compatibility_alias")); 4403218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4404218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("alias"); 4405218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4406218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("class"); 4407218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 4408b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor} 4409834389b87451b24618513b907b4dfb5b00d211f3Douglas Gregor 4410a28948f34817476d02412fa204cae038e228c827Fariborz Jahanianvoid Sema::CodeCompleteObjCAtDirective(Scope *S) { 44110a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 4412218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 441328a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 4414218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 4415b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Results.EnterNewScope(); 4416a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian if (isa<ObjCImplDecl>(CurContext)) 44174e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie AddObjCImplementationResults(getLangOpts(), Results, false); 4418a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian else if (CurContext->isObjCContainer()) 44194e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie AddObjCInterfaceResults(getLangOpts(), Results, false); 4420b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor else 4421bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCTopLevelResults(Results, false); 4422c464ae8444edb6d07ea49b7a0eae1674c0fa1bb8Douglas Gregor Results.ExitScope(); 4423e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 4424e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 4425e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 44269a0c85e640a08174569a303db22981612f05d385Douglas Gregor} 44279a0c85e640a08174569a303db22981612f05d385Douglas Gregor 4428bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCExpressionResults(ResultBuilder &Results, bool NeedAt) { 44290a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 443028a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Builder(Results.getAllocator(), 443128a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis Results.getCodeCompletionTUInfo()); 44329a0c85e640a08174569a303db22981612f05d385Douglas Gregor 44339a0c85e640a08174569a303db22981612f05d385Douglas Gregor // @encode ( type-name ) 44348ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor const char *EncodeType = "char[]"; 44354e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (Results.getSema().getLangOpts().CPlusPlus || 44364e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie Results.getSema().getLangOpts().ConstStrings) 44371f6e22d14419db7162202854190f690f393daf2dJordan Rose EncodeType = "const char[]"; 44388ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk(EncodeType); 4439a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"encode")); 4440218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4441218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("type-name"); 4442218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 4443218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 44449a0c85e640a08174569a303db22981612f05d385Douglas Gregor 44459a0c85e640a08174569a303db22981612f05d385Douglas Gregor // @protocol ( protocol-name ) 44468ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("Protocol *"); 4447a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"protocol")); 4448218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4449218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("protocol-name"); 4450218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 4451218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 44529a0c85e640a08174569a303db22981612f05d385Douglas Gregor 44539a0c85e640a08174569a303db22981612f05d385Douglas Gregor // @selector ( selector ) 44548ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("SEL"); 4455a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"selector")); 4456218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4457218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("selector"); 4458218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 4459218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 44601f6e22d14419db7162202854190f690f393daf2dJordan Rose 44611f6e22d14419db7162202854190f690f393daf2dJordan Rose // @"string" 44621f6e22d14419db7162202854190f690f393daf2dJordan Rose Builder.AddResultTypeChunk("NSString *"); 44631f6e22d14419db7162202854190f690f393daf2dJordan Rose Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"\"")); 44641f6e22d14419db7162202854190f690f393daf2dJordan Rose Builder.AddPlaceholderChunk("string"); 44651f6e22d14419db7162202854190f690f393daf2dJordan Rose Builder.AddTextChunk("\""); 44661f6e22d14419db7162202854190f690f393daf2dJordan Rose Results.AddResult(Result(Builder.TakeString())); 44671f6e22d14419db7162202854190f690f393daf2dJordan Rose 4468796158971bda18cf4af237c46769914cfa7276b7Douglas Gregor // @[objects, ...] 44691f6e22d14419db7162202854190f690f393daf2dJordan Rose Builder.AddResultTypeChunk("NSArray *"); 4470a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"[")); 4471ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek Builder.AddPlaceholderChunk("objects, ..."); 4472ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek Builder.AddChunk(CodeCompletionString::CK_RightBracket); 4473ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek Results.AddResult(Result(Builder.TakeString())); 4474ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek 4475796158971bda18cf4af237c46769914cfa7276b7Douglas Gregor // @{key : object, ...} 44761f6e22d14419db7162202854190f690f393daf2dJordan Rose Builder.AddResultTypeChunk("NSDictionary *"); 4477a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"{")); 4478ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek Builder.AddPlaceholderChunk("key"); 4479ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4480ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek Builder.AddChunk(CodeCompletionString::CK_Colon); 4481ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4482ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek Builder.AddPlaceholderChunk("object, ..."); 4483ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek Builder.AddChunk(CodeCompletionString::CK_RightBrace); 4484ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek Results.AddResult(Result(Builder.TakeString())); 44851f6e22d14419db7162202854190f690f393daf2dJordan Rose 4486796158971bda18cf4af237c46769914cfa7276b7Douglas Gregor // @(expression) 44871f6e22d14419db7162202854190f690f393daf2dJordan Rose Builder.AddResultTypeChunk("id"); 44881f6e22d14419db7162202854190f690f393daf2dJordan Rose Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "(")); 44891f6e22d14419db7162202854190f690f393daf2dJordan Rose Builder.AddPlaceholderChunk("expression"); 44901f6e22d14419db7162202854190f690f393daf2dJordan Rose Builder.AddChunk(CodeCompletionString::CK_RightParen); 44911f6e22d14419db7162202854190f690f393daf2dJordan Rose Results.AddResult(Result(Builder.TakeString())); 44929a0c85e640a08174569a303db22981612f05d385Douglas Gregor} 44939a0c85e640a08174569a303db22981612f05d385Douglas Gregor 4494bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCStatementResults(ResultBuilder &Results, bool NeedAt) { 44950a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 449628a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Builder(Results.getAllocator(), 449728a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis Results.getCodeCompletionTUInfo()); 4498b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 4499c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor if (Results.includeCodePatterns()) { 4500c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // @try { statements } @catch ( declaration ) { statements } @finally 4501c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // { statements } 4502a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"try")); 4503218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 4504218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("statements"); 4505218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 4506218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("@catch"); 4507218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4508218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("parameter"); 4509218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 4510218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 4511218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("statements"); 4512218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 4513218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("@finally"); 4514218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 4515218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("statements"); 4516218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 4517218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 4518c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor } 4519b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 45209a0c85e640a08174569a303db22981612f05d385Douglas Gregor // @throw 4521a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"throw")); 4522218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4523218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 4524218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 4525b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 4526c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor if (Results.includeCodePatterns()) { 4527c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // @synchronized ( expression ) { statements } 4528a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"synchronized")); 4529218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4530218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4531218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 4532218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 4533218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 4534218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("statements"); 4535218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 4536218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 4537c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor } 4538b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor} 45399a0c85e640a08174569a303db22981612f05d385Douglas Gregor 4540bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCVisibilityResults(const LangOptions &LangOpts, 4541c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor ResultBuilder &Results, 4542c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor bool NeedAt) { 45430a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 4544a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,"private"))); 4545a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,"protected"))); 4546a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,"public"))); 4547c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor if (LangOpts.ObjC2) 4548a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,"package"))); 4549c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor} 4550c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor 4551c38c3e1e726630458154534227d74eda833d26a0Douglas Gregorvoid Sema::CodeCompleteObjCAtVisibility(Scope *S) { 4552218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 455328a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 4554218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 4555c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor Results.EnterNewScope(); 45564e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie AddObjCVisibilityResults(getLangOpts(), Results, false); 4557c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor Results.ExitScope(); 4558e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 4559e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 4560e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 4561c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor} 4562c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor 4563c38c3e1e726630458154534227d74eda833d26a0Douglas Gregorvoid Sema::CodeCompleteObjCAtStatement(Scope *S) { 4564218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 456528a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 4566218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 4567b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Results.EnterNewScope(); 4568bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCStatementResults(Results, false); 4569bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCExpressionResults(Results, false); 45709a0c85e640a08174569a303db22981612f05d385Douglas Gregor Results.ExitScope(); 4571e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 4572e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 4573e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 45749a0c85e640a08174569a303db22981612f05d385Douglas Gregor} 45759a0c85e640a08174569a303db22981612f05d385Douglas Gregor 45769a0c85e640a08174569a303db22981612f05d385Douglas Gregorvoid Sema::CodeCompleteObjCAtExpression(Scope *S) { 4577218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 457828a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 4579218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 45809a0c85e640a08174569a303db22981612f05d385Douglas Gregor Results.EnterNewScope(); 4581bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCExpressionResults(Results, false); 45829a0c85e640a08174569a303db22981612f05d385Douglas Gregor Results.ExitScope(); 4583e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 4584e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 4585e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 4586ed8d322b4086b8b1e1f78b21389cabb23457dcb3Douglas Gregor} 458749f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 4588988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor/// \brief Determine whether the addition of the given flag to an Objective-C 4589988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor/// property's attributes will cause a conflict. 4590988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregorstatic bool ObjCPropertyFlagConflicts(unsigned Attributes, unsigned NewFlag) { 4591988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor // Check if we've already added this flag. 4592988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (Attributes & NewFlag) 4593988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor return true; 4594988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor 4595988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor Attributes |= NewFlag; 4596988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor 4597988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor // Check for collisions with "readonly". 4598988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if ((Attributes & ObjCDeclSpec::DQ_PR_readonly) && 4599988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor (Attributes & (ObjCDeclSpec::DQ_PR_readwrite | 4600988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor ObjCDeclSpec::DQ_PR_assign | 4601f85e193739c953358c865005855253af4f68a497John McCall ObjCDeclSpec::DQ_PR_unsafe_unretained | 4602988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor ObjCDeclSpec::DQ_PR_copy | 4603f85e193739c953358c865005855253af4f68a497John McCall ObjCDeclSpec::DQ_PR_retain | 4604f85e193739c953358c865005855253af4f68a497John McCall ObjCDeclSpec::DQ_PR_strong))) 4605988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor return true; 4606988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor 4607f85e193739c953358c865005855253af4f68a497John McCall // Check for more than one of { assign, copy, retain, strong }. 4608988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor unsigned AssignCopyRetMask = Attributes & (ObjCDeclSpec::DQ_PR_assign | 4609f85e193739c953358c865005855253af4f68a497John McCall ObjCDeclSpec::DQ_PR_unsafe_unretained | 4610988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor ObjCDeclSpec::DQ_PR_copy | 4611f85e193739c953358c865005855253af4f68a497John McCall ObjCDeclSpec::DQ_PR_retain| 4612f85e193739c953358c865005855253af4f68a497John McCall ObjCDeclSpec::DQ_PR_strong); 4613988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (AssignCopyRetMask && 4614988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor AssignCopyRetMask != ObjCDeclSpec::DQ_PR_assign && 4615f85e193739c953358c865005855253af4f68a497John McCall AssignCopyRetMask != ObjCDeclSpec::DQ_PR_unsafe_unretained && 4616988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor AssignCopyRetMask != ObjCDeclSpec::DQ_PR_copy && 4617f85e193739c953358c865005855253af4f68a497John McCall AssignCopyRetMask != ObjCDeclSpec::DQ_PR_retain && 4618f85e193739c953358c865005855253af4f68a497John McCall AssignCopyRetMask != ObjCDeclSpec::DQ_PR_strong) 4619988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor return true; 4620988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor 4621988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor return false; 4622988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor} 4623988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor 4624a93b108e025ef2480fa867cc533e7781a40a639bDouglas Gregorvoid Sema::CodeCompleteObjCPropertyFlags(Scope *S, ObjCDeclSpec &ODS) { 4625ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff if (!CodeCompleter) 4626ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff return; 4627d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor 4628ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff unsigned Attributes = ODS.getPropertyAttributes(); 4629ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff 46300a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 4631218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 463228a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 4633218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 4634ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff Results.EnterNewScope(); 4635988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_readonly)) 46360a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall Results.AddResult(CodeCompletionResult("readonly")); 4637988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_assign)) 46380a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall Results.AddResult(CodeCompletionResult("assign")); 4639f85e193739c953358c865005855253af4f68a497John McCall if (!ObjCPropertyFlagConflicts(Attributes, 4640f85e193739c953358c865005855253af4f68a497John McCall ObjCDeclSpec::DQ_PR_unsafe_unretained)) 4641f85e193739c953358c865005855253af4f68a497John McCall Results.AddResult(CodeCompletionResult("unsafe_unretained")); 4642988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_readwrite)) 46430a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall Results.AddResult(CodeCompletionResult("readwrite")); 4644988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_retain)) 46450a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall Results.AddResult(CodeCompletionResult("retain")); 4646f85e193739c953358c865005855253af4f68a497John McCall if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_strong)) 4647f85e193739c953358c865005855253af4f68a497John McCall Results.AddResult(CodeCompletionResult("strong")); 4648988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_copy)) 46490a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall Results.AddResult(CodeCompletionResult("copy")); 4650988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_nonatomic)) 46510a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall Results.AddResult(CodeCompletionResult("nonatomic")); 465227f45236005d9dd2bbbfeb1682eb349cb8b6998bFariborz Jahanian if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_atomic)) 465327f45236005d9dd2bbbfeb1682eb349cb8b6998bFariborz Jahanian Results.AddResult(CodeCompletionResult("atomic")); 4654988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_setter)) { 465528a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Setter(Results.getAllocator(), 465628a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis Results.getCodeCompletionTUInfo()); 4657218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Setter.AddTypedTextChunk("setter"); 4658218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Setter.AddTextChunk(" = "); 4659218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Setter.AddPlaceholderChunk("method"); 4660218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(CodeCompletionResult(Setter.TakeString())); 466154f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor } 4662988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_getter)) { 466328a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Getter(Results.getAllocator(), 466428a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis Results.getCodeCompletionTUInfo()); 4665218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Getter.AddTypedTextChunk("getter"); 4666218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Getter.AddTextChunk(" = "); 4667218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Getter.AddPlaceholderChunk("method"); 4668218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(CodeCompletionResult(Getter.TakeString())); 466954f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor } 4670ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff Results.ExitScope(); 4671e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 4672e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 4673e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 4674ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff} 4675c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff 4676de23c7e9069b2ea2cd2633efd9566546e2c68926James Dennett/// \brief Describes the kind of Objective-C method that we want to find 46774ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor/// via code completion. 46784ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregorenum ObjCMethodKind { 467949fdccb4595862828aa5cadc1497d466a8031ddaDmitri Gribenko MK_Any, ///< Any kind of method, provided it means other specified criteria. 468049fdccb4595862828aa5cadc1497d466a8031ddaDmitri Gribenko MK_ZeroArgSelector, ///< Zero-argument (unary) selector. 468149fdccb4595862828aa5cadc1497d466a8031ddaDmitri Gribenko MK_OneArgSelector ///< One-argument selector. 46824ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor}; 46834ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 4684458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregorstatic bool isAcceptableObjCSelector(Selector Sel, 4685458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor ObjCMethodKind WantKind, 4686458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor IdentifierInfo **SelIdents, 4687cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor unsigned NumSelIdents, 4688cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor bool AllowSameLength = true) { 46894ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (NumSelIdents > Sel.getNumArgs()) 46904ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor return false; 4691458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor 46924ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor switch (WantKind) { 4693458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor case MK_Any: break; 4694458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor case MK_ZeroArgSelector: return Sel.isUnarySelector(); 4695458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor case MK_OneArgSelector: return Sel.getNumArgs() == 1; 46964ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor } 4697458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor 4698cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor if (!AllowSameLength && NumSelIdents && NumSelIdents == Sel.getNumArgs()) 4699cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor return false; 4700cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor 47014ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor for (unsigned I = 0; I != NumSelIdents; ++I) 47024ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (SelIdents[I] != Sel.getIdentifierInfoForSlot(I)) 47034ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor return false; 4704458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor 47054ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor return true; 47064ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor} 4707458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor 4708458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregorstatic bool isAcceptableObjCMethod(ObjCMethodDecl *Method, 4709458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor ObjCMethodKind WantKind, 4710458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor IdentifierInfo **SelIdents, 4711cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor unsigned NumSelIdents, 4712cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor bool AllowSameLength = true) { 4713458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor return isAcceptableObjCSelector(Method->getSelector(), WantKind, SelIdents, 4714cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor NumSelIdents, AllowSameLength); 4715458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor} 4716d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor 4717d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregornamespace { 4718d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor /// \brief A set of selectors, which is used to avoid introducing multiple 4719d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor /// completions with the same selector into the result set. 4720d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor typedef llvm::SmallPtrSet<Selector, 16> VisitedSelectorSet; 4721d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor} 4722d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor 472336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// \brief Add all of the Objective-C methods in the given Objective-C 472436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// container to the set of results. 472536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// 472636ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// The container will be a class, protocol, category, or implementation of 472736ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// any of the above. This mether will recurse to include methods from 472836ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// the superclasses of classes along with their categories, protocols, and 472936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// implementations. 473036ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// 473136ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// \param Container the container in which we'll look to find methods. 473236ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// 4733a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett/// \param WantInstanceMethods Whether to add instance methods (only); if 4734a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett/// false, this routine will add factory methods (only). 473536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// 473636ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// \param CurContext the context in which we're performing the lookup that 473736ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// finds methods. 473836ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// 4739cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor/// \param AllowSameLength Whether we allow a method to be added to the list 4740cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor/// when it has the same number of parameters as we have selector identifiers. 4741cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor/// 474236ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// \param Results the structure into which we'll add results. 474336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregorstatic void AddObjCMethods(ObjCContainerDecl *Container, 474436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor bool WantInstanceMethods, 47454ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor ObjCMethodKind WantKind, 4746d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor IdentifierInfo **SelIdents, 4747d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor unsigned NumSelIdents, 474836ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor DeclContext *CurContext, 4749d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor VisitedSelectorSet &Selectors, 4750cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor bool AllowSameLength, 4751408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor ResultBuilder &Results, 4752408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor bool InOriginalClass = true) { 47530a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 4754b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor Container = getContainerDef(Container); 475536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor for (ObjCContainerDecl::method_iterator M = Container->meth_begin(), 475636ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor MEnd = Container->meth_end(); 475736ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor M != MEnd; ++M) { 4758262bc18e32500558af7cb0afa205b34bd37bafedDavid Blaikie if (M->isInstanceMethod() == WantInstanceMethods) { 4759d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor // Check whether the selector identifiers we've been given are a 4760d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor // subset of the identifiers for this particular method. 4761581deb3da481053c4993c7600f97acf7768caac5David Blaikie if (!isAcceptableObjCMethod(*M, WantKind, SelIdents, NumSelIdents, 4762cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor AllowSameLength)) 4763d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor continue; 47644ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 4765262bc18e32500558af7cb0afa205b34bd37bafedDavid Blaikie if (!Selectors.insert(M->getSelector())) 4766d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor continue; 4767d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor 4768581deb3da481053c4993c7600f97acf7768caac5David Blaikie Result R = Result(*M, 0); 4769d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor R.StartParameter = NumSelIdents; 47704ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor R.AllParametersAreInformative = (WantKind != MK_Any); 4771408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor if (!InOriginalClass) 4772408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor R.Priority += CCD_InBaseClass; 4773d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor Results.MaybeAddResult(R, CurContext); 4774d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor } 477536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor } 477636ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 4777e396c7bd99ed99fd8136fadc8945791754c61b16Douglas Gregor // Visit the protocols of protocols. 4778e396c7bd99ed99fd8136fadc8945791754c61b16Douglas Gregor if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) { 47795e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor if (Protocol->hasDefinition()) { 47805e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor const ObjCList<ObjCProtocolDecl> &Protocols 47815e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor = Protocol->getReferencedProtocols(); 47825e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 47835e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor E = Protocols.end(); 47845e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor I != E; ++I) 47855e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents, 47865e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor NumSelIdents, CurContext, Selectors, AllowSameLength, 47875e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor Results, false); 47885e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor } 4789e396c7bd99ed99fd8136fadc8945791754c61b16Douglas Gregor } 4790e396c7bd99ed99fd8136fadc8945791754c61b16Douglas Gregor 479136ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container); 47922e5c15be82f362611c5928ce853d0685ff98c766Douglas Gregor if (!IFace || !IFace->hasDefinition()) 479336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor return; 479436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 479536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add methods in protocols. 4796a5f4441de7890953460d95f4e88b9fa432b48dc2Argyrios Kyrtzidis for (ObjCInterfaceDecl::protocol_iterator I = IFace->protocol_begin(), 4797a5f4441de7890953460d95f4e88b9fa432b48dc2Argyrios Kyrtzidis E = IFace->protocol_end(); 479836ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor I != E; ++I) 47994ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents, NumSelIdents, 4800cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor CurContext, Selectors, AllowSameLength, Results, false); 480136ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 480236ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add methods in categories. 480336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor for (ObjCCategoryDecl *CatDecl = IFace->getCategoryList(); CatDecl; 480436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor CatDecl = CatDecl->getNextClassCategory()) { 48054ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(CatDecl, WantInstanceMethods, WantKind, SelIdents, 4806cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor NumSelIdents, CurContext, Selectors, AllowSameLength, 4807cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor Results, InOriginalClass); 480836ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 480936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add a categories protocol methods. 481036ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor const ObjCList<ObjCProtocolDecl> &Protocols 481136ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor = CatDecl->getReferencedProtocols(); 481236ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 481336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor E = Protocols.end(); 481436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor I != E; ++I) 48154ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents, 4816cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor NumSelIdents, CurContext, Selectors, AllowSameLength, 4817cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor Results, false); 481836ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 481936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add methods in category implementations. 482036ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor if (ObjCCategoryImplDecl *Impl = CatDecl->getImplementation()) 48214ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(Impl, WantInstanceMethods, WantKind, SelIdents, 4822cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor NumSelIdents, CurContext, Selectors, AllowSameLength, 4823cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor Results, InOriginalClass); 482436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor } 482536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 482636ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add methods in superclass. 482736ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor if (IFace->getSuperClass()) 48284ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(IFace->getSuperClass(), WantInstanceMethods, WantKind, 4829cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor SelIdents, NumSelIdents, CurContext, Selectors, 4830cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor AllowSameLength, Results, false); 483136ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 483236ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add methods in our implementation, if any. 483336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor if (ObjCImplementationDecl *Impl = IFace->getImplementation()) 48344ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(Impl, WantInstanceMethods, WantKind, SelIdents, 4835cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor NumSelIdents, CurContext, Selectors, AllowSameLength, 4836cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor Results, InOriginalClass); 48374ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor} 48384ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 48394ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 4840a28948f34817476d02412fa204cae038e228c827Fariborz Jahanianvoid Sema::CodeCompleteObjCPropertyGetter(Scope *S) { 48410a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 48424ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 48434ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor // Try to find the interface where getters might live. 4844a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurContext); 48454ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (!Class) { 48464ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (ObjCCategoryDecl *Category 4847a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian = dyn_cast_or_null<ObjCCategoryDecl>(CurContext)) 48484ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Class = Category->getClassInterface(); 48494ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 48504ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (!Class) 48514ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor return; 48524ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor } 48534ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 48544ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor // Find all of the potential getters. 4855218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 485628a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 4857218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 48584ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Results.EnterNewScope(); 48594ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 4860d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor VisitedSelectorSet Selectors; 4861d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor AddObjCMethods(Class, true, MK_ZeroArgSelector, 0, 0, CurContext, Selectors, 4862cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor /*AllowSameLength=*/true, Results); 48634ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Results.ExitScope(); 4864e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 4865e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 4866e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 48674ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor} 48684ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 4869a28948f34817476d02412fa204cae038e228c827Fariborz Jahanianvoid Sema::CodeCompleteObjCPropertySetter(Scope *S) { 48700a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 48714ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 48724ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor // Try to find the interface where setters might live. 48734ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor ObjCInterfaceDecl *Class 4874a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian = dyn_cast_or_null<ObjCInterfaceDecl>(CurContext); 48754ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (!Class) { 48764ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (ObjCCategoryDecl *Category 4877a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian = dyn_cast_or_null<ObjCCategoryDecl>(CurContext)) 48784ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Class = Category->getClassInterface(); 48794ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 48804ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (!Class) 48814ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor return; 48824ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor } 48834ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 48844ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor // Find all of the potential getters. 4885218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 488628a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 4887218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 48884ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Results.EnterNewScope(); 48894ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 4890d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor VisitedSelectorSet Selectors; 4891d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor AddObjCMethods(Class, true, MK_OneArgSelector, 0, 0, CurContext, 4892cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor Selectors, /*AllowSameLength=*/true, Results); 48934ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 48944ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Results.ExitScope(); 4895e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 4896e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 4897e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 489836ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor} 489936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 4900afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregorvoid Sema::CodeCompleteObjCPassingType(Scope *S, ObjCDeclSpec &DS, 4901afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor bool IsParameter) { 49020a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 4903218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 490428a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 4905218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Type); 4906d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor Results.EnterNewScope(); 4907d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor 4908d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor // Add context-sensitive, Objective-C parameter-passing keywords. 4909d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor bool AddedInOut = false; 4910d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor if ((DS.getObjCDeclQualifier() & 4911d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor (ObjCDeclSpec::DQ_In | ObjCDeclSpec::DQ_Inout)) == 0) { 4912d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor Results.AddResult("in"); 4913d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor Results.AddResult("inout"); 4914d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor AddedInOut = true; 4915d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor } 4916d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor if ((DS.getObjCDeclQualifier() & 4917d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor (ObjCDeclSpec::DQ_Out | ObjCDeclSpec::DQ_Inout)) == 0) { 4918d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor Results.AddResult("out"); 4919d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor if (!AddedInOut) 4920d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor Results.AddResult("inout"); 4921d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor } 4922d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor if ((DS.getObjCDeclQualifier() & 4923d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor (ObjCDeclSpec::DQ_Bycopy | ObjCDeclSpec::DQ_Byref | 4924d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor ObjCDeclSpec::DQ_Oneway)) == 0) { 4925d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor Results.AddResult("bycopy"); 4926d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor Results.AddResult("byref"); 4927d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor Results.AddResult("oneway"); 4928d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor } 4929d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor 4930afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor // If we're completing the return type of an Objective-C method and the 4931afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor // identifier IBAction refers to a macro, provide a completion item for 4932afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor // an action, e.g., 4933afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor // IBAction)<#selector#>:(id)sender 4934afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor if (DS.getObjCDeclQualifier() == 0 && !IsParameter && 4935afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor Context.Idents.get("IBAction").hasMacroDefinition()) { 493628a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Builder(Results.getAllocator(), 493728a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis Results.getCodeCompletionTUInfo(), 493828a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CCP_CodePattern, CXAvailability_Available); 4939afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor Builder.AddTypedTextChunk("IBAction"); 49401eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Builder.AddChunk(CodeCompletionString::CK_RightParen); 4941afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor Builder.AddPlaceholderChunk("selector"); 49421eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Builder.AddChunk(CodeCompletionString::CK_Colon); 49431eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4944afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor Builder.AddTextChunk("id"); 49451eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Builder.AddChunk(CodeCompletionString::CK_RightParen); 4946afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor Builder.AddTextChunk("sender"); 4947afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor Results.AddResult(CodeCompletionResult(Builder.TakeString())); 4948afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor } 4949afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor 4950d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor // Add various builtin type names and specifiers. 4951d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor AddOrdinaryNameResults(PCC_Type, S, *this, Results); 4952d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor Results.ExitScope(); 4953d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor 4954d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor // Add the various type names 4955d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor Results.setFilter(&ResultBuilder::IsOrdinaryNonValueName); 4956d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 4957d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 4958d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor CodeCompleter->includeGlobals()); 4959d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor 4960d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor if (CodeCompleter->includeMacros()) 4961d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor AddMacroResults(PP, Results); 4962d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor 4963d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 4964d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor CodeCompletionContext::CCC_Type, 4965d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor Results.data(), Results.size()); 4966d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor} 4967d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor 496822f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor/// \brief When we have an expression with type "id", we may assume 496922f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor/// that it has some more-specific class type based on knowledge of 497022f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor/// common uses of Objective-C. This routine returns that class type, 497122f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor/// or NULL if no better result could be determined. 497222f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregorstatic ObjCInterfaceDecl *GetAssumedMessageSendExprType(Expr *E) { 497378edf515544f0b9dddf69d6c1678fd83e94d8352Douglas Gregor ObjCMessageExpr *Msg = dyn_cast_or_null<ObjCMessageExpr>(E); 497422f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor if (!Msg) 497522f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor return 0; 497622f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor 497722f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor Selector Sel = Msg->getSelector(); 497822f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor if (Sel.isNull()) 497922f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor return 0; 498022f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor 498122f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor IdentifierInfo *Id = Sel.getIdentifierInfoForSlot(0); 498222f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor if (!Id) 498322f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor return 0; 498422f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor 498522f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor ObjCMethodDecl *Method = Msg->getMethodDecl(); 498622f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor if (!Method) 498722f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor return 0; 498822f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor 498922f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor // Determine the class that we're sending the message to. 499004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor ObjCInterfaceDecl *IFace = 0; 499104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor switch (Msg->getReceiverKind()) { 499204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor case ObjCMessageExpr::Class: 4993c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (const ObjCObjectType *ObjType 4994c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall = Msg->getClassReceiver()->getAs<ObjCObjectType>()) 4995c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall IFace = ObjType->getInterface(); 499604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor break; 499704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor 499804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor case ObjCMessageExpr::Instance: { 499904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor QualType T = Msg->getInstanceReceiver()->getType(); 500004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor if (const ObjCObjectPointerType *Ptr = T->getAs<ObjCObjectPointerType>()) 500104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor IFace = Ptr->getInterfaceDecl(); 500204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor break; 500304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor } 500404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor 500504badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor case ObjCMessageExpr::SuperInstance: 500604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor case ObjCMessageExpr::SuperClass: 500704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor break; 500822f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor } 500922f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor 501022f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor if (!IFace) 501122f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor return 0; 501222f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor 501322f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor ObjCInterfaceDecl *Super = IFace->getSuperClass(); 501422f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor if (Method->isInstanceMethod()) 501522f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor return llvm::StringSwitch<ObjCInterfaceDecl *>(Id->getName()) 501622f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("retain", IFace) 5017f85e193739c953358c865005855253af4f68a497John McCall .Case("strong", IFace) 501822f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("autorelease", IFace) 501922f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("copy", IFace) 502022f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("copyWithZone", IFace) 502122f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("mutableCopy", IFace) 502222f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("mutableCopyWithZone", IFace) 502322f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("awakeFromCoder", IFace) 502422f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("replacementObjectFromCoder", IFace) 502522f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("class", IFace) 502622f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("classForCoder", IFace) 502722f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("superclass", Super) 502822f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Default(0); 502922f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor 503022f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor return llvm::StringSwitch<ObjCInterfaceDecl *>(Id->getName()) 503122f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("new", IFace) 503222f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("alloc", IFace) 503322f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("allocWithZone", IFace) 503422f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("class", IFace) 503522f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("superclass", Super) 503622f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Default(0); 503722f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor} 503822f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor 503903d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor// Add a special completion for a message send to "super", which fills in the 504003d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor// most likely case of forwarding all of our arguments to the superclass 504103d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor// function. 504203d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// 504303d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// \param S The semantic analysis object. 504403d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// 504503d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// \param S NeedSuperKeyword Whether we need to prefix this completion with 504603d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// the "super" keyword. Otherwise, we just need to provide the arguments. 504703d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// 504803d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// \param SelIdents The identifiers in the selector that have already been 504903d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// provided as arguments for a send to "super". 505003d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// 505103d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// \param NumSelIdents The number of identifiers in \p SelIdents. 505203d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// 505303d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// \param Results The set of results to augment. 505403d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// 505503d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// \returns the Objective-C method declaration that would be invoked by 505603d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// this "super" completion. If NULL, no completion was added. 505703d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregorstatic ObjCMethodDecl *AddSuperSendCompletion(Sema &S, bool NeedSuperKeyword, 505803d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor IdentifierInfo **SelIdents, 505903d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor unsigned NumSelIdents, 506003d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor ResultBuilder &Results) { 506103d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor ObjCMethodDecl *CurMethod = S.getCurMethodDecl(); 506203d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (!CurMethod) 506303d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor return 0; 506403d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 506503d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor ObjCInterfaceDecl *Class = CurMethod->getClassInterface(); 506603d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (!Class) 506703d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor return 0; 506803d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 506903d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor // Try to find a superclass method with the same selector. 507003d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor ObjCMethodDecl *SuperMethod = 0; 507178bcd9139f4b35be75190446c95614120d9b4c09Douglas Gregor while ((Class = Class->getSuperClass()) && !SuperMethod) { 507278bcd9139f4b35be75190446c95614120d9b4c09Douglas Gregor // Check in the class 507303d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor SuperMethod = Class->getMethod(CurMethod->getSelector(), 507403d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor CurMethod->isInstanceMethod()); 507503d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 507678bcd9139f4b35be75190446c95614120d9b4c09Douglas Gregor // Check in categories or class extensions. 507778bcd9139f4b35be75190446c95614120d9b4c09Douglas Gregor if (!SuperMethod) { 507878bcd9139f4b35be75190446c95614120d9b4c09Douglas Gregor for (ObjCCategoryDecl *Category = Class->getCategoryList(); Category; 507978bcd9139f4b35be75190446c95614120d9b4c09Douglas Gregor Category = Category->getNextClassCategory()) 508078bcd9139f4b35be75190446c95614120d9b4c09Douglas Gregor if ((SuperMethod = Category->getMethod(CurMethod->getSelector(), 508178bcd9139f4b35be75190446c95614120d9b4c09Douglas Gregor CurMethod->isInstanceMethod()))) 508278bcd9139f4b35be75190446c95614120d9b4c09Douglas Gregor break; 508378bcd9139f4b35be75190446c95614120d9b4c09Douglas Gregor } 508478bcd9139f4b35be75190446c95614120d9b4c09Douglas Gregor } 508578bcd9139f4b35be75190446c95614120d9b4c09Douglas Gregor 508603d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (!SuperMethod) 508703d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor return 0; 508803d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 508903d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor // Check whether the superclass method has the same signature. 509003d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (CurMethod->param_size() != SuperMethod->param_size() || 509103d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor CurMethod->isVariadic() != SuperMethod->isVariadic()) 509203d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor return 0; 509303d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 509403d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor for (ObjCMethodDecl::param_iterator CurP = CurMethod->param_begin(), 509503d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor CurPEnd = CurMethod->param_end(), 509603d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor SuperP = SuperMethod->param_begin(); 509703d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor CurP != CurPEnd; ++CurP, ++SuperP) { 509803d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor // Make sure the parameter types are compatible. 509903d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (!S.Context.hasSameUnqualifiedType((*CurP)->getType(), 510003d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor (*SuperP)->getType())) 510103d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor return 0; 510203d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 510303d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor // Make sure we have a parameter name to forward! 510403d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (!(*CurP)->getIdentifier()) 510503d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor return 0; 510603d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor } 510703d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 510803d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor // We have a superclass method. Now, form the send-to-super completion. 510928a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Builder(Results.getAllocator(), 511028a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis Results.getCodeCompletionTUInfo()); 511103d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 511203d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor // Give this completion a return type. 51138987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor AddResultTypeChunk(S.Context, getCompletionPrintingPolicy(S), SuperMethod, 51148987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor Builder); 511503d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 511603d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor // If we need the "super" keyword, add it (plus some spacing). 511703d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (NeedSuperKeyword) { 5118218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("super"); 5119218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 512003d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor } 512103d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 512203d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor Selector Sel = CurMethod->getSelector(); 512303d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (Sel.isUnarySelector()) { 512403d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (NeedSuperKeyword) 5125dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddTextChunk(Builder.getAllocator().CopyString( 5126813d8346529bf094eb2b249648906ba7fd226688Douglas Gregor Sel.getNameForSlot(0))); 512703d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor else 5128dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddTypedTextChunk(Builder.getAllocator().CopyString( 5129813d8346529bf094eb2b249648906ba7fd226688Douglas Gregor Sel.getNameForSlot(0))); 513003d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor } else { 513103d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor ObjCMethodDecl::param_iterator CurP = CurMethod->param_begin(); 513203d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor for (unsigned I = 0, N = Sel.getNumArgs(); I != N; ++I, ++CurP) { 513303d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (I > NumSelIdents) 5134218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 513503d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 513603d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (I < NumSelIdents) 5137218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddInformativeChunk( 5138dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.getAllocator().CopyString( 5139813d8346529bf094eb2b249648906ba7fd226688Douglas Gregor Sel.getNameForSlot(I) + ":")); 514003d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor else if (NeedSuperKeyword || I > NumSelIdents) { 5141218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk( 5142dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.getAllocator().CopyString( 5143813d8346529bf094eb2b249648906ba7fd226688Douglas Gregor Sel.getNameForSlot(I) + ":")); 5144dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddPlaceholderChunk(Builder.getAllocator().CopyString( 5145218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor (*CurP)->getIdentifier()->getName())); 514603d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor } else { 5147218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk( 5148dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.getAllocator().CopyString( 5149813d8346529bf094eb2b249648906ba7fd226688Douglas Gregor Sel.getNameForSlot(I) + ":")); 5150dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddPlaceholderChunk(Builder.getAllocator().CopyString( 5151218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor (*CurP)->getIdentifier()->getName())); 515203d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor } 515303d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor } 515403d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor } 515503d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 5156ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor Results.AddResult(CodeCompletionResult(Builder.TakeString(), SuperMethod, 5157ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor CCP_SuperCompletion)); 515803d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor return SuperMethod; 515903d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor} 516003d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 51618e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregorvoid Sema::CodeCompleteObjCMessageReceiver(Scope *S) { 51620a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 5163218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 516428a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 5165218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_ObjCMessageReceiver, 51664e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie getLangOpts().CPlusPlus0x 516781f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor ? &ResultBuilder::IsObjCMessageReceiverOrLambdaCapture 516881f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor : &ResultBuilder::IsObjCMessageReceiver); 51698e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 51708e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 51718e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor Results.EnterNewScope(); 51728071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 51738071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompleter->includeGlobals()); 51748e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 51758e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor // If we are in an Objective-C method inside a class that has a superclass, 51768e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor // add "super" as an option. 51778e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor if (ObjCMethodDecl *Method = getCurMethodDecl()) 51788e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor if (ObjCInterfaceDecl *Iface = Method->getClassInterface()) 517903d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (Iface->getSuperClass()) { 51808e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor Results.AddResult(Result("super")); 518103d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 518203d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor AddSuperSendCompletion(*this, /*NeedSuperKeyword=*/true, 0, 0, Results); 518303d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor } 51848e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 51854e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (getLangOpts().CPlusPlus0x) 518681f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor addThisCompletion(*this, Results); 518781f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor 51888e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor Results.ExitScope(); 51898e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 51908e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor if (CodeCompleter->includeMacros()) 51918e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor AddMacroResults(PP, Results); 5192cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 5193e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(), Results.size()); 51948e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 51958e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor} 51968e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 51972725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregorvoid Sema::CodeCompleteObjCSuperMessage(Scope *S, SourceLocation SuperLoc, 5198d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor IdentifierInfo **SelIdents, 519970c5ac70ace21b011dc2d4001bae26cdcf62ff8dDouglas Gregor unsigned NumSelIdents, 520070c5ac70ace21b011dc2d4001bae26cdcf62ff8dDouglas Gregor bool AtArgumentExpression) { 520124a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor ObjCInterfaceDecl *CDecl = 0; 52022725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) { 52032725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // Figure out which interface we're in. 52042725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor CDecl = CurMethod->getClassInterface(); 52052725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (!CDecl) 52062725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor return; 52072725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor 52082725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // Find the superclass of this class. 52092725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor CDecl = CDecl->getSuperClass(); 52102725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (!CDecl) 52112725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor return; 521224a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor 52132725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (CurMethod->isInstanceMethod()) { 52142725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // We are inside an instance method, which means that the message 52152725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // send [super ...] is actually calling an instance method on the 52166b0656a7c386662e1bec5f23a3bd0bf2687a9635Douglas Gregor // current object. 52176b0656a7c386662e1bec5f23a3bd0bf2687a9635Douglas Gregor return CodeCompleteObjCInstanceMessage(S, 0, 521803d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor SelIdents, NumSelIdents, 521970c5ac70ace21b011dc2d4001bae26cdcf62ff8dDouglas Gregor AtArgumentExpression, 52206b0656a7c386662e1bec5f23a3bd0bf2687a9635Douglas Gregor CDecl); 52212725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor } 522224a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor 52232725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // Fall through to send to the superclass in CDecl. 52242725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor } else { 52252725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // "super" may be the name of a type or variable. Figure out which 52262725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // it is. 52272725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor IdentifierInfo *Super = &Context.Idents.get("super"); 52282725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor NamedDecl *ND = LookupSingleName(S, Super, SuperLoc, 52292725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor LookupOrdinaryName); 52302725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if ((CDecl = dyn_cast_or_null<ObjCInterfaceDecl>(ND))) { 52312725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // "super" names an interface. Use it. 52322725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor } else if (TypeDecl *TD = dyn_cast_or_null<TypeDecl>(ND)) { 5233c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (const ObjCObjectType *Iface 5234c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall = Context.getTypeDeclType(TD)->getAs<ObjCObjectType>()) 5235c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall CDecl = Iface->getInterface(); 52362725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor } else if (ND && isa<UnresolvedUsingTypenameDecl>(ND)) { 52372725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // "super" names an unresolved type; we can't be more specific. 52382725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor } else { 52392725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // Assume that "super" names some kind of value and parse that way. 52402725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor CXXScopeSpec SS; 5241e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara SourceLocation TemplateKWLoc; 52422725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor UnqualifiedId id; 52432725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor id.setIdentifier(Super, SuperLoc); 5244e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara ExprResult SuperExpr = ActOnIdExpression(S, SS, TemplateKWLoc, id, 5245e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara false, false); 52462725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor return CodeCompleteObjCInstanceMessage(S, (Expr *)SuperExpr.get(), 524770c5ac70ace21b011dc2d4001bae26cdcf62ff8dDouglas Gregor SelIdents, NumSelIdents, 524870c5ac70ace21b011dc2d4001bae26cdcf62ff8dDouglas Gregor AtArgumentExpression); 52492725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor } 525024a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor 52512725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // Fall through 525224a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor } 525324a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor 5254b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall ParsedType Receiver; 52552725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (CDecl) 5256b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall Receiver = ParsedType::make(Context.getObjCInterfaceType(CDecl)); 52572725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor return CodeCompleteObjCClassMessage(S, Receiver, SelIdents, 525870c5ac70ace21b011dc2d4001bae26cdcf62ff8dDouglas Gregor NumSelIdents, AtArgumentExpression, 525970c5ac70ace21b011dc2d4001bae26cdcf62ff8dDouglas Gregor /*IsSuper=*/true); 52602725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor} 52612725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor 5262b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor/// \brief Given a set of code-completion results for the argument of a message 5263b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor/// send, determine the preferred type (if any) for that argument expression. 5264b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregorstatic QualType getPreferredArgumentTypeForMessageSend(ResultBuilder &Results, 5265b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor unsigned NumSelIdents) { 5266b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor typedef CodeCompletionResult Result; 5267b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor ASTContext &Context = Results.getSema().Context; 5268b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor 5269b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor QualType PreferredType; 5270b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor unsigned BestPriority = CCP_Unlikely * 2; 5271b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor Result *ResultsData = Results.data(); 5272b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor for (unsigned I = 0, N = Results.size(); I != N; ++I) { 5273b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor Result &R = ResultsData[I]; 5274b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor if (R.Kind == Result::RK_Declaration && 5275b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor isa<ObjCMethodDecl>(R.Declaration)) { 5276b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor if (R.Priority <= BestPriority) { 5277b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor ObjCMethodDecl *Method = cast<ObjCMethodDecl>(R.Declaration); 5278b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor if (NumSelIdents <= Method->param_size()) { 5279b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor QualType MyPreferredType = Method->param_begin()[NumSelIdents - 1] 5280b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor ->getType(); 5281b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor if (R.Priority < BestPriority || PreferredType.isNull()) { 5282b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor BestPriority = R.Priority; 5283b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor PreferredType = MyPreferredType; 5284b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor } else if (!Context.hasSameUnqualifiedType(PreferredType, 5285b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor MyPreferredType)) { 5286b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor PreferredType = QualType(); 5287b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor } 5288b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor } 5289b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor } 5290b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor } 5291b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor } 5292b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor 5293b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor return PreferredType; 5294b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor} 5295b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor 5296c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregorstatic void AddClassMessageCompletions(Sema &SemaRef, Scope *S, 5297c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor ParsedType Receiver, 5298c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor IdentifierInfo **SelIdents, 5299c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor unsigned NumSelIdents, 530070c5ac70ace21b011dc2d4001bae26cdcf62ff8dDouglas Gregor bool AtArgumentExpression, 5301c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor bool IsSuper, 5302c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor ResultBuilder &Results) { 53030a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 53042725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor ObjCInterfaceDecl *CDecl = 0; 5305c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor 530624a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor // If the given name refers to an interface type, retrieve the 530724a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor // corresponding declaration. 53082725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (Receiver) { 5309c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor QualType T = SemaRef.GetTypeFromParser(Receiver, 0); 53102725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (!T.isNull()) 5311c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (const ObjCObjectType *Interface = T->getAs<ObjCObjectType>()) 5312c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall CDecl = Interface->getInterface(); 531324a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor } 5314c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor 531536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add all of the factory methods in this Objective-C class, its protocols, 531636ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // superclasses, categories, implementation, etc. 5317c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff Results.EnterNewScope(); 5318c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor 531903d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor // If this is a send-to-super, try to add the special "super" send 532003d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor // completion. 532103d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (IsSuper) { 532203d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (ObjCMethodDecl *SuperMethod 5323c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor = AddSuperSendCompletion(SemaRef, false, SelIdents, NumSelIdents, 5324c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor Results)) 532503d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor Results.Ignore(SuperMethod); 532603d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor } 5327c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor 5328265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor // If we're inside an Objective-C method definition, prefer its selector to 5329265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor // others. 5330c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor if (ObjCMethodDecl *CurMethod = SemaRef.getCurMethodDecl()) 5331265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor Results.setPreferredSelector(CurMethod->getSelector()); 5332c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor 5333d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor VisitedSelectorSet Selectors; 533413438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor if (CDecl) 5335c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor AddObjCMethods(CDecl, false, MK_Any, SelIdents, NumSelIdents, 5336cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor SemaRef.CurContext, Selectors, AtArgumentExpression, 5337cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor Results); 53382725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor else { 533913438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor // We're messaging "id" as a type; provide all class/factory methods. 5340c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor 5341719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor // If we have an external source, load the entire class method 53423c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl // pool from the AST file. 5343c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor if (SemaRef.ExternalSource) { 5344c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor for (uint32_t I = 0, 5345c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor N = SemaRef.ExternalSource->GetNumExternalSelectors(); 534676bd1f387e6a7b7abfe53f63b3bd429b97bb80f0John McCall I != N; ++I) { 5347c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor Selector Sel = SemaRef.ExternalSource->GetExternalSelector(I); 5348c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor if (Sel.isNull() || SemaRef.MethodPool.count(Sel)) 5349719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor continue; 5350c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor 5351c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor SemaRef.ReadMethodPool(Sel); 5352719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor } 5353719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor } 5354c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor 5355c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor for (Sema::GlobalMethodPool::iterator M = SemaRef.MethodPool.begin(), 5356c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor MEnd = SemaRef.MethodPool.end(); 5357db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl M != MEnd; ++M) { 5358db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl for (ObjCMethodList *MethList = &M->second.second; 5359db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl MethList && MethList->Method; 536013438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor MethList = MethList->Next) { 536113438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor if (!isAcceptableObjCMethod(MethList->Method, MK_Any, SelIdents, 536213438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor NumSelIdents)) 536313438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor continue; 5364c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor 536513438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor Result R(MethList->Method, 0); 536613438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor R.StartParameter = NumSelIdents; 536713438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor R.AllParametersAreInformative = false; 5368c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor Results.MaybeAddResult(R, SemaRef.CurContext); 536913438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor } 537013438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor } 537113438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor } 5372c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor 5373c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor Results.ExitScope(); 5374c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor} 537513438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor 5376c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregorvoid Sema::CodeCompleteObjCClassMessage(Scope *S, ParsedType Receiver, 5377c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor IdentifierInfo **SelIdents, 5378c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor unsigned NumSelIdents, 537970c5ac70ace21b011dc2d4001bae26cdcf62ff8dDouglas Gregor bool AtArgumentExpression, 5380c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor bool IsSuper) { 5381e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor 5382e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor QualType T = this->GetTypeFromParser(Receiver); 5383e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor 5384218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 538528a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 5386e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor CodeCompletionContext(CodeCompletionContext::CCC_ObjCClassMessage, 53870a47d69af8bda945352997af3da4687a3356096aDouglas Gregor T, SelIdents, NumSelIdents)); 5388e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor 538970c5ac70ace21b011dc2d4001bae26cdcf62ff8dDouglas Gregor AddClassMessageCompletions(*this, S, Receiver, SelIdents, NumSelIdents, 539070c5ac70ace21b011dc2d4001bae26cdcf62ff8dDouglas Gregor AtArgumentExpression, IsSuper, Results); 5391b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor 5392b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor // If we're actually at the argument expression (rather than prior to the 5393b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor // selector), we're actually performing code completion for an expression. 5394b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor // Determine whether we have a single, best method. If so, we can 5395b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor // code-complete the expression using the corresponding parameter type as 5396b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor // our preferred type, improving completion results. 5397b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor if (AtArgumentExpression) { 5398b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor QualType PreferredType = getPreferredArgumentTypeForMessageSend(Results, 5399e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor NumSelIdents); 5400b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor if (PreferredType.isNull()) 5401b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor CodeCompleteOrdinaryName(S, PCC_Expression); 5402b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor else 5403b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor CodeCompleteExpression(S, PreferredType); 5404b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor return; 5405b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor } 5406b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor 5407e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 5408e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor Results.getCompletionContext(), 540903d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor Results.data(), Results.size()); 5410c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff} 5411c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff 5412f81e5a9e3f3ff80c56e4afb4fe6311a8735f36e8Richard Trieuvoid Sema::CodeCompleteObjCInstanceMessage(Scope *S, Expr *Receiver, 5413d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor IdentifierInfo **SelIdents, 541403d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor unsigned NumSelIdents, 541570c5ac70ace21b011dc2d4001bae26cdcf62ff8dDouglas Gregor bool AtArgumentExpression, 54166b0656a7c386662e1bec5f23a3bd0bf2687a9635Douglas Gregor ObjCInterfaceDecl *Super) { 54170a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 5418c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff 5419c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff Expr *RecExpr = static_cast<Expr *>(Receiver); 5420c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff 542136ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // If necessary, apply function/array conversion to the receiver. 542236ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // C99 6.7.5.3p[7,8]. 5423429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley if (RecExpr) { 5424429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley ExprResult Conv = DefaultFunctionArrayLvalueConversion(RecExpr); 5425429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley if (Conv.isInvalid()) // conversion failed. bail. 5426429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley return; 5427429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley RecExpr = Conv.take(); 5428429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley } 54296b0656a7c386662e1bec5f23a3bd0bf2687a9635Douglas Gregor QualType ReceiverType = RecExpr? RecExpr->getType() 54306b0656a7c386662e1bec5f23a3bd0bf2687a9635Douglas Gregor : Super? Context.getObjCObjectPointerType( 54316b0656a7c386662e1bec5f23a3bd0bf2687a9635Douglas Gregor Context.getObjCInterfaceType(Super)) 54326b0656a7c386662e1bec5f23a3bd0bf2687a9635Douglas Gregor : Context.getObjCIdType(); 5433c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff 5434da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor // If we're messaging an expression with type "id" or "Class", check 5435da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor // whether we know something special about the receiver that allows 5436da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor // us to assume a more-specific receiver type. 5437da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor if (ReceiverType->isObjCIdType() || ReceiverType->isObjCClassType()) 5438da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor if (ObjCInterfaceDecl *IFace = GetAssumedMessageSendExprType(RecExpr)) { 5439da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor if (ReceiverType->isObjCClassType()) 5440da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor return CodeCompleteObjCClassMessage(S, 5441da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor ParsedType::make(Context.getObjCInterfaceType(IFace)), 5442da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor SelIdents, NumSelIdents, 5443da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor AtArgumentExpression, Super); 5444da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor 5445da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor ReceiverType = Context.getObjCObjectPointerType( 5446da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor Context.getObjCInterfaceType(IFace)); 5447da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor } 5448da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor 544936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Build the set of methods we can see. 5450218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 545128a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 5452e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor CodeCompletionContext(CodeCompletionContext::CCC_ObjCInstanceMessage, 54530a47d69af8bda945352997af3da4687a3356096aDouglas Gregor ReceiverType, SelIdents, NumSelIdents)); 5454e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor 545536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor Results.EnterNewScope(); 545622f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor 545703d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor // If this is a send-to-super, try to add the special "super" send 545803d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor // completion. 54596b0656a7c386662e1bec5f23a3bd0bf2687a9635Douglas Gregor if (Super) { 546003d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (ObjCMethodDecl *SuperMethod 546103d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor = AddSuperSendCompletion(*this, false, SelIdents, NumSelIdents, 546203d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor Results)) 546303d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor Results.Ignore(SuperMethod); 546403d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor } 546503d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 5466265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor // If we're inside an Objective-C method definition, prefer its selector to 5467265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor // others. 5468265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) 5469265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor Results.setPreferredSelector(CurMethod->getSelector()); 547036ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 5471d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor // Keep track of the selectors we've already added. 5472d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor VisitedSelectorSet Selectors; 5473d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor 5474f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // Handle messages to Class. This really isn't a message to an instance 5475f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // method, so we treat it the same way we would treat a message send to a 5476f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // class method. 5477f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor if (ReceiverType->isObjCClassType() || 5478f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor ReceiverType->isObjCQualifiedClassType()) { 5479f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) { 5480f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor if (ObjCInterfaceDecl *ClassDecl = CurMethod->getClassInterface()) 54814ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(ClassDecl, false, MK_Any, SelIdents, NumSelIdents, 5482cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor CurContext, Selectors, AtArgumentExpression, Results); 5483f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor } 5484f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor } 5485f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // Handle messages to a qualified ID ("id<foo>"). 5486f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor else if (const ObjCObjectPointerType *QualID 5487f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor = ReceiverType->getAsObjCQualifiedIdType()) { 5488f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // Search protocols for instance methods. 5489f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor for (ObjCObjectPointerType::qual_iterator I = QualID->qual_begin(), 5490f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor E = QualID->qual_end(); 5491f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor I != E; ++I) 54924ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(*I, true, MK_Any, SelIdents, NumSelIdents, CurContext, 5493cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor Selectors, AtArgumentExpression, Results); 5494f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor } 5495f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // Handle messages to a pointer to interface type. 5496f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor else if (const ObjCObjectPointerType *IFacePtr 5497f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor = ReceiverType->getAsObjCInterfacePointerType()) { 5498f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // Search the class, its superclasses, etc., for instance methods. 54994ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(IFacePtr->getInterfaceDecl(), true, MK_Any, SelIdents, 5500cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor NumSelIdents, CurContext, Selectors, AtArgumentExpression, 5501cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor Results); 5502f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor 5503f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // Search protocols for instance methods. 5504f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor for (ObjCObjectPointerType::qual_iterator I = IFacePtr->qual_begin(), 5505f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor E = IFacePtr->qual_end(); 5506f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor I != E; ++I) 55074ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(*I, true, MK_Any, SelIdents, NumSelIdents, CurContext, 5508cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor Selectors, AtArgumentExpression, Results); 5509f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor } 551013438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor // Handle messages to "id". 551113438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor else if (ReceiverType->isObjCIdType()) { 5512719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor // We're messaging "id", so provide all instance methods we know 5513719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor // about as code-completion results. 5514719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor 5515719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor // If we have an external source, load the entire class method 55163c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl // pool from the AST file. 5517719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor if (ExternalSource) { 551876bd1f387e6a7b7abfe53f63b3bd429b97bb80f0John McCall for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors(); 551976bd1f387e6a7b7abfe53f63b3bd429b97bb80f0John McCall I != N; ++I) { 552076bd1f387e6a7b7abfe53f63b3bd429b97bb80f0John McCall Selector Sel = ExternalSource->GetExternalSelector(I); 5521db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl if (Sel.isNull() || MethodPool.count(Sel)) 5522719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor continue; 5523719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor 5524db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl ReadMethodPool(Sel); 5525719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor } 5526719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor } 5527719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor 5528db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl for (GlobalMethodPool::iterator M = MethodPool.begin(), 5529db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl MEnd = MethodPool.end(); 5530db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl M != MEnd; ++M) { 5531db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl for (ObjCMethodList *MethList = &M->second.first; 5532db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl MethList && MethList->Method; 553313438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor MethList = MethList->Next) { 553413438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor if (!isAcceptableObjCMethod(MethList->Method, MK_Any, SelIdents, 553513438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor NumSelIdents)) 553613438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor continue; 5537d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor 5538d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor if (!Selectors.insert(MethList->Method->getSelector())) 5539d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor continue; 5540d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor 554113438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor Result R(MethList->Method, 0); 554213438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor R.StartParameter = NumSelIdents; 554313438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor R.AllParametersAreInformative = false; 554413438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor Results.MaybeAddResult(R, CurContext); 554513438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor } 554613438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor } 554713438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor } 5548f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor Results.ExitScope(); 5549b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor 5550b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor 5551b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor // If we're actually at the argument expression (rather than prior to the 5552b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor // selector), we're actually performing code completion for an expression. 5553b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor // Determine whether we have a single, best method. If so, we can 5554b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor // code-complete the expression using the corresponding parameter type as 5555b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor // our preferred type, improving completion results. 5556b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor if (AtArgumentExpression) { 5557b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor QualType PreferredType = getPreferredArgumentTypeForMessageSend(Results, 5558b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor NumSelIdents); 5559b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor if (PreferredType.isNull()) 5560b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor CodeCompleteOrdinaryName(S, PCC_Expression); 5561b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor else 5562b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor CodeCompleteExpression(S, PreferredType); 5563b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor return; 5564b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor } 5565b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor 5566e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 5567e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor Results.getCompletionContext(), 5568e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 5569c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff} 557055385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor 5571fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregorvoid Sema::CodeCompleteObjCForCollection(Scope *S, 5572fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor DeclGroupPtrTy IterationVar) { 5573fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor CodeCompleteExpressionData Data; 5574fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor Data.ObjCCollection = true; 5575fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor 5576fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor if (IterationVar.getAsOpaquePtr()) { 5577fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor DeclGroupRef DG = IterationVar.getAsVal<DeclGroupRef>(); 5578fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor for (DeclGroupRef::iterator I = DG.begin(), End = DG.end(); I != End; ++I) { 5579fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor if (*I) 5580fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor Data.IgnoreDecls.push_back(*I); 5581fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor } 5582fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor } 5583fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor 5584fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor CodeCompleteExpression(S, Data); 5585fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor} 5586fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor 5587458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregorvoid Sema::CodeCompleteObjCSelector(Scope *S, IdentifierInfo **SelIdents, 5588458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor unsigned NumSelIdents) { 5589458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor // If we have an external source, load the entire class method 5590458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor // pool from the AST file. 5591458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor if (ExternalSource) { 5592458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors(); 5593458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor I != N; ++I) { 5594458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor Selector Sel = ExternalSource->GetExternalSelector(I); 5595458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor if (Sel.isNull() || MethodPool.count(Sel)) 5596458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor continue; 5597458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor 5598458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor ReadMethodPool(Sel); 5599458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor } 5600458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor } 5601458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor 5602218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 560328a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 5604218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_SelectorName); 5605458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor Results.EnterNewScope(); 5606458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor for (GlobalMethodPool::iterator M = MethodPool.begin(), 5607458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor MEnd = MethodPool.end(); 5608458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor M != MEnd; ++M) { 5609458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor 5610458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor Selector Sel = M->first; 5611458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor if (!isAcceptableObjCSelector(Sel, MK_Any, SelIdents, NumSelIdents)) 5612458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor continue; 5613458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor 561428a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Builder(Results.getAllocator(), 561528a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis Results.getCodeCompletionTUInfo()); 5616458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor if (Sel.isUnarySelector()) { 5617dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddTypedTextChunk(Builder.getAllocator().CopyString( 5618813d8346529bf094eb2b249648906ba7fd226688Douglas Gregor Sel.getNameForSlot(0))); 5619218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 5620458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor continue; 5621458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor } 5622458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor 56232d9e21f4675232a39a39611a5b4bb1f4914b2742Douglas Gregor std::string Accumulator; 5624458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor for (unsigned I = 0, N = Sel.getNumArgs(); I != N; ++I) { 56252d9e21f4675232a39a39611a5b4bb1f4914b2742Douglas Gregor if (I == NumSelIdents) { 56262d9e21f4675232a39a39611a5b4bb1f4914b2742Douglas Gregor if (!Accumulator.empty()) { 5627dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddInformativeChunk(Builder.getAllocator().CopyString( 5628218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Accumulator)); 56292d9e21f4675232a39a39611a5b4bb1f4914b2742Douglas Gregor Accumulator.clear(); 56302d9e21f4675232a39a39611a5b4bb1f4914b2742Douglas Gregor } 56312d9e21f4675232a39a39611a5b4bb1f4914b2742Douglas Gregor } 56322d9e21f4675232a39a39611a5b4bb1f4914b2742Douglas Gregor 5633a0651c5f5d1c8928d3ae062435ed9cf0aa0d04baBenjamin Kramer Accumulator += Sel.getNameForSlot(I); 56342d9e21f4675232a39a39611a5b4bb1f4914b2742Douglas Gregor Accumulator += ':'; 5635458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor } 5636dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddTypedTextChunk(Builder.getAllocator().CopyString( Accumulator)); 5637218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 5638458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor } 5639458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor Results.ExitScope(); 5640458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor 5641458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 5642458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor CodeCompletionContext::CCC_SelectorName, 5643458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor Results.data(), Results.size()); 5644458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor} 5645458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor 564655385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor/// \brief Add all of the protocol declarations that we find in the given 564755385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor/// (translation unit) context. 564855385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregorstatic void AddProtocolResults(DeclContext *Ctx, DeclContext *CurContext, 5649083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor bool OnlyForwardDeclarations, 565055385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor ResultBuilder &Results) { 56510a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 565255385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor 565355385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor for (DeclContext::decl_iterator D = Ctx->decls_begin(), 565455385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor DEnd = Ctx->decls_end(); 565555385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor D != DEnd; ++D) { 565655385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor // Record any protocols we find. 565755385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor if (ObjCProtocolDecl *Proto = dyn_cast<ObjCProtocolDecl>(*D)) 56585e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor if (!OnlyForwardDeclarations || !Proto->hasDefinition()) 5659608300be1972c43fe99154d25d62d697e7c0a0c2Douglas Gregor Results.AddResult(Result(Proto, 0), CurContext, 0, false); 566055385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor } 566155385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor} 566255385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor 566355385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregorvoid Sema::CodeCompleteObjCProtocolReferences(IdentifierLocPair *Protocols, 566455385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor unsigned NumProtocols) { 5665218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 566628a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 5667218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_ObjCProtocolName); 566855385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor 566970c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor if (CodeCompleter && CodeCompleter->includeGlobals()) { 567070c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor Results.EnterNewScope(); 567170c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor 567270c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor // Tell the result set to ignore all of the protocols we have 567370c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor // already seen. 567470c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor // FIXME: This doesn't work when caching code-completion results. 567570c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor for (unsigned I = 0; I != NumProtocols; ++I) 567670c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor if (ObjCProtocolDecl *Protocol = LookupProtocol(Protocols[I].first, 567770c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor Protocols[I].second)) 567870c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor Results.Ignore(Protocol); 567970c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor 568070c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor // Add all protocols. 568170c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor AddProtocolResults(Context.getTranslationUnitDecl(), CurContext, false, 568270c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor Results); 5683083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor 568470c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor Results.ExitScope(); 568570c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor } 568670c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor 5687e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 5688e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_ObjCProtocolName, 5689e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 5690083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor} 5691083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor 5692083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregorvoid Sema::CodeCompleteObjCProtocolDecl(Scope *) { 5693218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 569428a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 5695218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_ObjCProtocolName); 5696083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor 569770c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor if (CodeCompleter && CodeCompleter->includeGlobals()) { 569870c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor Results.EnterNewScope(); 569970c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor 570070c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor // Add all protocols. 570170c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor AddProtocolResults(Context.getTranslationUnitDecl(), CurContext, true, 570270c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor Results); 570355385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor 570470c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor Results.ExitScope(); 570570c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor } 570670c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor 5707e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 5708e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_ObjCProtocolName, 5709e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 571055385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor} 57113b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 57123b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor/// \brief Add all of the Objective-C interface declarations that we find in 57133b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor/// the given (translation unit) context. 57143b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregorstatic void AddInterfaceResults(DeclContext *Ctx, DeclContext *CurContext, 57153b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor bool OnlyForwardDeclarations, 57163b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor bool OnlyUnimplemented, 57173b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor ResultBuilder &Results) { 57180a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 57193b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 57203b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor for (DeclContext::decl_iterator D = Ctx->decls_begin(), 57213b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor DEnd = Ctx->decls_end(); 57223b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor D != DEnd; ++D) { 5723deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor // Record any interfaces we find. 5724deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor if (ObjCInterfaceDecl *Class = dyn_cast<ObjCInterfaceDecl>(*D)) 57257723fec9b45b7258c0eddf4cbfd0d335348f5edcDouglas Gregor if ((!OnlyForwardDeclarations || !Class->hasDefinition()) && 5726deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor (!OnlyUnimplemented || !Class->getImplementation())) 5727deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor Results.AddResult(Result(Class, 0), CurContext, 0, false); 57283b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor } 57293b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor} 57303b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 57313b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregorvoid Sema::CodeCompleteObjCInterfaceDecl(Scope *S) { 5732218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 573328a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 5734218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 57353b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.EnterNewScope(); 57363b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 57370f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor if (CodeCompleter->includeGlobals()) { 57380f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor // Add all classes. 57390f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false, 57400f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor false, Results); 57410f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor } 57420f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor 57433b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.ExitScope(); 57440f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor 5745e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 57460f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor CodeCompletionContext::CCC_ObjCInterfaceName, 5747e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 57483b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor} 57493b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 5750c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregorvoid Sema::CodeCompleteObjCSuperclass(Scope *S, IdentifierInfo *ClassName, 5751c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor SourceLocation ClassNameLoc) { 5752218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 575328a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 57540f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor CodeCompletionContext::CCC_ObjCInterfaceName); 57553b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.EnterNewScope(); 57563b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 57573b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor // Make sure that we ignore the class we're currently defining. 57583b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor NamedDecl *CurClass 5759c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor = LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName); 576033ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor if (CurClass && isa<ObjCInterfaceDecl>(CurClass)) 57613b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.Ignore(CurClass); 57623b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 57630f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor if (CodeCompleter->includeGlobals()) { 57640f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor // Add all classes. 57650f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false, 57660f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor false, Results); 57670f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor } 57680f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor 57693b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.ExitScope(); 57700f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor 5771e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 57720f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor CodeCompletionContext::CCC_ObjCInterfaceName, 5773e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 57743b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor} 57753b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 57763b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregorvoid Sema::CodeCompleteObjCImplementationDecl(Scope *S) { 5777218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 577828a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 5779218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 57803b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.EnterNewScope(); 57813b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 57820f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor if (CodeCompleter->includeGlobals()) { 57830f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor // Add all unimplemented classes. 57840f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false, 57850f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor true, Results); 57860f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor } 57870f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor 57883b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.ExitScope(); 57890f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor 5790e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 57910f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor CodeCompletionContext::CCC_ObjCInterfaceName, 5792e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 57933b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor} 579433ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 579533ced0b8550f3e7169f326944731ee02e9338659Douglas Gregorvoid Sema::CodeCompleteObjCInterfaceCategory(Scope *S, 5796c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor IdentifierInfo *ClassName, 5797c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor SourceLocation ClassNameLoc) { 57980a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 579933ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 5800218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 580128a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 58023da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CodeCompletionContext::CCC_ObjCCategoryName); 580333ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 580433ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // Ignore any categories we find that have already been implemented by this 580533ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // interface. 580633ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor llvm::SmallPtrSet<IdentifierInfo *, 16> CategoryNames; 580733ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor NamedDecl *CurClass 5808c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor = LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName); 580933ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor if (ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurClass)) 581033ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor for (ObjCCategoryDecl *Category = Class->getCategoryList(); Category; 581133ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Category = Category->getNextClassCategory()) 581233ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor CategoryNames.insert(Category->getIdentifier()); 581333ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 581433ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // Add all of the categories we know about. 581533ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Results.EnterNewScope(); 581633ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor TranslationUnitDecl *TU = Context.getTranslationUnitDecl(); 581733ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor for (DeclContext::decl_iterator D = TU->decls_begin(), 581833ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor DEnd = TU->decls_end(); 581933ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor D != DEnd; ++D) 582033ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(*D)) 582133ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor if (CategoryNames.insert(Category->getIdentifier())) 5822608300be1972c43fe99154d25d62d697e7c0a0c2Douglas Gregor Results.AddResult(Result(Category, 0), CurContext, 0, false); 582333ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Results.ExitScope(); 582433ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 5825e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 58263da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CodeCompletionContext::CCC_ObjCCategoryName, 5827e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 582833ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor} 582933ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 583033ced0b8550f3e7169f326944731ee02e9338659Douglas Gregorvoid Sema::CodeCompleteObjCImplementationCategory(Scope *S, 5831c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor IdentifierInfo *ClassName, 5832c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor SourceLocation ClassNameLoc) { 58330a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 583433ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 583533ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // Find the corresponding interface. If we couldn't find the interface, the 583633ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // program itself is ill-formed. However, we'll try to be helpful still by 583733ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // providing the list of all of the categories we know about. 583833ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor NamedDecl *CurClass 5839c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor = LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName); 584033ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurClass); 584133ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor if (!Class) 5842c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor return CodeCompleteObjCInterfaceCategory(S, ClassName, ClassNameLoc); 584333ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 5844218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 584528a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 58463da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CodeCompletionContext::CCC_ObjCCategoryName); 584733ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 584833ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // Add all of the categories that have have corresponding interface 584933ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // declarations in this class and any of its superclasses, except for 585033ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // already-implemented categories in the class itself. 585133ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor llvm::SmallPtrSet<IdentifierInfo *, 16> CategoryNames; 585233ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Results.EnterNewScope(); 585333ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor bool IgnoreImplemented = true; 585433ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor while (Class) { 585533ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor for (ObjCCategoryDecl *Category = Class->getCategoryList(); Category; 585633ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Category = Category->getNextClassCategory()) 585733ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor if ((!IgnoreImplemented || !Category->getImplementation()) && 585833ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor CategoryNames.insert(Category->getIdentifier())) 5859608300be1972c43fe99154d25d62d697e7c0a0c2Douglas Gregor Results.AddResult(Result(Category, 0), CurContext, 0, false); 586033ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 586133ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Class = Class->getSuperClass(); 586233ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor IgnoreImplemented = false; 586333ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor } 586433ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Results.ExitScope(); 586533ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 5866e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 58673da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CodeCompletionContext::CCC_ObjCCategoryName, 5868e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 586933ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor} 5870322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 5871a28948f34817476d02412fa204cae038e228c827Fariborz Jahanianvoid Sema::CodeCompleteObjCPropertyDefinition(Scope *S) { 58720a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 5873218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 587428a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 5875218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 5876322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 5877322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Figure out where this @synthesize lives. 5878322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor ObjCContainerDecl *Container 5879a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian = dyn_cast_or_null<ObjCContainerDecl>(CurContext); 5880322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor if (!Container || 5881322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor (!isa<ObjCImplementationDecl>(Container) && 5882322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor !isa<ObjCCategoryImplDecl>(Container))) 5883322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor return; 5884322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 5885322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Ignore any properties that have already been implemented. 5886b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor Container = getContainerDef(Container); 5887b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor for (DeclContext::decl_iterator D = Container->decls_begin(), 5888322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor DEnd = Container->decls_end(); 5889322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor D != DEnd; ++D) 5890322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor if (ObjCPropertyImplDecl *PropertyImpl = dyn_cast<ObjCPropertyImplDecl>(*D)) 5891322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Results.Ignore(PropertyImpl->getPropertyDecl()); 5892322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 5893322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Add any properties that we find. 58947344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor AddedPropertiesSet AddedProperties; 5895322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Results.EnterNewScope(); 5896322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor if (ObjCImplementationDecl *ClassImpl 5897322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor = dyn_cast<ObjCImplementationDecl>(Container)) 58984b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddObjCProperties(ClassImpl->getClassInterface(), false, 58994b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor /*AllowNullaryMethods=*/false, CurContext, 59007344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor AddedProperties, Results); 5901322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor else 5902322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor AddObjCProperties(cast<ObjCCategoryImplDecl>(Container)->getCategoryDecl(), 59034b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor false, /*AllowNullaryMethods=*/false, CurContext, 59044b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddedProperties, Results); 5905322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Results.ExitScope(); 5906322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 5907e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 5908e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 5909e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 5910322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor} 5911322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 5912322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregorvoid Sema::CodeCompleteObjCPropertySynthesizeIvar(Scope *S, 5913a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian IdentifierInfo *PropertyName) { 59140a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 5915218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 591628a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 5917218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 5918322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 5919322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Figure out where this @synthesize lives. 5920322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor ObjCContainerDecl *Container 5921a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian = dyn_cast_or_null<ObjCContainerDecl>(CurContext); 5922322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor if (!Container || 5923322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor (!isa<ObjCImplementationDecl>(Container) && 5924322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor !isa<ObjCCategoryImplDecl>(Container))) 5925322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor return; 5926322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 5927322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Figure out which interface we're looking into. 5928322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor ObjCInterfaceDecl *Class = 0; 5929322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor if (ObjCImplementationDecl *ClassImpl 5930322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor = dyn_cast<ObjCImplementationDecl>(Container)) 5931322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Class = ClassImpl->getClassInterface(); 5932322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor else 5933322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Class = cast<ObjCCategoryImplDecl>(Container)->getCategoryDecl() 5934322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor ->getClassInterface(); 5935322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 5936e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor // Determine the type of the property we're synthesizing. 5937e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor QualType PropertyType = Context.getObjCIdType(); 5938e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor if (Class) { 5939e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor if (ObjCPropertyDecl *Property 5940e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor = Class->FindPropertyDeclaration(PropertyName)) { 5941e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor PropertyType 5942e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor = Property->getType().getNonReferenceType().getUnqualifiedType(); 5943e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor 5944e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor // Give preference to ivars 5945e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor Results.setPreferredType(PropertyType); 5946e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor } 5947e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor } 5948e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor 5949322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Add all of the instance variables in this class and its superclasses. 5950322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Results.EnterNewScope(); 5951aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor bool SawSimilarlyNamedIvar = false; 5952aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor std::string NameWithPrefix; 5953aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor NameWithPrefix += '_'; 5954a0651c5f5d1c8928d3ae062435ed9cf0aa0d04baBenjamin Kramer NameWithPrefix += PropertyName->getName(); 5955aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor std::string NameWithSuffix = PropertyName->getName().str(); 5956aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor NameWithSuffix += '_'; 5957322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor for(; Class; Class = Class->getSuperClass()) { 5958aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor for (ObjCIvarDecl *Ivar = Class->all_declared_ivar_begin(); Ivar; 5959aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor Ivar = Ivar->getNextIvar()) { 5960e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor Results.AddResult(Result(Ivar, 0), CurContext, 0, false); 5961e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor 5962aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor // Determine whether we've seen an ivar with a name similar to the 5963aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor // property. 5964e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor if ((PropertyName == Ivar->getIdentifier() || 5965aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor NameWithPrefix == Ivar->getName() || 5966e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor NameWithSuffix == Ivar->getName())) { 5967aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor SawSimilarlyNamedIvar = true; 5968e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor 5969e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor // Reduce the priority of this result by one, to give it a slight 5970e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor // advantage over other results whose names don't match so closely. 5971e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor if (Results.size() && 5972e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor Results.data()[Results.size() - 1].Kind 5973e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor == CodeCompletionResult::RK_Declaration && 5974e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor Results.data()[Results.size() - 1].Declaration == Ivar) 5975e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor Results.data()[Results.size() - 1].Priority--; 5976e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor } 5977aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor } 5978322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor } 5979aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor 5980aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor if (!SawSimilarlyNamedIvar) { 5981aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor // Create ivar result _propName, that the user can use to synthesize 5982e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor // an ivar of the appropriate type. 5983e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor unsigned Priority = CCP_MemberDeclaration + 1; 5984aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor typedef CodeCompletionResult Result; 5985aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor CodeCompletionAllocator &Allocator = Results.getAllocator(); 598628a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo(), 598728a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis Priority,CXAvailability_Available); 5988aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor 59898987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor PrintingPolicy Policy = getCompletionPrintingPolicy(*this); 5990e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor Builder.AddResultTypeChunk(GetCompletionTypeString(PropertyType, Context, 59918987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor Policy, Allocator)); 5992aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(NameWithPrefix)); 5993aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor Results.AddResult(Result(Builder.TakeString(), Priority, 5994aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor CXCursor_ObjCIvarDecl)); 5995aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor } 5996aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor 5997322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Results.ExitScope(); 5998322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 5999e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 6000e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 6001e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 6002322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor} 6003e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6004408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor// Mapping from selectors to the methods that implement that selector, along 6005408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor// with the "in original class" flag. 6006408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregortypedef llvm::DenseMap<Selector, std::pair<ObjCMethodDecl *, bool> > 6007408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor KnownMethodsMap; 6008e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6009e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor/// \brief Find all of the methods that reside in the given container 6010e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor/// (and its superclasses, protocols, etc.) that meet the given 6011e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor/// criteria. Insert those methods into the map of known methods, 6012e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor/// indexed by selector so they can be easily found. 6013e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregorstatic void FindImplementableMethods(ASTContext &Context, 6014e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor ObjCContainerDecl *Container, 6015e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor bool WantInstanceMethods, 6016e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor QualType ReturnType, 6017408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor KnownMethodsMap &KnownMethods, 6018408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor bool InOriginalClass = true) { 6019e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container)) { 6020b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor // Make sure we have a definition; that's what we'll walk. 60212e5c15be82f362611c5928ce853d0685ff98c766Douglas Gregor if (!IFace->hasDefinition()) 60222e5c15be82f362611c5928ce853d0685ff98c766Douglas Gregor return; 6023b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor 6024b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor IFace = IFace->getDefinition(); 6025b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor Container = IFace; 60262e5c15be82f362611c5928ce853d0685ff98c766Douglas Gregor 6027e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor const ObjCList<ObjCProtocolDecl> &Protocols 6028e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor = IFace->getReferencedProtocols(); 6029e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 6030ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor E = Protocols.end(); 6031e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor I != E; ++I) 6032e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType, 6033ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor KnownMethods, InOriginalClass); 6034e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6035ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor // Add methods from any class extensions and categories. 6036ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor for (const ObjCCategoryDecl *Cat = IFace->getCategoryList(); Cat; 6037ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor Cat = Cat->getNextClassCategory()) 603880aa1cd7973561889e51c1c152c8990a8de9c953Fariborz Jahanian FindImplementableMethods(Context, const_cast<ObjCCategoryDecl*>(Cat), 603980aa1cd7973561889e51c1c152c8990a8de9c953Fariborz Jahanian WantInstanceMethods, ReturnType, 6040ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor KnownMethods, false); 6041ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor 6042ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor // Visit the superclass. 6043ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor if (IFace->getSuperClass()) 6044ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor FindImplementableMethods(Context, IFace->getSuperClass(), 6045ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor WantInstanceMethods, ReturnType, 6046ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor KnownMethods, false); 6047e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 6048e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6049e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(Container)) { 6050e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Recurse into protocols. 6051e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor const ObjCList<ObjCProtocolDecl> &Protocols 6052e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor = Category->getReferencedProtocols(); 6053e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 6054ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor E = Protocols.end(); 6055e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor I != E; ++I) 6056e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType, 6057ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor KnownMethods, InOriginalClass); 6058ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor 6059ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor // If this category is the original class, jump to the interface. 6060ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor if (InOriginalClass && Category->getClassInterface()) 6061ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor FindImplementableMethods(Context, Category->getClassInterface(), 6062ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor WantInstanceMethods, ReturnType, KnownMethods, 6063ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor false); 6064e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 6065e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6066e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) { 6067b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor // Make sure we have a definition; that's what we'll walk. 6068b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor if (!Protocol->hasDefinition()) 6069b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor return; 6070b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor Protocol = Protocol->getDefinition(); 6071b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor Container = Protocol; 6072b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor 6073b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor // Recurse into protocols. 6074b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor const ObjCList<ObjCProtocolDecl> &Protocols 6075b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor = Protocol->getReferencedProtocols(); 6076b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 6077b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor E = Protocols.end(); 6078b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor I != E; ++I) 6079b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType, 6080b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor KnownMethods, false); 6081e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 6082e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6083e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Add methods in this container. This operation occurs last because 6084e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // we want the methods from this container to override any methods 6085e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // we've previously seen with the same selector. 6086e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor for (ObjCContainerDecl::method_iterator M = Container->meth_begin(), 6087e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor MEnd = Container->meth_end(); 6088e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor M != MEnd; ++M) { 6089262bc18e32500558af7cb0afa205b34bd37bafedDavid Blaikie if (M->isInstanceMethod() == WantInstanceMethods) { 6090e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (!ReturnType.isNull() && 6091262bc18e32500558af7cb0afa205b34bd37bafedDavid Blaikie !Context.hasSameUnqualifiedType(ReturnType, M->getResultType())) 6092e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor continue; 6093e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6094581deb3da481053c4993c7600f97acf7768caac5David Blaikie KnownMethods[M->getSelector()] = std::make_pair(*M, InOriginalClass); 6095e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 6096e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 6097e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor} 6098e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6099577cdfdb20840350e841a483df630237326126d5Douglas Gregor/// \brief Add the parenthesized return or parameter type chunk to a code 6100577cdfdb20840350e841a483df630237326126d5Douglas Gregor/// completion string. 6101577cdfdb20840350e841a483df630237326126d5Douglas Gregorstatic void AddObjCPassingTypeChunk(QualType Type, 610290f5f47348b6581eab5d42eaeacf7f2b28b8118fDouglas Gregor unsigned ObjCDeclQuals, 6103577cdfdb20840350e841a483df630237326126d5Douglas Gregor ASTContext &Context, 61048987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor const PrintingPolicy &Policy, 6105577cdfdb20840350e841a483df630237326126d5Douglas Gregor CodeCompletionBuilder &Builder) { 6106577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 610790f5f47348b6581eab5d42eaeacf7f2b28b8118fDouglas Gregor std::string Quals = formatObjCParamQualifiers(ObjCDeclQuals); 610890f5f47348b6581eab5d42eaeacf7f2b28b8118fDouglas Gregor if (!Quals.empty()) 610990f5f47348b6581eab5d42eaeacf7f2b28b8118fDouglas Gregor Builder.AddTextChunk(Builder.getAllocator().CopyString(Quals)); 61108987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor Builder.AddTextChunk(GetCompletionTypeString(Type, Context, Policy, 6111577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.getAllocator())); 6112577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6113577cdfdb20840350e841a483df630237326126d5Douglas Gregor} 6114577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6115577cdfdb20840350e841a483df630237326126d5Douglas Gregor/// \brief Determine whether the given class is or inherits from a class by 6116577cdfdb20840350e841a483df630237326126d5Douglas Gregor/// the given name. 6117577cdfdb20840350e841a483df630237326126d5Douglas Gregorstatic bool InheritsFromClassNamed(ObjCInterfaceDecl *Class, 61185f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef Name) { 6119577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (!Class) 6120577cdfdb20840350e841a483df630237326126d5Douglas Gregor return false; 6121577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6122577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (Class->getIdentifier() && Class->getIdentifier()->getName() == Name) 6123577cdfdb20840350e841a483df630237326126d5Douglas Gregor return true; 6124577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6125577cdfdb20840350e841a483df630237326126d5Douglas Gregor return InheritsFromClassNamed(Class->getSuperClass(), Name); 6126577cdfdb20840350e841a483df630237326126d5Douglas Gregor} 6127577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6128577cdfdb20840350e841a483df630237326126d5Douglas Gregor/// \brief Add code completions for Objective-C Key-Value Coding (KVC) and 6129577cdfdb20840350e841a483df630237326126d5Douglas Gregor/// Key-Value Observing (KVO). 6130577cdfdb20840350e841a483df630237326126d5Douglas Gregorstatic void AddObjCKeyValueCompletions(ObjCPropertyDecl *Property, 6131577cdfdb20840350e841a483df630237326126d5Douglas Gregor bool IsInstanceMethod, 6132577cdfdb20840350e841a483df630237326126d5Douglas Gregor QualType ReturnType, 6133577cdfdb20840350e841a483df630237326126d5Douglas Gregor ASTContext &Context, 6134e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor VisitedSelectorSet &KnownSelectors, 6135577cdfdb20840350e841a483df630237326126d5Douglas Gregor ResultBuilder &Results) { 6136577cdfdb20840350e841a483df630237326126d5Douglas Gregor IdentifierInfo *PropName = Property->getIdentifier(); 6137577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (!PropName || PropName->getLength() == 0) 6138577cdfdb20840350e841a483df630237326126d5Douglas Gregor return; 6139577cdfdb20840350e841a483df630237326126d5Douglas Gregor 61408987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor PrintingPolicy Policy = getCompletionPrintingPolicy(Results.getSema()); 61418987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor 6142577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Builder that will create each code completion. 6143577cdfdb20840350e841a483df630237326126d5Douglas Gregor typedef CodeCompletionResult Result; 6144577cdfdb20840350e841a483df630237326126d5Douglas Gregor CodeCompletionAllocator &Allocator = Results.getAllocator(); 614528a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo()); 6146577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6147577cdfdb20840350e841a483df630237326126d5Douglas Gregor // The selector table. 6148577cdfdb20840350e841a483df630237326126d5Douglas Gregor SelectorTable &Selectors = Context.Selectors; 6149577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6150577cdfdb20840350e841a483df630237326126d5Douglas Gregor // The property name, copied into the code completion allocation region 6151577cdfdb20840350e841a483df630237326126d5Douglas Gregor // on demand. 6152577cdfdb20840350e841a483df630237326126d5Douglas Gregor struct KeyHolder { 6153577cdfdb20840350e841a483df630237326126d5Douglas Gregor CodeCompletionAllocator &Allocator; 61545f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef Key; 6155577cdfdb20840350e841a483df630237326126d5Douglas Gregor const char *CopiedKey; 6156577cdfdb20840350e841a483df630237326126d5Douglas Gregor 61575f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner KeyHolder(CodeCompletionAllocator &Allocator, StringRef Key) 6158577cdfdb20840350e841a483df630237326126d5Douglas Gregor : Allocator(Allocator), Key(Key), CopiedKey(0) { } 6159577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6160577cdfdb20840350e841a483df630237326126d5Douglas Gregor operator const char *() { 6161577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (CopiedKey) 6162577cdfdb20840350e841a483df630237326126d5Douglas Gregor return CopiedKey; 6163577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6164577cdfdb20840350e841a483df630237326126d5Douglas Gregor return CopiedKey = Allocator.CopyString(Key); 6165577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6166577cdfdb20840350e841a483df630237326126d5Douglas Gregor } Key(Allocator, PropName->getName()); 6167577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6168577cdfdb20840350e841a483df630237326126d5Douglas Gregor // The uppercased name of the property name. 6169577cdfdb20840350e841a483df630237326126d5Douglas Gregor std::string UpperKey = PropName->getName(); 6170577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (!UpperKey.empty()) 6171577cdfdb20840350e841a483df630237326126d5Douglas Gregor UpperKey[0] = toupper(UpperKey[0]); 6172577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6173577cdfdb20840350e841a483df630237326126d5Douglas Gregor bool ReturnTypeMatchesProperty = ReturnType.isNull() || 6174577cdfdb20840350e841a483df630237326126d5Douglas Gregor Context.hasSameUnqualifiedType(ReturnType.getNonReferenceType(), 6175577cdfdb20840350e841a483df630237326126d5Douglas Gregor Property->getType()); 6176577cdfdb20840350e841a483df630237326126d5Douglas Gregor bool ReturnTypeMatchesVoid 6177577cdfdb20840350e841a483df630237326126d5Douglas Gregor = ReturnType.isNull() || ReturnType->isVoidType(); 6178577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6179577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Add the normal accessor -(type)key. 6180577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && 6181e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor KnownSelectors.insert(Selectors.getNullarySelector(PropName)) && 6182577cdfdb20840350e841a483df630237326126d5Douglas Gregor ReturnTypeMatchesProperty && !Property->getGetterMethodDecl()) { 6183577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) 618490f5f47348b6581eab5d42eaeacf7f2b28b8118fDouglas Gregor AddObjCPassingTypeChunk(Property->getType(), /*Quals=*/0, 618590f5f47348b6581eab5d42eaeacf7f2b28b8118fDouglas Gregor Context, Policy, Builder); 6186577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6187577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Key); 6188577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern, 6189577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6190577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6191577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6192577cdfdb20840350e841a483df630237326126d5Douglas Gregor // If we have an integral or boolean property (or the user has provided 6193577cdfdb20840350e841a483df630237326126d5Douglas Gregor // an integral or boolean return type), add the accessor -(type)isKey. 6194577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && 6195577cdfdb20840350e841a483df630237326126d5Douglas Gregor ((!ReturnType.isNull() && 6196577cdfdb20840350e841a483df630237326126d5Douglas Gregor (ReturnType->isIntegerType() || ReturnType->isBooleanType())) || 6197577cdfdb20840350e841a483df630237326126d5Douglas Gregor (ReturnType.isNull() && 6198577cdfdb20840350e841a483df630237326126d5Douglas Gregor (Property->getType()->isIntegerType() || 6199577cdfdb20840350e841a483df630237326126d5Douglas Gregor Property->getType()->isBooleanType())))) { 62005f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::string SelectorName = (Twine("is") + UpperKey).str(); 62016204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6202e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))) { 6203577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6204577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6205577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("BOOL"); 6206577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6207577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6208577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6209577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk( 6210577cdfdb20840350e841a483df630237326126d5Douglas Gregor Allocator.CopyString(SelectorId->getName())); 6211577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern, 6212577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6213577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6214577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6215577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6216577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Add the normal mutator. 6217577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid && 6218577cdfdb20840350e841a483df630237326126d5Douglas Gregor !Property->getSetterMethodDecl()) { 62195f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::string SelectorName = (Twine("set") + UpperKey).str(); 62206204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6221e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6222577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6223577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6224577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6225577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6226577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6227577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6228577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk( 6229577cdfdb20840350e841a483df630237326126d5Douglas Gregor Allocator.CopyString(SelectorId->getName())); 6230577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(":"); 623190f5f47348b6581eab5d42eaeacf7f2b28b8118fDouglas Gregor AddObjCPassingTypeChunk(Property->getType(), /*Quals=*/0, 623290f5f47348b6581eab5d42eaeacf7f2b28b8118fDouglas Gregor Context, Policy, Builder); 6233577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk(Key); 6234577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern, 6235577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6236577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6237577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6238577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6239577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Indexed and unordered accessors 6240577cdfdb20840350e841a483df630237326126d5Douglas Gregor unsigned IndexedGetterPriority = CCP_CodePattern; 6241577cdfdb20840350e841a483df630237326126d5Douglas Gregor unsigned IndexedSetterPriority = CCP_CodePattern; 6242577cdfdb20840350e841a483df630237326126d5Douglas Gregor unsigned UnorderedGetterPriority = CCP_CodePattern; 6243577cdfdb20840350e841a483df630237326126d5Douglas Gregor unsigned UnorderedSetterPriority = CCP_CodePattern; 6244577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (const ObjCObjectPointerType *ObjCPointer 6245577cdfdb20840350e841a483df630237326126d5Douglas Gregor = Property->getType()->getAs<ObjCObjectPointerType>()) { 6246577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ObjCInterfaceDecl *IFace = ObjCPointer->getInterfaceDecl()) { 6247577cdfdb20840350e841a483df630237326126d5Douglas Gregor // If this interface type is not provably derived from a known 6248577cdfdb20840350e841a483df630237326126d5Douglas Gregor // collection, penalize the corresponding completions. 6249577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (!InheritsFromClassNamed(IFace, "NSMutableArray")) { 6250577cdfdb20840350e841a483df630237326126d5Douglas Gregor IndexedSetterPriority += CCD_ProbablyNotObjCCollection; 6251577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (!InheritsFromClassNamed(IFace, "NSArray")) 6252577cdfdb20840350e841a483df630237326126d5Douglas Gregor IndexedGetterPriority += CCD_ProbablyNotObjCCollection; 6253577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6254577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6255577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (!InheritsFromClassNamed(IFace, "NSMutableSet")) { 6256577cdfdb20840350e841a483df630237326126d5Douglas Gregor UnorderedSetterPriority += CCD_ProbablyNotObjCCollection; 6257577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (!InheritsFromClassNamed(IFace, "NSSet")) 6258577cdfdb20840350e841a483df630237326126d5Douglas Gregor UnorderedGetterPriority += CCD_ProbablyNotObjCCollection; 6259577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6260577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6261577cdfdb20840350e841a483df630237326126d5Douglas Gregor } else { 6262577cdfdb20840350e841a483df630237326126d5Douglas Gregor IndexedGetterPriority += CCD_ProbablyNotObjCCollection; 6263577cdfdb20840350e841a483df630237326126d5Douglas Gregor IndexedSetterPriority += CCD_ProbablyNotObjCCollection; 6264577cdfdb20840350e841a483df630237326126d5Douglas Gregor UnorderedGetterPriority += CCD_ProbablyNotObjCCollection; 6265577cdfdb20840350e841a483df630237326126d5Douglas Gregor UnorderedSetterPriority += CCD_ProbablyNotObjCCollection; 6266577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6267577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6268577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Add -(NSUInteger)countOf<key> 6269577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && 6270577cdfdb20840350e841a483df630237326126d5Douglas Gregor (ReturnType.isNull() || ReturnType->isIntegerType())) { 62715f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::string SelectorName = (Twine("countOf") + UpperKey).str(); 62726204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6273e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))) { 6274577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6275577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6276577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSUInteger"); 6277577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6278577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6279577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6280577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk( 6281577cdfdb20840350e841a483df630237326126d5Douglas Gregor Allocator.CopyString(SelectorId->getName())); 6282577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), 6283577cdfdb20840350e841a483df630237326126d5Douglas Gregor std::min(IndexedGetterPriority, 6284577cdfdb20840350e841a483df630237326126d5Douglas Gregor UnorderedGetterPriority), 6285577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6286577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6287577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6288577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6289577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Indexed getters 6290577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Add -(id)objectInKeyAtIndex:(NSUInteger)index 6291577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && 6292577cdfdb20840350e841a483df630237326126d5Douglas Gregor (ReturnType.isNull() || ReturnType->isObjCObjectPointerType())) { 62936204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor std::string SelectorName 62945f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner = (Twine("objectIn") + UpperKey + "AtIndex").str(); 62956204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6296e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6297577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6298577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6299577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("id"); 6300577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6301577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6302577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6303577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6304577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6305577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSUInteger"); 6306577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6307577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("index"); 6308577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority, 6309577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6310577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6311577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6312577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6313577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Add -(NSArray *)keyAtIndexes:(NSIndexSet *)indexes 6314577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && 6315577cdfdb20840350e841a483df630237326126d5Douglas Gregor (ReturnType.isNull() || 6316577cdfdb20840350e841a483df630237326126d5Douglas Gregor (ReturnType->isObjCObjectPointerType() && 6317577cdfdb20840350e841a483df630237326126d5Douglas Gregor ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() && 6318577cdfdb20840350e841a483df630237326126d5Douglas Gregor ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() 6319577cdfdb20840350e841a483df630237326126d5Douglas Gregor ->getName() == "NSArray"))) { 63206204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor std::string SelectorName 63215f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner = (Twine(Property->getName()) + "AtIndexes").str(); 63226204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6323e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6324577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6325577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6326577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSArray *"); 6327577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6328577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6329577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6330577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6331577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6332577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSIndexSet *"); 6333577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6334577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("indexes"); 6335577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority, 6336577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6337577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6338577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6339577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6340577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Add -(void)getKey:(type **)buffer range:(NSRange)inRange 6341577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid) { 63425f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::string SelectorName = (Twine("get") + UpperKey).str(); 6343577cdfdb20840350e841a483df630237326126d5Douglas Gregor IdentifierInfo *SelectorIds[2] = { 63446204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor &Context.Idents.get(SelectorName), 6345577cdfdb20840350e841a483df630237326126d5Douglas Gregor &Context.Idents.get("range") 6346577cdfdb20840350e841a483df630237326126d5Douglas Gregor }; 6347577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6348e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds))) { 6349577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6350577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6351577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6352577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6353577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6354577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6355577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6356577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6357577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddPlaceholderChunk("object-type"); 6358577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk(" **"); 6359577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6360577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("buffer"); 6361577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6362577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk("range:"); 6363577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6364577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSRange"); 6365577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6366577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("inRange"); 6367577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority, 6368577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6369577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6370577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6371577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6372577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Mutable indexed accessors 6373577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6374577cdfdb20840350e841a483df630237326126d5Douglas Gregor // - (void)insertObject:(type *)object inKeyAtIndex:(NSUInteger)index 6375577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid) { 63765f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::string SelectorName = (Twine("in") + UpperKey + "AtIndex").str(); 6377577cdfdb20840350e841a483df630237326126d5Douglas Gregor IdentifierInfo *SelectorIds[2] = { 6378577cdfdb20840350e841a483df630237326126d5Douglas Gregor &Context.Idents.get("insertObject"), 63796204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor &Context.Idents.get(SelectorName) 6380577cdfdb20840350e841a483df630237326126d5Douglas Gregor }; 6381577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6382e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds))) { 6383577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6384577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6385577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6386577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6387577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6388577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6389577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk("insertObject:"); 6390577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6391577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddPlaceholderChunk("object-type"); 6392577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk(" *"); 6393577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6394577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("object"); 6395577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6396577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6397577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6398577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddPlaceholderChunk("NSUInteger"); 6399577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6400577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("index"); 6401577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 6402577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6403577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6404577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6405577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6406577cdfdb20840350e841a483df630237326126d5Douglas Gregor // - (void)insertKey:(NSArray *)array atIndexes:(NSIndexSet *)indexes 6407577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid) { 64085f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::string SelectorName = (Twine("insert") + UpperKey).str(); 6409577cdfdb20840350e841a483df630237326126d5Douglas Gregor IdentifierInfo *SelectorIds[2] = { 64106204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor &Context.Idents.get(SelectorName), 6411577cdfdb20840350e841a483df630237326126d5Douglas Gregor &Context.Idents.get("atIndexes") 6412577cdfdb20840350e841a483df630237326126d5Douglas Gregor }; 6413577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6414e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds))) { 6415577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6416577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6417577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6418577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6419577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6420577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6421577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6422577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6423577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSArray *"); 6424577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6425577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("array"); 6426577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6427577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk("atIndexes:"); 6428577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6429577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddPlaceholderChunk("NSIndexSet *"); 6430577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6431577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("indexes"); 6432577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 6433577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6434577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6435577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6436577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6437577cdfdb20840350e841a483df630237326126d5Douglas Gregor // -(void)removeObjectFromKeyAtIndex:(NSUInteger)index 6438577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid) { 64396204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor std::string SelectorName 64405f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner = (Twine("removeObjectFrom") + UpperKey + "AtIndex").str(); 64416204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6442e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6443577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6444577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6445577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6446577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6447577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6448577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6449577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6450577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6451577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSUInteger"); 6452577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6453577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("index"); 6454577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 6455577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6456577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6457577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6458577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6459577cdfdb20840350e841a483df630237326126d5Douglas Gregor // -(void)removeKeyAtIndexes:(NSIndexSet *)indexes 6460577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid) { 64616204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor std::string SelectorName 64625f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner = (Twine("remove") + UpperKey + "AtIndexes").str(); 64636204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6464e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6465577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6466577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6467577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6468577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6469577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6470577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6471577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6472577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6473577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSIndexSet *"); 6474577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6475577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("indexes"); 6476577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 6477577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6478577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6479577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6480577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6481577cdfdb20840350e841a483df630237326126d5Douglas Gregor // - (void)replaceObjectInKeyAtIndex:(NSUInteger)index withObject:(id)object 6482577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid) { 64836204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor std::string SelectorName 64845f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner = (Twine("replaceObjectIn") + UpperKey + "AtIndex").str(); 6485577cdfdb20840350e841a483df630237326126d5Douglas Gregor IdentifierInfo *SelectorIds[2] = { 64866204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor &Context.Idents.get(SelectorName), 6487577cdfdb20840350e841a483df630237326126d5Douglas Gregor &Context.Idents.get("withObject") 6488577cdfdb20840350e841a483df630237326126d5Douglas Gregor }; 6489577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6490e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds))) { 6491577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6492577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6493577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6494577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6495577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6496577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6497577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6498577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6499577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddPlaceholderChunk("NSUInteger"); 6500577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6501577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("index"); 6502577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6503577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk("withObject:"); 6504577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6505577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("id"); 6506577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6507577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("object"); 6508577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 6509577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6510577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6511577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6512577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6513577cdfdb20840350e841a483df630237326126d5Douglas Gregor // - (void)replaceKeyAtIndexes:(NSIndexSet *)indexes withKey:(NSArray *)array 6514577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid) { 65156204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor std::string SelectorName1 65165f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner = (Twine("replace") + UpperKey + "AtIndexes").str(); 65175f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::string SelectorName2 = (Twine("with") + UpperKey).str(); 6518577cdfdb20840350e841a483df630237326126d5Douglas Gregor IdentifierInfo *SelectorIds[2] = { 65196204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor &Context.Idents.get(SelectorName1), 65206204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor &Context.Idents.get(SelectorName2) 6521577cdfdb20840350e841a483df630237326126d5Douglas Gregor }; 6522577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6523e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds))) { 6524577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6525577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6526577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6527577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6528577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6529577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6530577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName1 + ":")); 6531577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6532577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddPlaceholderChunk("NSIndexSet *"); 6533577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6534577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("indexes"); 6535577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6536577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName2 + ":")); 6537577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6538577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSArray *"); 6539577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6540577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("array"); 6541577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 6542577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6543577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6544577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6545577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6546577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Unordered getters 6547577cdfdb20840350e841a483df630237326126d5Douglas Gregor // - (NSEnumerator *)enumeratorOfKey 6548577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && 6549577cdfdb20840350e841a483df630237326126d5Douglas Gregor (ReturnType.isNull() || 6550577cdfdb20840350e841a483df630237326126d5Douglas Gregor (ReturnType->isObjCObjectPointerType() && 6551577cdfdb20840350e841a483df630237326126d5Douglas Gregor ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() && 6552577cdfdb20840350e841a483df630237326126d5Douglas Gregor ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() 6553577cdfdb20840350e841a483df630237326126d5Douglas Gregor ->getName() == "NSEnumerator"))) { 65545f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::string SelectorName = (Twine("enumeratorOf") + UpperKey).str(); 65556204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6556e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))) { 6557577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6558577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6559577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSEnumerator *"); 6560577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6561577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6562577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6563577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName)); 6564577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), UnorderedGetterPriority, 6565577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6566577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6567577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6568577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6569577cdfdb20840350e841a483df630237326126d5Douglas Gregor // - (type *)memberOfKey:(type *)object 6570577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && 6571577cdfdb20840350e841a483df630237326126d5Douglas Gregor (ReturnType.isNull() || ReturnType->isObjCObjectPointerType())) { 65725f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::string SelectorName = (Twine("memberOf") + UpperKey).str(); 65736204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6574e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6575577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6576577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6577577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddPlaceholderChunk("object-type"); 6578577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk(" *"); 6579577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6580577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6581577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6582577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6583577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6584577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6585577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddPlaceholderChunk("object-type"); 6586577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk(" *"); 6587577cdfdb20840350e841a483df630237326126d5Douglas Gregor } else { 6588577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk(GetCompletionTypeString(ReturnType, Context, 65898987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor Policy, 6590577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.getAllocator())); 6591577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6592577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6593577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("object"); 6594577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), UnorderedGetterPriority, 6595577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6596577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6597577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6598577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6599577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Mutable unordered accessors 6600577cdfdb20840350e841a483df630237326126d5Douglas Gregor // - (void)addKeyObject:(type *)object 6601577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid) { 66026204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor std::string SelectorName 66035f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner = (Twine("add") + UpperKey + Twine("Object")).str(); 66046204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6605e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6606577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6607577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6608577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6609577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6610577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6611577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6612577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6613577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6614577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddPlaceholderChunk("object-type"); 6615577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk(" *"); 6616577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6617577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("object"); 6618577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority, 6619577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6620577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6621577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6622577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6623577cdfdb20840350e841a483df630237326126d5Douglas Gregor // - (void)addKey:(NSSet *)objects 6624577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid) { 66255f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::string SelectorName = (Twine("add") + UpperKey).str(); 66266204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6627e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6628577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6629577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6630577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6631577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6632577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6633577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6634577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6635577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6636577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSSet *"); 6637577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6638577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("objects"); 6639577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority, 6640577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6641577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6642577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6643577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6644577cdfdb20840350e841a483df630237326126d5Douglas Gregor // - (void)removeKeyObject:(type *)object 6645577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid) { 66466204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor std::string SelectorName 66475f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner = (Twine("remove") + UpperKey + Twine("Object")).str(); 66486204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6649e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6650577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6651577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6652577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6653577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6654577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6655577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6656577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6657577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6658577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddPlaceholderChunk("object-type"); 6659577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk(" *"); 6660577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6661577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("object"); 6662577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority, 6663577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6664577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6665577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6666577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6667577cdfdb20840350e841a483df630237326126d5Douglas Gregor // - (void)removeKey:(NSSet *)objects 6668577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid) { 66695f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::string SelectorName = (Twine("remove") + UpperKey).str(); 66706204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6671e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6672577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6673577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6674577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6675577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6676577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6677577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6678577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6679577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6680577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSSet *"); 6681577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6682577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("objects"); 6683577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority, 6684577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6685577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6686577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6687577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6688577cdfdb20840350e841a483df630237326126d5Douglas Gregor // - (void)intersectKey:(NSSet *)objects 6689577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid) { 66905f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::string SelectorName = (Twine("intersect") + UpperKey).str(); 66916204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6692e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6693577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6694577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6695577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6696577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6697577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6698577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6699577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6700577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6701577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSSet *"); 6702577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6703577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("objects"); 6704577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority, 6705577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6706577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6707577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6708577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6709577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Key-Value Observing 6710577cdfdb20840350e841a483df630237326126d5Douglas Gregor // + (NSSet *)keyPathsForValuesAffectingKey 6711577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (!IsInstanceMethod && 6712577cdfdb20840350e841a483df630237326126d5Douglas Gregor (ReturnType.isNull() || 6713577cdfdb20840350e841a483df630237326126d5Douglas Gregor (ReturnType->isObjCObjectPointerType() && 6714577cdfdb20840350e841a483df630237326126d5Douglas Gregor ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() && 6715577cdfdb20840350e841a483df630237326126d5Douglas Gregor ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() 6716577cdfdb20840350e841a483df630237326126d5Douglas Gregor ->getName() == "NSSet"))) { 67176204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor std::string SelectorName 67185f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner = (Twine("keyPathsForValuesAffecting") + UpperKey).str(); 67196204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6720e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))) { 6721577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6722577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6723577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSSet *"); 6724577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6725577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6726577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6727577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName)); 6728577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern, 67293f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor CXCursor_ObjCClassMethodDecl)); 67303f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor } 67313f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor } 67323f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor 67333f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor // + (BOOL)automaticallyNotifiesObserversForKey 67343f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor if (!IsInstanceMethod && 67353f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor (ReturnType.isNull() || 67363f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor ReturnType->isIntegerType() || 67373f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor ReturnType->isBooleanType())) { 67383f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor std::string SelectorName 67395f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner = (Twine("automaticallyNotifiesObserversOf") + UpperKey).str(); 67403f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 67413f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))) { 67423f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor if (ReturnType.isNull()) { 67433f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 67443f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor Builder.AddTextChunk("BOOL"); 67453f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 67463f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor } 67473f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor 67483f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName)); 67493f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern, 67503f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor CXCursor_ObjCClassMethodDecl)); 6751577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6752577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6753577cdfdb20840350e841a483df630237326126d5Douglas Gregor} 6754577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6755e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregorvoid Sema::CodeCompleteObjCMethodDecl(Scope *S, 6756e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor bool IsInstanceMethod, 6757a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian ParsedType ReturnTy) { 6758e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Determine the return type of the method we're declaring, if 6759e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // provided. 6760e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor QualType ReturnType = GetTypeFromParser(ReturnTy); 6761a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian Decl *IDecl = 0; 6762a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian if (CurContext->isObjCContainer()) { 6763a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian ObjCContainerDecl *OCD = dyn_cast<ObjCContainerDecl>(CurContext); 6764a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian IDecl = cast<Decl>(OCD); 6765a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian } 6766ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor // Determine where we should start searching for methods. 6767ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor ObjCContainerDecl *SearchDecl = 0; 6768e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor bool IsInImplementation = false; 6769d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall if (Decl *D = IDecl) { 6770e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (ObjCImplementationDecl *Impl = dyn_cast<ObjCImplementationDecl>(D)) { 6771e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor SearchDecl = Impl->getClassInterface(); 6772e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor IsInImplementation = true; 6773e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } else if (ObjCCategoryImplDecl *CatImpl 6774ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor = dyn_cast<ObjCCategoryImplDecl>(D)) { 6775e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor SearchDecl = CatImpl->getCategoryDecl(); 6776e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor IsInImplementation = true; 6777ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor } else 6778e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor SearchDecl = dyn_cast<ObjCContainerDecl>(D); 6779e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 6780e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6781e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (!SearchDecl && S) { 6782ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor if (DeclContext *DC = static_cast<DeclContext *>(S->getEntity())) 6783e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor SearchDecl = dyn_cast<ObjCContainerDecl>(DC); 6784e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 6785e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6786ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor if (!SearchDecl) { 6787e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 6788e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 6789e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor 0, 0); 6790e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor return; 6791e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 6792e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6793e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Find all of the methods that we could declare/implement here. 6794e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor KnownMethodsMap KnownMethods; 6795e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor FindImplementableMethods(Context, SearchDecl, IsInstanceMethod, 6796ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor ReturnType, KnownMethods); 6797e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6798e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Add declarations or definitions for each of the known methods. 67990a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 6800218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 680128a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 6802218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 6803e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Results.EnterNewScope(); 68048987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor PrintingPolicy Policy = getCompletionPrintingPolicy(*this); 6805e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor for (KnownMethodsMap::iterator M = KnownMethods.begin(), 6806e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor MEnd = KnownMethods.end(); 6807e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor M != MEnd; ++M) { 6808408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor ObjCMethodDecl *Method = M->second.first; 680928a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Builder(Results.getAllocator(), 681028a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis Results.getCodeCompletionTUInfo()); 6811e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6812e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // If the result type was not already provided, add it to the 6813e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // pattern as (type). 6814577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) 681590f5f47348b6581eab5d42eaeacf7f2b28b8118fDouglas Gregor AddObjCPassingTypeChunk(Method->getResultType(), 681690f5f47348b6581eab5d42eaeacf7f2b28b8118fDouglas Gregor Method->getObjCDeclQualifier(), 681790f5f47348b6581eab5d42eaeacf7f2b28b8118fDouglas Gregor Context, Policy, 681890f5f47348b6581eab5d42eaeacf7f2b28b8118fDouglas Gregor Builder); 6819e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6820e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Selector Sel = Method->getSelector(); 6821e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6822e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Add the first part of the selector to the pattern. 6823dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddTypedTextChunk(Builder.getAllocator().CopyString( 6824813d8346529bf094eb2b249648906ba7fd226688Douglas Gregor Sel.getNameForSlot(0))); 6825e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6826e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Add parameters to the pattern. 6827e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor unsigned I = 0; 6828e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor for (ObjCMethodDecl::param_iterator P = Method->param_begin(), 6829e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor PEnd = Method->param_end(); 6830e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor P != PEnd; (void)++P, ++I) { 6831e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Add the part of the selector name. 6832e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (I == 0) 6833218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk(":"); 6834e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor else if (I < Sel.getNumArgs()) { 6835218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6836218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk( 6837813d8346529bf094eb2b249648906ba7fd226688Douglas Gregor Builder.getAllocator().CopyString(Sel.getNameForSlot(I) + ":")); 6838e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } else 6839e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor break; 6840e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6841e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Add the parameter type. 684290f5f47348b6581eab5d42eaeacf7f2b28b8118fDouglas Gregor AddObjCPassingTypeChunk((*P)->getOriginalType(), 684390f5f47348b6581eab5d42eaeacf7f2b28b8118fDouglas Gregor (*P)->getObjCDeclQualifier(), 684490f5f47348b6581eab5d42eaeacf7f2b28b8118fDouglas Gregor Context, Policy, 68458987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor Builder); 6846e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6847e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (IdentifierInfo *Id = (*P)->getIdentifier()) 6848dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddTextChunk(Builder.getAllocator().CopyString( Id->getName())); 6849e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 6850e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6851e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (Method->isVariadic()) { 6852e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (Method->param_size() > 0) 6853218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_Comma); 6854218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("..."); 6855e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor } 6856e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6857447107dfff705ab79d1dbf33ce79b524d63572fdDouglas Gregor if (IsInImplementation && Results.includeCodePatterns()) { 6858e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // We will be defining the method here, so add a compound statement. 6859218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6860218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 6861218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 6862e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (!Method->getResultType()->isVoidType()) { 6863e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // If the result type is not void, add a return clause. 6864218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("return"); 6865218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6866218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 6867218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_SemiColon); 6868e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } else 6869218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("statements"); 6870e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6871218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 6872218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 6873e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 6874e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6875408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor unsigned Priority = CCP_CodePattern; 6876408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor if (!M->second.second) 6877408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor Priority += CCD_InBaseClass; 6878408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor 6879ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor Results.AddResult(Result(Builder.TakeString(), Method, Priority)); 6880e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 6881e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6882577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Add Key-Value-Coding and Key-Value-Observing accessor methods for all of 6883577cdfdb20840350e841a483df630237326126d5Douglas Gregor // the properties in this class and its categories. 68844e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (Context.getLangOpts().ObjC2) { 68855f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<ObjCContainerDecl *, 4> Containers; 6886577cdfdb20840350e841a483df630237326126d5Douglas Gregor Containers.push_back(SearchDecl); 6887577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6888e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor VisitedSelectorSet KnownSelectors; 6889e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor for (KnownMethodsMap::iterator M = KnownMethods.begin(), 6890e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor MEnd = KnownMethods.end(); 6891e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor M != MEnd; ++M) 6892e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor KnownSelectors.insert(M->first); 6893e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor 6894e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor 6895577cdfdb20840350e841a483df630237326126d5Douglas Gregor ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(SearchDecl); 6896577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (!IFace) 6897577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(SearchDecl)) 6898577cdfdb20840350e841a483df630237326126d5Douglas Gregor IFace = Category->getClassInterface(); 6899577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6900577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IFace) { 6901577cdfdb20840350e841a483df630237326126d5Douglas Gregor for (ObjCCategoryDecl *Category = IFace->getCategoryList(); Category; 6902577cdfdb20840350e841a483df630237326126d5Douglas Gregor Category = Category->getNextClassCategory()) 6903577cdfdb20840350e841a483df630237326126d5Douglas Gregor Containers.push_back(Category); 6904577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6905577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6906577cdfdb20840350e841a483df630237326126d5Douglas Gregor for (unsigned I = 0, N = Containers.size(); I != N; ++I) { 6907577cdfdb20840350e841a483df630237326126d5Douglas Gregor for (ObjCContainerDecl::prop_iterator P = Containers[I]->prop_begin(), 6908577cdfdb20840350e841a483df630237326126d5Douglas Gregor PEnd = Containers[I]->prop_end(); 6909577cdfdb20840350e841a483df630237326126d5Douglas Gregor P != PEnd; ++P) { 6910581deb3da481053c4993c7600f97acf7768caac5David Blaikie AddObjCKeyValueCompletions(*P, IsInstanceMethod, ReturnType, Context, 6911e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor KnownSelectors, Results); 6912577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6913577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6914577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6915577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6916e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Results.ExitScope(); 6917e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6918e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 6919e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 6920e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 6921e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor} 69221f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 69231f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregorvoid Sema::CodeCompleteObjCMethodDeclSelector(Scope *S, 69241f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor bool IsInstanceMethod, 692540ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor bool AtParameterName, 6926b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall ParsedType ReturnTy, 69271f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor IdentifierInfo **SelIdents, 69281f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor unsigned NumSelIdents) { 69291f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor // If we have an external source, load the entire class method 69303c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl // pool from the AST file. 69311f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor if (ExternalSource) { 69321f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors(); 69331f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor I != N; ++I) { 69341f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor Selector Sel = ExternalSource->GetExternalSelector(I); 6935db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl if (Sel.isNull() || MethodPool.count(Sel)) 69361f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor continue; 6937db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl 6938db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl ReadMethodPool(Sel); 69391f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor } 69401f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor } 69411f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 69421f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor // Build the set of methods we can see. 69430a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 6944218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 694528a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 6946218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 69471f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 69481f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor if (ReturnTy) 69491f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor Results.setPreferredType(GetTypeFromParser(ReturnTy).getNonReferenceType()); 6950db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl 69511f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor Results.EnterNewScope(); 6952db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl for (GlobalMethodPool::iterator M = MethodPool.begin(), 6953db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl MEnd = MethodPool.end(); 6954db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl M != MEnd; ++M) { 6955db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl for (ObjCMethodList *MethList = IsInstanceMethod ? &M->second.first : 6956db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl &M->second.second; 6957db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl MethList && MethList->Method; 69581f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor MethList = MethList->Next) { 69591f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor if (!isAcceptableObjCMethod(MethList->Method, MK_Any, SelIdents, 69601f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor NumSelIdents)) 69611f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor continue; 69621f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 696340ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor if (AtParameterName) { 696440ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor // Suggest parameter names we've seen before. 696540ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor if (NumSelIdents && NumSelIdents <= MethList->Method->param_size()) { 696640ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor ParmVarDecl *Param = MethList->Method->param_begin()[NumSelIdents-1]; 696740ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor if (Param->getIdentifier()) { 696828a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Builder(Results.getAllocator(), 696928a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis Results.getCodeCompletionTUInfo()); 6970dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddTypedTextChunk(Builder.getAllocator().CopyString( 6971218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Param->getIdentifier()->getName())); 6972218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 697340ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor } 697440ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor } 697540ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor 697640ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor continue; 697740ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor } 697840ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor 69791f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor Result R(MethList->Method, 0); 69801f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor R.StartParameter = NumSelIdents; 69811f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor R.AllParametersAreInformative = false; 69821f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor R.DeclaringEntity = true; 69831f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor Results.MaybeAddResult(R, CurContext); 69841f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor } 69851f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor } 69861f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 69871f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor Results.ExitScope(); 6988e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 6989e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 6990e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 69911f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor} 699287c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor 6993f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregorvoid Sema::CodeCompletePreprocessorDirective(bool InConditional) { 6994218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 699528a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 699652779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor CodeCompletionContext::CCC_PreprocessorDirective); 6997f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor Results.EnterNewScope(); 6998f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 6999f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #if <condition> 700028a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Builder(Results.getAllocator(), 700128a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis Results.getCodeCompletionTUInfo()); 7002218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("if"); 7003218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7004218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("condition"); 7005218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 7006f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 7007f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #ifdef <macro> 7008218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("ifdef"); 7009218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7010218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("macro"); 7011218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 7012218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor 7013f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #ifndef <macro> 7014218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("ifndef"); 7015218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7016218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("macro"); 7017218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 7018f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 7019f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor if (InConditional) { 7020f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #elif <condition> 7021218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("elif"); 7022218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7023218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("condition"); 7024218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 7025f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 7026f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #else 7027218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("else"); 7028218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 7029f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 7030f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #endif 7031218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("endif"); 7032218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 7033f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor } 7034f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 7035f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #include "header" 7036218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("include"); 7037218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7038218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("\""); 7039218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("header"); 7040218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("\""); 7041218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 7042f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 7043f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #include <header> 7044218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("include"); 7045218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7046218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("<"); 7047218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("header"); 7048218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk(">"); 7049218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 7050f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 7051f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #define <macro> 7052218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("define"); 7053218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7054218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("macro"); 7055218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 7056f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 7057f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #define <macro>(<args>) 7058218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("define"); 7059218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7060218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("macro"); 7061218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 7062218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("args"); 7063218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 7064218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 7065f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 7066f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #undef <macro> 7067218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("undef"); 7068218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7069218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("macro"); 7070218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 7071f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 7072f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #line <number> 7073218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("line"); 7074218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7075218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("number"); 7076218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 7077f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 7078f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #line <number> "filename" 7079218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("line"); 7080218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7081218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("number"); 7082218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7083218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("\""); 7084218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("filename"); 7085218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("\""); 7086218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 7087f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 7088f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #error <message> 7089218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("error"); 7090218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7091218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("message"); 7092218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 7093f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 7094f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #pragma <arguments> 7095218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("pragma"); 7096218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7097218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("arguments"); 7098218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 7099f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 71004e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (getLangOpts().ObjC1) { 7101f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #import "header" 7102218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("import"); 7103218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7104218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("\""); 7105218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("header"); 7106218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("\""); 7107218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 7108f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 7109f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #import <header> 7110218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("import"); 7111218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7112218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("<"); 7113218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("header"); 7114218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk(">"); 7115218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 7116f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor } 7117f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 7118f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #include_next "header" 7119218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("include_next"); 7120218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7121218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("\""); 7122218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("header"); 7123218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("\""); 7124218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 7125f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 7126f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #include_next <header> 7127218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("include_next"); 7128218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7129218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("<"); 7130218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("header"); 7131218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk(">"); 7132218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 7133f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 7134f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #warning <message> 7135218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("warning"); 7136218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7137218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("message"); 7138218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 7139f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 7140f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // Note: #ident and #sccs are such crazy anachronisms that we don't provide 7141f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // completions for them. And __include_macros is a Clang-internal extension 7142f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // that we don't want to encourage anyone to use. 7143f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 7144f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // FIXME: we don't support #assert or #unassert, so don't suggest them. 7145f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor Results.ExitScope(); 7146f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 7147f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 7148721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor CodeCompletionContext::CCC_PreprocessorDirective, 7149f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor Results.data(), Results.size()); 7150f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor} 7151f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 7152f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregorvoid Sema::CodeCompleteInPreprocessorConditionalExclusion(Scope *S) { 7153f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor CodeCompleteOrdinaryName(S, 7154f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall S->getFnParent()? Sema::PCC_RecoveryInFunction 7155f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall : Sema::PCC_Namespace); 7156f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor} 7157f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 7158f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregorvoid Sema::CodeCompletePreprocessorMacroName(bool IsDefinition) { 7159218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 716028a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 716152779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor IsDefinition? CodeCompletionContext::CCC_MacroName 716252779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor : CodeCompletionContext::CCC_MacroNameUse); 71631fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor if (!IsDefinition && (!CodeCompleter || CodeCompleter->includeMacros())) { 71641fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor // Add just the names of macros, not their arguments. 716528a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Builder(Results.getAllocator(), 716628a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis Results.getCodeCompletionTUInfo()); 71671fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor Results.EnterNewScope(); 71681fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor for (Preprocessor::macro_iterator M = PP.macro_begin(), 71691fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor MEnd = PP.macro_end(); 71701fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor M != MEnd; ++M) { 7171dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddTypedTextChunk(Builder.getAllocator().CopyString( 7172218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor M->first->getName())); 7173218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 71741fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor } 71751fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor Results.ExitScope(); 71761fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor } else if (IsDefinition) { 71771fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor // FIXME: Can we detect when the user just wrote an include guard above? 71781fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor } 71791fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor 718052779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 71811fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor Results.data(), Results.size()); 71821fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor} 71831fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor 7184f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregorvoid Sema::CodeCompletePreprocessorExpression() { 7185218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 718628a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 718752779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor CodeCompletionContext::CCC_PreprocessorExpression); 7188f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor 7189f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor if (!CodeCompleter || CodeCompleter->includeMacros()) 7190f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor AddMacroResults(PP, Results); 7191f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor 7192f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor // defined (<macro>) 7193f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor Results.EnterNewScope(); 719428a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Builder(Results.getAllocator(), 719528a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis Results.getCodeCompletionTUInfo()); 7196218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("defined"); 7197218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7198218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 7199218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("macro"); 7200218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 7201218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 7202f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor Results.ExitScope(); 7203f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor 7204f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 7205f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor CodeCompletionContext::CCC_PreprocessorExpression, 7206f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor Results.data(), Results.size()); 7207f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor} 7208f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor 7209f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregorvoid Sema::CodeCompletePreprocessorMacroArgument(Scope *S, 7210f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor IdentifierInfo *Macro, 7211f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor MacroInfo *MacroInfo, 7212f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor unsigned Argument) { 7213f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor // FIXME: In the future, we could provide "overload" results, much like we 7214f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor // do for function calls. 7215f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor 72165c5f03e4020e90b9760ec547962ba02b029cc359Argyrios Kyrtzidis // Now just ignore this. There will be another code-completion callback 72175c5f03e4020e90b9760ec547962ba02b029cc359Argyrios Kyrtzidis // for the expanded tokens. 7218f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor} 7219f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor 722055817afdf9d453a443262a733f6caf6692dca118Douglas Gregorvoid Sema::CodeCompleteNaturalLanguage() { 722155817afdf9d453a443262a733f6caf6692dca118Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 7222af1c6b532e6e1e944db987f29062e5efce71a573Douglas Gregor CodeCompletionContext::CCC_NaturalLanguage, 722355817afdf9d453a443262a733f6caf6692dca118Douglas Gregor 0, 0); 722455817afdf9d453a443262a733f6caf6692dca118Douglas Gregor} 722555817afdf9d453a443262a733f6caf6692dca118Douglas Gregor 7226dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregorvoid Sema::GatherGlobalCodeCompletions(CodeCompletionAllocator &Allocator, 722728a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionTUInfo &CCTUInfo, 72285f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVectorImpl<CodeCompletionResult> &Results) { 722928a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis ResultBuilder Builder(*this, Allocator, CCTUInfo, 723028a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionContext::CCC_Recovery); 72318071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor if (!CodeCompleter || CodeCompleter->includeGlobals()) { 72328071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompletionDeclConsumer Consumer(Builder, 72338071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor Context.getTranslationUnitDecl()); 72348071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(Context.getTranslationUnitDecl(), LookupAnyName, 72358071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor Consumer); 72368071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor } 723787c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor 723887c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor if (!CodeCompleter || CodeCompleter->includeMacros()) 723987c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor AddMacroResults(PP, Builder); 724087c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor 724187c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor Results.clear(); 724287c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor Results.insert(Results.end(), 724387c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor Builder.data(), Builder.data() + Builder.size()); 724487c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor} 7245