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(); 10626666ed4ed2e2bc13da5ac5d0a4947019137d45beJoao Matos 10636666ed4ed2e2bc13da5ac5d0a4947019137d45beJoao Matos // For purposes of this check, interfaces match too. 106486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (RecordDecl *RD = dyn_cast<RecordDecl>(ND)) 1065465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara return RD->getTagKind() == TTK_Class || 10666666ed4ed2e2bc13da5ac5d0a4947019137d45beJoao Matos RD->getTagKind() == TTK_Struct || 10676666ed4ed2e2bc13da5ac5d0a4947019137d45beJoao Matos RD->getTagKind() == TTK_Interface; 106886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 106986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return false; 107086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 107186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 107286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Determines whether the given declaration is a union. 107386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsUnion(NamedDecl *ND) const { 107486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Allow us to find class templates, too. 107586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (ClassTemplateDecl *ClassTemplate = dyn_cast<ClassTemplateDecl>(ND)) 107686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ND = ClassTemplate->getTemplatedDecl(); 107786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 107886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (RecordDecl *RD = dyn_cast<RecordDecl>(ND)) 1079465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara return RD->getTagKind() == TTK_Union; 108086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 108186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return false; 108286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 108386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 108486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Determines whether the given declaration is a namespace. 108586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsNamespace(NamedDecl *ND) const { 108686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return isa<NamespaceDecl>(ND); 108786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 108886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 108986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Determines whether the given declaration is a namespace or 109086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// namespace alias. 109186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsNamespaceOrAlias(NamedDecl *ND) const { 109286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return isa<NamespaceDecl>(ND) || isa<NamespaceAliasDecl>(ND); 109386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 109486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 10957628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor/// \brief Determines whether the given declaration is a type. 109686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsType(NamedDecl *ND) const { 1097d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor if (UsingShadowDecl *Using = dyn_cast<UsingShadowDecl>(ND)) 1098d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor ND = Using->getTargetDecl(); 1099d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor 1100d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor return isa<TypeDecl>(ND) || isa<ObjCInterfaceDecl>(ND); 110186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 110286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 11037628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor/// \brief Determines which members of a class should be visible via 11047628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor/// "." or "->". Only value declarations, nested name specifiers, and 11057628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor/// using declarations thereof should show up. 1106eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregorbool ResultBuilder::IsMember(NamedDecl *ND) const { 11077628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor if (UsingShadowDecl *Using = dyn_cast<UsingShadowDecl>(ND)) 11087628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor ND = Using->getTargetDecl(); 11097628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor 1110ce82196076cd15f5ecfa029fcda8b58dc0146cf1Douglas Gregor return isa<ValueDecl>(ND) || isa<FunctionTemplateDecl>(ND) || 1111ce82196076cd15f5ecfa029fcda8b58dc0146cf1Douglas Gregor isa<ObjCPropertyDecl>(ND); 1112eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor} 1113eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor 11148e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregorstatic bool isObjCReceiverType(ASTContext &C, QualType T) { 11158e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor T = C.getCanonicalType(T); 11168e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor switch (T->getTypeClass()) { 11178e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor case Type::ObjCObject: 11188e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor case Type::ObjCInterface: 11198e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor case Type::ObjCObjectPointer: 11208e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor return true; 11218e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 11228e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor case Type::Builtin: 11238e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor switch (cast<BuiltinType>(T)->getKind()) { 11248e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor case BuiltinType::ObjCId: 11258e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor case BuiltinType::ObjCClass: 11268e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor case BuiltinType::ObjCSel: 11278e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor return true; 11288e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 11298e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor default: 11308e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor break; 11318e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor } 11328e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor return false; 11338e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 11348e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor default: 11358e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor break; 11368e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor } 11378e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 11384e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (!C.getLangOpts().CPlusPlus) 11398e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor return false; 11408e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 11418e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor // FIXME: We could perform more analysis here to determine whether a 11428e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor // particular class type has any conversions to Objective-C types. For now, 11438e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor // just accept all class types. 11448e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor return T->isDependentType() || T->isRecordType(); 11458e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor} 11468e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 11478e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregorbool ResultBuilder::IsObjCMessageReceiver(NamedDecl *ND) const { 11488e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor QualType T = getDeclUsageType(SemaRef.Context, ND); 11498e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor if (T.isNull()) 11508e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor return false; 11518e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 11528e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor T = SemaRef.Context.getBaseElementType(T); 11538e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor return isObjCReceiverType(SemaRef.Context, T); 11548e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor} 11558e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 115681f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregorbool ResultBuilder::IsObjCMessageReceiverOrLambdaCapture(NamedDecl *ND) const { 115781f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor if (IsObjCMessageReceiver(ND)) 115881f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor return true; 115981f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor 116081f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor VarDecl *Var = dyn_cast<VarDecl>(ND); 116181f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor if (!Var) 116281f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor return false; 116381f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor 116481f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor return Var->hasLocalStorage() && !Var->hasAttr<BlocksAttr>(); 116581f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor} 116681f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor 1167fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregorbool ResultBuilder::IsObjCCollection(NamedDecl *ND) const { 11684e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if ((SemaRef.getLangOpts().CPlusPlus && !IsOrdinaryName(ND)) || 11694e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie (!SemaRef.getLangOpts().CPlusPlus && !IsOrdinaryNonTypeName(ND))) 1170fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor return false; 1171fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor 1172fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor QualType T = getDeclUsageType(SemaRef.Context, ND); 1173fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor if (T.isNull()) 1174fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor return false; 1175fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor 1176fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor T = SemaRef.Context.getBaseElementType(T); 1177fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor return T->isObjCObjectType() || T->isObjCObjectPointerType() || 1178fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor T->isObjCIdType() || 11794e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie (SemaRef.getLangOpts().CPlusPlus && T->isRecordType()); 1180fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor} 11818e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 118252779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregorbool ResultBuilder::IsImpossibleToSatisfy(NamedDecl *ND) const { 118352779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor return false; 118452779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor} 118552779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor 1186de23c7e9069b2ea2cd2633efd9566546e2c68926James Dennett/// \brief Determines whether the given declaration is an Objective-C 118780f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor/// instance variable. 118880f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregorbool ResultBuilder::IsObjCIvar(NamedDecl *ND) const { 118980f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor return isa<ObjCIvarDecl>(ND); 119080f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor} 119180f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor 11921ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregornamespace { 11931ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// \brief Visible declaration consumer that adds a code-completion result 11941ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// for each visible declaration. 11951ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor class CodeCompletionDeclConsumer : public VisibleDeclConsumer { 11961ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor ResultBuilder &Results; 11971ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor DeclContext *CurContext; 11981ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 11991ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor public: 12001ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor CodeCompletionDeclConsumer(ResultBuilder &Results, DeclContext *CurContext) 12011ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor : Results(Results), CurContext(CurContext) { } 12021ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 1203d12059673dcef32bc2b6bae5321654d33863afe6Erik Verbruggen virtual void FoundDecl(NamedDecl *ND, NamedDecl *Hiding, DeclContext *Ctx, 1204d12059673dcef32bc2b6bae5321654d33863afe6Erik Verbruggen bool InBaseClass) { 1205d12059673dcef32bc2b6bae5321654d33863afe6Erik Verbruggen bool Accessible = true; 120617015eff2b3166e445377b15913474b472775e7cDouglas Gregor if (Ctx) 120717015eff2b3166e445377b15913474b472775e7cDouglas Gregor Accessible = Results.getSema().IsSimplyAccessible(ND, Ctx); 120817015eff2b3166e445377b15913474b472775e7cDouglas Gregor 1209d12059673dcef32bc2b6bae5321654d33863afe6Erik Verbruggen ResultBuilder::Result Result(ND, 0, false, Accessible); 1210d12059673dcef32bc2b6bae5321654d33863afe6Erik Verbruggen Results.AddResult(Result, CurContext, Hiding, InBaseClass); 12111ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor } 12121ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor }; 12131ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor} 12141ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 121586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Add type specifiers for the current language as keyword results. 1216bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddTypeSpecifierResults(const LangOptions &LangOpts, 121786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ResultBuilder &Results) { 12180a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 121912e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("short", CCP_Type)); 122012e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("long", CCP_Type)); 122112e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("signed", CCP_Type)); 122212e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("unsigned", CCP_Type)); 122312e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("void", CCP_Type)); 122412e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("char", CCP_Type)); 122512e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("int", CCP_Type)); 122612e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("float", CCP_Type)); 122712e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("double", CCP_Type)); 122812e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("enum", CCP_Type)); 122912e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("struct", CCP_Type)); 123012e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("union", CCP_Type)); 123112e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("const", CCP_Type)); 123212e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("volatile", CCP_Type)); 123301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 123486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (LangOpts.C99) { 123586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // C99-specific 123612e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("_Complex", CCP_Type)); 123712e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("_Imaginary", CCP_Type)); 123812e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("_Bool", CCP_Type)); 123912e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("restrict", CCP_Type)); 124086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 124186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 124228a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Builder(Results.getAllocator(), 124328a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis Results.getCodeCompletionTUInfo()); 124486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (LangOpts.CPlusPlus) { 124586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // C++-specific 1246b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor Results.AddResult(Result("bool", CCP_Type + 1247b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor (LangOpts.ObjC1? CCD_bool_in_ObjC : 0))); 124812e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("class", CCP_Type)); 124912e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("wchar_t", CCP_Type)); 125086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 1251c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // typename qualified-id 1252218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("typename"); 1253218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1254218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("qualifier"); 1255218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("::"); 1256218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("name"); 1257218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1258d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor 125986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (LangOpts.CPlusPlus0x) { 126012e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("auto", CCP_Type)); 126112e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("char16_t", CCP_Type)); 126212e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("char32_t", CCP_Type)); 1263c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor 1264218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("decltype"); 1265218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1266218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1267218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1268218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 126986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 127086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 127186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 127286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // GNU extensions 127386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (LangOpts.GNUMode) { 127486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // FIXME: Enable when we actually support decimal floating point. 1275a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor // Results.AddResult(Result("_Decimal32")); 1276a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor // Results.AddResult(Result("_Decimal64")); 1277a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor // Results.AddResult(Result("_Decimal128")); 127801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1279218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("typeof"); 1280218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1281218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1282218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1283c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor 1284218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("typeof"); 1285218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1286218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("type"); 1287218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1288218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 128901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 129001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor} 129101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1292f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCallstatic void AddStorageSpecifiers(Sema::ParserCompletionContext CCC, 129301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor const LangOptions &LangOpts, 129401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor ResultBuilder &Results) { 12950a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 129601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Note: we don't suggest either "auto" or "register", because both 129701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // are pointless as storage specifiers. Elsewhere, we suggest "auto" 129801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // in C++0x as a type specifier. 1299a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("extern")); 1300a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("static")); 130101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor} 130201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1303f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCallstatic void AddFunctionSpecifiers(Sema::ParserCompletionContext CCC, 130401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor const LangOptions &LangOpts, 130501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor ResultBuilder &Results) { 13060a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 130701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor switch (CCC) { 1308f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Class: 1309f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_MemberTemplate: 131001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (LangOpts.CPlusPlus) { 1311a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("explicit")); 1312a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("friend")); 1313a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("mutable")); 1314a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("virtual")); 131501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 131601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Fall through 131701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1318f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ObjCInterface: 1319f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ObjCImplementation: 1320f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Namespace: 1321f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Template: 132201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (LangOpts.CPlusPlus || LangOpts.C99) 1323a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("inline")); 132401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 132501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1326f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ObjCInstanceVariableList: 1327f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Expression: 1328f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Statement: 1329f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ForInit: 1330f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Condition: 1331f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_RecoveryInFunction: 1332f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Type: 13330268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor case Sema::PCC_ParenthesizedExpression: 133468e3c2eef52701a178fbcc2bb424f31dd4b36931Douglas Gregor case Sema::PCC_LocalDeclarationSpecifiers: 133501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 133601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 133701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor} 133801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1339bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCExpressionResults(ResultBuilder &Results, bool NeedAt); 1340bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCStatementResults(ResultBuilder &Results, bool NeedAt); 1341bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCVisibilityResults(const LangOptions &LangOpts, 1342c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor ResultBuilder &Results, 1343c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor bool NeedAt); 1344bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCImplementationResults(const LangOptions &LangOpts, 1345b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor ResultBuilder &Results, 1346b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor bool NeedAt); 1347bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCInterfaceResults(const LangOptions &LangOpts, 1348b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor ResultBuilder &Results, 1349b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor bool NeedAt); 1350bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCTopLevelResults(ResultBuilder &Results, bool NeedAt); 1351b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 1352c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregorstatic void AddTypedefResult(ResultBuilder &Results) { 135328a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Builder(Results.getAllocator(), 135428a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis Results.getCodeCompletionTUInfo()); 1355218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("typedef"); 1356218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1357218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("type"); 1358218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1359218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("name"); 1360218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(CodeCompletionResult(Builder.TakeString())); 1361c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor} 1362c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor 1363f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCallstatic bool WantTypesInContext(Sema::ParserCompletionContext CCC, 13644710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor const LangOptions &LangOpts) { 13654710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor switch (CCC) { 1366f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Namespace: 1367f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Class: 1368f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ObjCInstanceVariableList: 1369f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Template: 1370f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_MemberTemplate: 1371f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Statement: 1372f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_RecoveryInFunction: 1373f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Type: 13740268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor case Sema::PCC_ParenthesizedExpression: 137568e3c2eef52701a178fbcc2bb424f31dd4b36931Douglas Gregor case Sema::PCC_LocalDeclarationSpecifiers: 13764710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor return true; 13774710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor 1378f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Expression: 1379f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Condition: 13800268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor return LangOpts.CPlusPlus; 13810268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor 13820268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor case Sema::PCC_ObjCInterface: 13830268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor case Sema::PCC_ObjCImplementation: 13844710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor return false; 13854710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor 1386f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ForInit: 13870268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor return LangOpts.CPlusPlus || LangOpts.ObjC1 || LangOpts.C99; 13884710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor } 13897530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie 13907530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie llvm_unreachable("Invalid ParserCompletionContext!"); 13914710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor} 13924710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor 1393ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidisstatic PrintingPolicy getCompletionPrintingPolicy(const ASTContext &Context, 1394ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis const Preprocessor &PP) { 1395ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis PrintingPolicy Policy = Sema::getPrintingPolicy(Context, PP); 13968ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Policy.AnonymousTagLocations = false; 13978ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Policy.SuppressStrongLifetime = true; 139825270b6e6a8416b7532cfe552b41794418ea19b1Douglas Gregor Policy.SuppressUnwrittenScope = true; 13998ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor return Policy; 14008ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor} 14018ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor 1402ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis/// \brief Retrieve a printing policy suitable for code completion. 1403ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidisstatic PrintingPolicy getCompletionPrintingPolicy(Sema &S) { 1404ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis return getCompletionPrintingPolicy(S.Context, S.PP); 1405ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis} 1406ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis 14078ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor/// \brief Retrieve the string representation of the given type as a string 14088ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor/// that has the appropriate lifetime for code completion. 14098ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor/// 14108ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor/// This routine provides a fast path where we provide constant strings for 14118ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor/// common type names. 14128ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregorstatic const char *GetCompletionTypeString(QualType T, 14138ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor ASTContext &Context, 14148ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor const PrintingPolicy &Policy, 14158ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor CodeCompletionAllocator &Allocator) { 14168ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor if (!T.getLocalQualifiers()) { 14178ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor // Built-in type names are constant strings. 14188ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor if (const BuiltinType *BT = dyn_cast<BuiltinType>(T)) 141927a00970bf4ababdc115e54383e6252cc3276dfaArgyrios Kyrtzidis return BT->getNameAsCString(Policy); 14208ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor 14218ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor // Anonymous tag types are constant strings. 14228ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor if (const TagType *TagT = dyn_cast<TagType>(T)) 14238ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor if (TagDecl *Tag = TagT->getDecl()) 14248ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor if (!Tag->getIdentifier() && !Tag->getTypedefNameForAnonDecl()) { 14258ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor switch (Tag->getTagKind()) { 14268ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor case TTK_Struct: return "struct <anonymous>"; 14276666ed4ed2e2bc13da5ac5d0a4947019137d45beJoao Matos case TTK_Interface: return "__interface <anonymous>"; 14286666ed4ed2e2bc13da5ac5d0a4947019137d45beJoao Matos case TTK_Class: return "class <anonymous>"; 14298ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor case TTK_Union: return "union <anonymous>"; 14308ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor case TTK_Enum: return "enum <anonymous>"; 14318ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor } 14328ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor } 14338ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor } 14348ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor 14358ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor // Slow path: format the type as a string. 14368ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor std::string Result; 14378ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor T.getAsStringInternal(Result, Policy); 14388ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor return Allocator.CopyString(Result); 14398ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor} 14408ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor 144181f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor/// \brief Add a completion for "this", if we're in a member function. 144281f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregorstatic void addThisCompletion(Sema &S, ResultBuilder &Results) { 144381f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor QualType ThisTy = S.getCurrentThisType(); 144481f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor if (ThisTy.isNull()) 144581f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor return; 144681f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor 144781f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor CodeCompletionAllocator &Allocator = Results.getAllocator(); 144828a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo()); 144981f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor PrintingPolicy Policy = getCompletionPrintingPolicy(S); 145081f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor Builder.AddResultTypeChunk(GetCompletionTypeString(ThisTy, 145181f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor S.Context, 145281f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor Policy, 145381f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor Allocator)); 145481f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor Builder.AddTypedTextChunk("this"); 14556666ed4ed2e2bc13da5ac5d0a4947019137d45beJoao Matos Results.AddResult(CodeCompletionResult(Builder.TakeString())); 145681f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor} 145781f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor 145801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor/// \brief Add language constructs that show up for "ordinary" names. 1459f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCallstatic void AddOrdinaryNameResults(Sema::ParserCompletionContext CCC, 146001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Scope *S, 146101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Sema &SemaRef, 146201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor ResultBuilder &Results) { 14638ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor CodeCompletionAllocator &Allocator = Results.getAllocator(); 146428a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo()); 14658ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor PrintingPolicy Policy = getCompletionPrintingPolicy(SemaRef); 1466218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor 14670a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 146801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor switch (CCC) { 1469f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Namespace: 14704e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (SemaRef.getLangOpts().CPlusPlus) { 1471c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor if (Results.includeCodePatterns()) { 1472c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // namespace <identifier> { declarations } 1473218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("namespace"); 1474218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1475218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("identifier"); 1476218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 1477218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("declarations"); 1478218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 1479218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 1480218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1481c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor } 1482c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor 148301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // namespace identifier = identifier ; 1484218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("namespace"); 1485218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1486218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("name"); 1487218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_Equal); 1488218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("namespace"); 1489218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 149001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 149101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Using directives 1492218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("using"); 1493218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1494218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("namespace"); 1495218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1496218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("identifier"); 1497218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 149801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 149901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // asm(string-literal) 1500218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("asm"); 1501218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1502218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("string-literal"); 1503218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1504218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 150501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1506c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor if (Results.includeCodePatterns()) { 1507c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // Explicit template instantiation 1508218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("template"); 1509218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1510218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("declaration"); 1511218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1512c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor } 151301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 1514b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 15154e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (SemaRef.getLangOpts().ObjC1) 1516bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCTopLevelResults(Results, true); 1517b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 1518c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor AddTypedefResult(Results); 151901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Fall through 152001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1521f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Class: 15224e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (SemaRef.getLangOpts().CPlusPlus) { 152301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Using declaration 1524218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("using"); 1525218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1526218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("qualifier"); 1527218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("::"); 1528218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("name"); 1529218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 153001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1531c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // using typename qualifier::name (only in a dependent context) 153201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (SemaRef.CurContext->isDependentContext()) { 1533218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("using"); 1534218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1535218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("typename"); 1536218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1537218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("qualifier"); 1538218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("::"); 1539218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("name"); 1540218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 154101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 154201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1543f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall if (CCC == Sema::PCC_Class) { 1544c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor AddTypedefResult(Results); 1545c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor 154601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // public: 1547218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("public"); 154810ccf12a06cc1ef5b778c20565945f313a9a2c26Douglas Gregor if (Results.includeCodePatterns()) 154910ccf12a06cc1ef5b778c20565945f313a9a2c26Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_Colon); 1550218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 155101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 155201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // protected: 1553218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("protected"); 155410ccf12a06cc1ef5b778c20565945f313a9a2c26Douglas Gregor if (Results.includeCodePatterns()) 155510ccf12a06cc1ef5b778c20565945f313a9a2c26Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_Colon); 1556218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 155701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 155801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // private: 1559218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("private"); 156010ccf12a06cc1ef5b778c20565945f313a9a2c26Douglas Gregor if (Results.includeCodePatterns()) 156110ccf12a06cc1ef5b778c20565945f313a9a2c26Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_Colon); 1562218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 156301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 156401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 156501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Fall through 156601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1567f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Template: 1568f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_MemberTemplate: 15694e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (SemaRef.getLangOpts().CPlusPlus && Results.includeCodePatterns()) { 157001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // template < parameters > 1571218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("template"); 1572218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftAngle); 1573218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("parameters"); 1574218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightAngle); 1575218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 157601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 157701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 15784e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie AddStorageSpecifiers(CCC, SemaRef.getLangOpts(), Results); 15794e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie AddFunctionSpecifiers(CCC, SemaRef.getLangOpts(), Results); 158001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 158101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1582f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ObjCInterface: 15834e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie AddObjCInterfaceResults(SemaRef.getLangOpts(), Results, true); 15844e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie AddStorageSpecifiers(CCC, SemaRef.getLangOpts(), Results); 15854e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie AddFunctionSpecifiers(CCC, SemaRef.getLangOpts(), Results); 1586b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor break; 1587b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 1588f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ObjCImplementation: 15894e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie AddObjCImplementationResults(SemaRef.getLangOpts(), Results, true); 15904e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie AddStorageSpecifiers(CCC, SemaRef.getLangOpts(), Results); 15914e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie AddFunctionSpecifiers(CCC, SemaRef.getLangOpts(), Results); 1592b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor break; 1593b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 1594f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ObjCInstanceVariableList: 15954e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie AddObjCVisibilityResults(SemaRef.getLangOpts(), Results, true); 1596c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor break; 1597c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor 1598f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_RecoveryInFunction: 1599f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Statement: { 1600c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor AddTypedefResult(Results); 160101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 16024e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (SemaRef.getLangOpts().CPlusPlus && Results.includeCodePatterns() && 16034e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie SemaRef.getLangOpts().CXXExceptions) { 1604218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("try"); 1605218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 1606218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("statements"); 1607218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 1608218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 1609218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("catch"); 1610218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1611218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("declaration"); 1612218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1613218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 1614218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("statements"); 1615218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 1616218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 1617218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 161801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 16194e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (SemaRef.getLangOpts().ObjC1) 1620bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCStatementResults(Results, true); 1621b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 1622d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor if (Results.includeCodePatterns()) { 1623d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor // if (condition) { statements } 1624218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("if"); 1625218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 16264e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (SemaRef.getLangOpts().CPlusPlus) 1627218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("condition"); 1628d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor else 1629218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1630218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1631218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 1632218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("statements"); 1633218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 1634218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 1635218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 163601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1637d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor // switch (condition) { } 1638218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("switch"); 1639218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 16404e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (SemaRef.getLangOpts().CPlusPlus) 1641218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("condition"); 1642d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor else 1643218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1644218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1645218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 1646218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 1647218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 1648218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1649d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor } 1650d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor 165101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Switch-specific statements. 1652781472fe99a120098c631b0cbe33c89f8cef5e70John McCall if (!SemaRef.getCurFunction()->SwitchStack.empty()) { 165301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // case expression: 1654218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("case"); 1655218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1656218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1657218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_Colon); 1658218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 165901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 166001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // default: 1661218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("default"); 1662218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_Colon); 1663218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 166401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 166501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1666d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor if (Results.includeCodePatterns()) { 1667d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor /// while (condition) { statements } 1668218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("while"); 1669218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 16704e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (SemaRef.getLangOpts().CPlusPlus) 1671218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("condition"); 1672d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor else 1673218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1674218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1675218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 1676218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("statements"); 1677218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 1678218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 1679218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 168001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1681d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor // do { statements } while ( expression ); 1682218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("do"); 1683218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 1684218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("statements"); 1685218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 1686218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 1687218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("while"); 1688218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1689218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1690218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1691218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 169201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1693d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor // for ( for-init-statement ; condition ; expression ) { statements } 1694218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("for"); 1695218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 16964e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (SemaRef.getLangOpts().CPlusPlus || SemaRef.getLangOpts().C99) 1697218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("init-statement"); 1698d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor else 1699218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("init-expression"); 1700218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_SemiColon); 1701218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("condition"); 1702218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_SemiColon); 1703218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("inc-expression"); 1704218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1705218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 1706218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 1707218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("statements"); 1708218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 1709218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 1710218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1711d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor } 171201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 171301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (S->getContinueParent()) { 171401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // continue ; 1715218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("continue"); 1716218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 171701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 171801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 171901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (S->getBreakParent()) { 172001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // break ; 1721218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("break"); 1722218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 172301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 172401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 172501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // "return expression ;" or "return ;", depending on whether we 172601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // know the function is void or not. 172701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor bool isVoid = false; 172801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (FunctionDecl *Function = dyn_cast<FunctionDecl>(SemaRef.CurContext)) 172901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor isVoid = Function->getResultType()->isVoidType(); 173001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor else if (ObjCMethodDecl *Method 173101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor = dyn_cast<ObjCMethodDecl>(SemaRef.CurContext)) 173201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor isVoid = Method->getResultType()->isVoidType(); 17339ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor else if (SemaRef.getCurBlock() && 17349ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor !SemaRef.getCurBlock()->ReturnType.isNull()) 17359ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor isVoid = SemaRef.getCurBlock()->ReturnType->isVoidType(); 1736218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("return"); 17379329800d6f4c4ea8778aabd64cde1b712b290b00Douglas Gregor if (!isVoid) { 1738218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1739218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 17409329800d6f4c4ea8778aabd64cde1b712b290b00Douglas Gregor } 1741218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 174201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1743c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // goto identifier ; 1744218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("goto"); 1745218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1746218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("label"); 1747218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 174801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1749c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // Using directives 1750218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("using"); 1751218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1752218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("namespace"); 1753218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1754218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("identifier"); 1755218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 175601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 175701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 175801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Fall through (for statement expressions). 1759f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ForInit: 1760f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Condition: 17614e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie AddStorageSpecifiers(CCC, SemaRef.getLangOpts(), Results); 176201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Fall through: conditions and statements can have expressions. 176301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 17640268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor case Sema::PCC_ParenthesizedExpression: 17654e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (SemaRef.getLangOpts().ObjCAutoRefCount && 1766f85e193739c953358c865005855253af4f68a497John McCall CCC == Sema::PCC_ParenthesizedExpression) { 1767f85e193739c953358c865005855253af4f68a497John McCall // (__bridge <type>)<expression> 1768f85e193739c953358c865005855253af4f68a497John McCall Builder.AddTypedTextChunk("__bridge"); 1769f85e193739c953358c865005855253af4f68a497John McCall Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1770f85e193739c953358c865005855253af4f68a497John McCall Builder.AddPlaceholderChunk("type"); 1771f85e193739c953358c865005855253af4f68a497John McCall Builder.AddChunk(CodeCompletionString::CK_RightParen); 1772f85e193739c953358c865005855253af4f68a497John McCall Builder.AddPlaceholderChunk("expression"); 1773f85e193739c953358c865005855253af4f68a497John McCall Results.AddResult(Result(Builder.TakeString())); 1774f85e193739c953358c865005855253af4f68a497John McCall 1775f85e193739c953358c865005855253af4f68a497John McCall // (__bridge_transfer <Objective-C type>)<expression> 1776f85e193739c953358c865005855253af4f68a497John McCall Builder.AddTypedTextChunk("__bridge_transfer"); 1777f85e193739c953358c865005855253af4f68a497John McCall Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1778f85e193739c953358c865005855253af4f68a497John McCall Builder.AddPlaceholderChunk("Objective-C type"); 1779f85e193739c953358c865005855253af4f68a497John McCall Builder.AddChunk(CodeCompletionString::CK_RightParen); 1780f85e193739c953358c865005855253af4f68a497John McCall Builder.AddPlaceholderChunk("expression"); 1781f85e193739c953358c865005855253af4f68a497John McCall Results.AddResult(Result(Builder.TakeString())); 1782f85e193739c953358c865005855253af4f68a497John McCall 1783f85e193739c953358c865005855253af4f68a497John McCall // (__bridge_retained <CF type>)<expression> 1784f85e193739c953358c865005855253af4f68a497John McCall Builder.AddTypedTextChunk("__bridge_retained"); 1785f85e193739c953358c865005855253af4f68a497John McCall Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1786f85e193739c953358c865005855253af4f68a497John McCall Builder.AddPlaceholderChunk("CF type"); 1787f85e193739c953358c865005855253af4f68a497John McCall Builder.AddChunk(CodeCompletionString::CK_RightParen); 1788f85e193739c953358c865005855253af4f68a497John McCall Builder.AddPlaceholderChunk("expression"); 1789f85e193739c953358c865005855253af4f68a497John McCall Results.AddResult(Result(Builder.TakeString())); 1790f85e193739c953358c865005855253af4f68a497John McCall } 1791f85e193739c953358c865005855253af4f68a497John McCall // Fall through 1792f85e193739c953358c865005855253af4f68a497John McCall 1793f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Expression: { 17944e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (SemaRef.getLangOpts().CPlusPlus) { 179501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // 'this', if we're in a non-static member function. 179681f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor addThisCompletion(SemaRef, Results); 17978ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor 17988ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor // true 17998ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("bool"); 18008ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddTypedTextChunk("true"); 18018ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 180201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 18038ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor // false 18048ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("bool"); 18058ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddTypedTextChunk("false"); 18068ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 180701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 18084e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (SemaRef.getLangOpts().RTTI) { 1809ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor // dynamic_cast < type-id > ( expression ) 1810ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddTypedTextChunk("dynamic_cast"); 1811ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftAngle); 1812ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddPlaceholderChunk("type"); 1813ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightAngle); 1814ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1815ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1816ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1817ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1818ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor } 1819c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor 1820c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // static_cast < type-id > ( expression ) 1821218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("static_cast"); 1822218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftAngle); 1823218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("type"); 1824218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightAngle); 1825218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1826218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1827218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1828218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1829d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor 1830c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // reinterpret_cast < type-id > ( expression ) 1831218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("reinterpret_cast"); 1832218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftAngle); 1833218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("type"); 1834218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightAngle); 1835218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1836218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1837218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1838218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1839d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor 1840c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // const_cast < type-id > ( expression ) 1841218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("const_cast"); 1842218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftAngle); 1843218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("type"); 1844218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightAngle); 1845218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1846218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1847218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1848218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1849d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor 18504e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (SemaRef.getLangOpts().RTTI) { 1851ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor // typeid ( expression-or-type ) 18528ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("std::type_info"); 1853ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddTypedTextChunk("typeid"); 1854ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1855ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddPlaceholderChunk("expression-or-type"); 1856ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1857ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1858ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor } 1859ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor 1860c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // new T ( ... ) 1861218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("new"); 1862218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1863218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("type"); 1864218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1865218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expressions"); 1866218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1867218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 186801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1869c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // new T [ ] ( ... ) 1870218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("new"); 1871218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1872218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("type"); 1873218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBracket); 1874218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("size"); 1875218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBracket); 1876218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1877218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expressions"); 1878218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1879218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 188001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1881c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // delete expression 18828ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("void"); 1883218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("delete"); 1884218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1885218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1886218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 188701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1888c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // delete [] expression 18898ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("void"); 1890218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("delete"); 1891218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1892218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBracket); 1893218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBracket); 1894218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1895218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1896218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1897c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor 18984e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (SemaRef.getLangOpts().CXXExceptions) { 1899ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor // throw expression 19008ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("void"); 1901ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddTypedTextChunk("throw"); 1902ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1903ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1904ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1905ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor } 1906a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor 190712e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor // FIXME: Rethrow? 1908a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor 19094e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (SemaRef.getLangOpts().CPlusPlus0x) { 1910a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor // nullptr 19118ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("std::nullptr_t"); 1912a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddTypedTextChunk("nullptr"); 1913a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1914a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor 1915a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor // alignof 19168ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("size_t"); 1917a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddTypedTextChunk("alignof"); 1918a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1919a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddPlaceholderChunk("type"); 1920a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1921a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1922a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor 1923a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor // noexcept 19248ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("bool"); 1925a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddTypedTextChunk("noexcept"); 1926a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1927a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1928a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1929a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1930a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor 1931a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor // sizeof... expression 19328ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("size_t"); 1933a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddTypedTextChunk("sizeof..."); 1934a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1935a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddPlaceholderChunk("parameter-pack"); 1936a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1937a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1938a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor } 193901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 194001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 19414e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (SemaRef.getLangOpts().ObjC1) { 194201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Add "super", if we're in an Objective-C class with a superclass. 1943681e256048cf9d3d226b9d0699f3df22c2500ef4Ted Kremenek if (ObjCMethodDecl *Method = SemaRef.getCurMethodDecl()) { 1944681e256048cf9d3d226b9d0699f3df22c2500ef4Ted Kremenek // The interface can be NULL. 1945681e256048cf9d3d226b9d0699f3df22c2500ef4Ted Kremenek if (ObjCInterfaceDecl *ID = Method->getClassInterface()) 19468ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor if (ID->getSuperClass()) { 19478ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor std::string SuperType; 19488ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor SuperType = ID->getSuperClass()->getNameAsString(); 19498ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor if (Method->isInstanceMethod()) 19508ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor SuperType += " *"; 19518ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor 19528ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk(Allocator.CopyString(SuperType)); 19538ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddTypedTextChunk("super"); 19548ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 19558ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor } 1956681e256048cf9d3d226b9d0699f3df22c2500ef4Ted Kremenek } 1957681e256048cf9d3d226b9d0699f3df22c2500ef4Ted Kremenek 1958bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCExpressionResults(Results, true); 195901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 196001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1961f70a88612a4bc2de2872a518267b9b4891ab6431Jordan Rose if (SemaRef.getLangOpts().C11) { 1962f70a88612a4bc2de2872a518267b9b4891ab6431Jordan Rose // _Alignof 1963f70a88612a4bc2de2872a518267b9b4891ab6431Jordan Rose Builder.AddResultTypeChunk("size_t"); 1964f70a88612a4bc2de2872a518267b9b4891ab6431Jordan Rose if (SemaRef.getASTContext().Idents.get("alignof").hasMacroDefinition()) 1965f70a88612a4bc2de2872a518267b9b4891ab6431Jordan Rose Builder.AddTypedTextChunk("alignof"); 1966f70a88612a4bc2de2872a518267b9b4891ab6431Jordan Rose else 1967f70a88612a4bc2de2872a518267b9b4891ab6431Jordan Rose Builder.AddTypedTextChunk("_Alignof"); 1968f70a88612a4bc2de2872a518267b9b4891ab6431Jordan Rose Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1969f70a88612a4bc2de2872a518267b9b4891ab6431Jordan Rose Builder.AddPlaceholderChunk("type"); 1970f70a88612a4bc2de2872a518267b9b4891ab6431Jordan Rose Builder.AddChunk(CodeCompletionString::CK_RightParen); 1971f70a88612a4bc2de2872a518267b9b4891ab6431Jordan Rose Results.AddResult(Result(Builder.TakeString())); 1972f70a88612a4bc2de2872a518267b9b4891ab6431Jordan Rose } 1973f70a88612a4bc2de2872a518267b9b4891ab6431Jordan Rose 1974c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // sizeof expression 19758ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("size_t"); 1976218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("sizeof"); 1977218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1978218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression-or-type"); 1979218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1980218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 198101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 198286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 1983d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor 1984f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Type: 198568e3c2eef52701a178fbcc2bb424f31dd4b36931Douglas Gregor case Sema::PCC_LocalDeclarationSpecifiers: 1986d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor break; 198701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 198801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 19894e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (WantTypesInContext(CCC, SemaRef.getLangOpts())) 19904e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie AddTypeSpecifierResults(SemaRef.getLangOpts(), Results); 199101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 19924e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (SemaRef.getLangOpts().CPlusPlus && CCC != Sema::PCC_Type) 1993a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("operator")); 199486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 199586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 1996ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor/// \brief If the given declaration has an associated type, add it as a result 1997ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor/// type chunk. 1998ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregorstatic void AddResultTypeChunk(ASTContext &Context, 19998987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor const PrintingPolicy &Policy, 2000ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor NamedDecl *ND, 2001218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder &Result) { 2002ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor if (!ND) 2003ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor return; 20046f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 20056f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor // Skip constructors and conversion functions, which have their return types 20066f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor // built into their names. 20076f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor if (isa<CXXConstructorDecl>(ND) || isa<CXXConversionDecl>(ND)) 20086f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor return; 20096f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 2010ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor // Determine the type of the declaration (if it has a type). 20116f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor QualType T; 2012ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor if (FunctionDecl *Function = dyn_cast<FunctionDecl>(ND)) 2013ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor T = Function->getResultType(); 2014ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor else if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(ND)) 2015ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor T = Method->getResultType(); 2016ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor else if (FunctionTemplateDecl *FunTmpl = dyn_cast<FunctionTemplateDecl>(ND)) 2017ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor T = FunTmpl->getTemplatedDecl()->getResultType(); 2018ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor else if (EnumConstantDecl *Enumerator = dyn_cast<EnumConstantDecl>(ND)) 2019ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor T = Context.getTypeDeclType(cast<TypeDecl>(Enumerator->getDeclContext())); 2020ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor else if (isa<UnresolvedUsingValueDecl>(ND)) { 2021ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor /* Do nothing: ignore unresolved using declarations*/ 2022f85e193739c953358c865005855253af4f68a497John McCall } else if (ValueDecl *Value = dyn_cast<ValueDecl>(ND)) { 2023ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor T = Value->getType(); 2024f85e193739c953358c865005855253af4f68a497John McCall } else if (ObjCPropertyDecl *Property = dyn_cast<ObjCPropertyDecl>(ND)) 2025ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor T = Property->getType(); 2026ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor 2027ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor if (T.isNull() || Context.hasSameType(T, Context.DependentTy)) 2028ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor return; 2029ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor 20308987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor Result.AddResultTypeChunk(GetCompletionTypeString(T, Context, Policy, 2031a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor Result.getAllocator())); 2032ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor} 2033ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor 2034aaa107acc8f906203101af259e8d764b5027700aDouglas Gregorstatic void MaybeAddSentinel(ASTContext &Context, NamedDecl *FunctionOrMethod, 2035218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder &Result) { 2036aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor if (SentinelAttr *Sentinel = FunctionOrMethod->getAttr<SentinelAttr>()) 2037aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor if (Sentinel->getSentinel() == 0) { 20384e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (Context.getLangOpts().ObjC1 && 2039aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor Context.Idents.get("nil").hasMacroDefinition()) 2040218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddTextChunk(", nil"); 2041aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor else if (Context.Idents.get("NULL").hasMacroDefinition()) 2042218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddTextChunk(", NULL"); 2043aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor else 2044218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddTextChunk(", (void*)0"); 2045aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor } 2046aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor} 2047aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor 20486fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregorstatic std::string formatObjCParamQualifiers(unsigned ObjCQuals) { 20496fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor std::string Result; 20506fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor if (ObjCQuals & Decl::OBJC_TQ_In) 20516ef920976a86aa710ccfeeeb7e14e9b38aef5007Douglas Gregor Result += "in "; 20526fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor else if (ObjCQuals & Decl::OBJC_TQ_Inout) 20536ef920976a86aa710ccfeeeb7e14e9b38aef5007Douglas Gregor Result += "inout "; 20546fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor else if (ObjCQuals & Decl::OBJC_TQ_Out) 20556ef920976a86aa710ccfeeeb7e14e9b38aef5007Douglas Gregor Result += "out "; 20566fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor if (ObjCQuals & Decl::OBJC_TQ_Bycopy) 20576ef920976a86aa710ccfeeeb7e14e9b38aef5007Douglas Gregor Result += "bycopy "; 20586fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor else if (ObjCQuals & Decl::OBJC_TQ_Byref) 20596ef920976a86aa710ccfeeeb7e14e9b38aef5007Douglas Gregor Result += "byref "; 20606fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor if (ObjCQuals & Decl::OBJC_TQ_Oneway) 20616ef920976a86aa710ccfeeeb7e14e9b38aef5007Douglas Gregor Result += "oneway "; 20626fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor return Result; 20636fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor} 20646fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor 206583482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregorstatic std::string FormatFunctionParameter(ASTContext &Context, 20668987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor const PrintingPolicy &Policy, 2067aba480862485ea1140a81f25c23f43bb080edc90Douglas Gregor ParmVarDecl *Param, 2068ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor bool SuppressName = false, 2069ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor bool SuppressBlock = false) { 207083482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor bool ObjCMethodParam = isa<ObjCMethodDecl>(Param->getDeclContext()); 207183482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor if (Param->getType()->isDependentType() || 207283482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor !Param->getType()->isBlockPointerType()) { 207383482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor // The argument for a dependent or non-block parameter is a placeholder 207483482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor // containing that parameter's type. 207583482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor std::string Result; 207683482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor 2077aba480862485ea1140a81f25c23f43bb080edc90Douglas Gregor if (Param->getIdentifier() && !ObjCMethodParam && !SuppressName) 207883482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor Result = Param->getIdentifier()->getName(); 207983482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor 2080f85e193739c953358c865005855253af4f68a497John McCall Param->getType().getAsStringInternal(Result, Policy); 208183482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor 208283482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor if (ObjCMethodParam) { 20836fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor Result = "(" + formatObjCParamQualifiers(Param->getObjCDeclQualifier()) 20846fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor + Result + ")"; 2085aba480862485ea1140a81f25c23f43bb080edc90Douglas Gregor if (Param->getIdentifier() && !SuppressName) 208683482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor Result += Param->getIdentifier()->getName(); 208783482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor } 208883482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor return Result; 208983482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor } 209083482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor 209183482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor // The argument for a block pointer parameter is a block literal with 209283482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor // the appropriate type. 2093830072c2de881aadfe0f6efd3baccc9129a77e37Douglas Gregor FunctionTypeLoc *Block = 0; 2094830072c2de881aadfe0f6efd3baccc9129a77e37Douglas Gregor FunctionProtoTypeLoc *BlockProto = 0; 209583482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor TypeLoc TL; 209683482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor if (TypeSourceInfo *TSInfo = Param->getTypeSourceInfo()) { 209783482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor TL = TSInfo->getTypeLoc().getUnqualifiedLoc(); 209883482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor while (true) { 209983482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor // Look through typedefs. 2100ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor if (!SuppressBlock) { 2101ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor if (TypedefTypeLoc *TypedefTL = dyn_cast<TypedefTypeLoc>(&TL)) { 2102ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor if (TypeSourceInfo *InnerTSInfo 2103ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor = TypedefTL->getTypedefNameDecl()->getTypeSourceInfo()) { 2104ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor TL = InnerTSInfo->getTypeLoc().getUnqualifiedLoc(); 2105ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor continue; 2106ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor } 2107ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor } 2108ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor 2109ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor // Look through qualified types 2110ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor if (QualifiedTypeLoc *QualifiedTL = dyn_cast<QualifiedTypeLoc>(&TL)) { 2111ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor TL = QualifiedTL->getUnqualifiedLoc(); 211283482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor continue; 211383482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor } 211483482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor } 211583482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor 211683482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor // Try to get the function prototype behind the block pointer type, 211783482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor // then we're done. 211883482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor if (BlockPointerTypeLoc *BlockPtr 211983482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor = dyn_cast<BlockPointerTypeLoc>(&TL)) { 2120723df245307a530da5433dfb43accf187dc3e243Abramo Bagnara TL = BlockPtr->getPointeeLoc().IgnoreParens(); 2121830072c2de881aadfe0f6efd3baccc9129a77e37Douglas Gregor Block = dyn_cast<FunctionTypeLoc>(&TL); 2122830072c2de881aadfe0f6efd3baccc9129a77e37Douglas Gregor BlockProto = dyn_cast<FunctionProtoTypeLoc>(&TL); 212383482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor } 212483482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor break; 212583482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor } 212683482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor } 212783482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor 212883482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor if (!Block) { 212983482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor // We were unable to find a FunctionProtoTypeLoc with parameter names 213083482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor // for the block; just use the parameter type as a placeholder. 213183482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor std::string Result; 2132ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor if (!ObjCMethodParam && Param->getIdentifier()) 2133ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Result = Param->getIdentifier()->getName(); 2134ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor 2135f85e193739c953358c865005855253af4f68a497John McCall Param->getType().getUnqualifiedType().getAsStringInternal(Result, Policy); 213683482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor 213783482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor if (ObjCMethodParam) { 21386fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor Result = "(" + formatObjCParamQualifiers(Param->getObjCDeclQualifier()) 21396fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor + Result + ")"; 214083482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor if (Param->getIdentifier()) 214183482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor Result += Param->getIdentifier()->getName(); 214283482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor } 214383482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor 214483482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor return Result; 214583482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor } 2146ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor 214783482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor // We have the function prototype behind the block pointer type, as it was 214883482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor // written in the source. 2149382762582c8fcbc06b395a806fd57879381897a8Douglas Gregor std::string Result; 2150382762582c8fcbc06b395a806fd57879381897a8Douglas Gregor QualType ResultType = Block->getTypePtr()->getResultType(); 2151ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor if (!ResultType->isVoidType() || SuppressBlock) 2152f85e193739c953358c865005855253af4f68a497John McCall ResultType.getAsStringInternal(Result, Policy); 2153ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor 2154ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor // Format the parameter list. 2155ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor std::string Params; 2156830072c2de881aadfe0f6efd3baccc9129a77e37Douglas Gregor if (!BlockProto || Block->getNumArgs() == 0) { 2157830072c2de881aadfe0f6efd3baccc9129a77e37Douglas Gregor if (BlockProto && BlockProto->getTypePtr()->isVariadic()) 2158ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Params = "(...)"; 2159c2760bc8e99510c4b3848fcd21323afd711ee269Douglas Gregor else 2160ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Params = "(void)"; 2161382762582c8fcbc06b395a806fd57879381897a8Douglas Gregor } else { 2162ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Params += "("; 2163382762582c8fcbc06b395a806fd57879381897a8Douglas Gregor for (unsigned I = 0, N = Block->getNumArgs(); I != N; ++I) { 2164382762582c8fcbc06b395a806fd57879381897a8Douglas Gregor if (I) 2165ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Params += ", "; 2166ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Params += FormatFunctionParameter(Context, Policy, Block->getArg(I), 2167ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor /*SuppressName=*/false, 2168ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor /*SuppressBlock=*/true); 2169382762582c8fcbc06b395a806fd57879381897a8Douglas Gregor 2170830072c2de881aadfe0f6efd3baccc9129a77e37Douglas Gregor if (I == N - 1 && BlockProto->getTypePtr()->isVariadic()) 2171ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Params += ", ..."; 2172382762582c8fcbc06b395a806fd57879381897a8Douglas Gregor } 2173ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Params += ")"; 2174ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor } 2175ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor 2176ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor if (SuppressBlock) { 2177ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor // Format as a parameter. 2178ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Result = Result + " (^"; 2179ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor if (Param->getIdentifier()) 2180ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Result += Param->getIdentifier()->getName(); 2181382762582c8fcbc06b395a806fd57879381897a8Douglas Gregor Result += ")"; 2182ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Result += Params; 2183ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor } else { 2184ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor // Format as a block literal argument. 2185ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Result = '^' + Result; 2186ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Result += Params; 2187ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor 2188ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor if (Param->getIdentifier()) 2189ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Result += Param->getIdentifier()->getName(); 2190e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor } 2191382762582c8fcbc06b395a806fd57879381897a8Douglas Gregor 219283482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor return Result; 219383482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor} 219483482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor 219586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Add function parameter chunks to the given code completion string. 219686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorstatic void AddFunctionParameterChunks(ASTContext &Context, 21978987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor const PrintingPolicy &Policy, 219886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor FunctionDecl *Function, 2199218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder &Result, 2200218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor unsigned Start = 0, 2201218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor bool InOptional = false) { 2202218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor bool FirstParameter = true; 22030c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 2204218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor for (unsigned P = Start, N = Function->getNumParams(); P != N; ++P) { 220586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ParmVarDecl *Param = Function->getParamDecl(P); 220686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 2207218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor if (Param->hasDefaultArg() && !InOptional) { 220886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // When we see an optional default argument, put that argument and 220986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // the remaining default arguments into a new, optional string. 221028a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Opt(Result.getAllocator(), 221128a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis Result.getCodeCompletionTUInfo()); 2212218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor if (!FirstParameter) 22131eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Opt.AddChunk(CodeCompletionString::CK_Comma); 22148987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor AddFunctionParameterChunks(Context, Policy, Function, Opt, P, true); 2215218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddOptionalChunk(Opt.TakeString()); 2216218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor break; 221786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 221886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 2219218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor if (FirstParameter) 2220218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor FirstParameter = false; 2221218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor else 22221eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.AddChunk(CodeCompletionString::CK_Comma); 2223218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor 2224218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor InOptional = false; 222586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 222686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Format the placeholder string. 22278987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor std::string PlaceholderStr = FormatFunctionParameter(Context, Policy, 22288987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor Param); 222983482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor 2230e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor if (Function->isVariadic() && P == N - 1) 2231e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor PlaceholderStr += ", ..."; 2232e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor 223386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add the placeholder string. 2234dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddPlaceholderChunk( 2235dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.getAllocator().CopyString(PlaceholderStr)); 223686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 2237b3d4525c65cf456d3f1f4338afdcac83afc7be02Douglas Gregor 2238b3d4525c65cf456d3f1f4338afdcac83afc7be02Douglas Gregor if (const FunctionProtoType *Proto 2239b3d4525c65cf456d3f1f4338afdcac83afc7be02Douglas Gregor = Function->getType()->getAs<FunctionProtoType>()) 2240aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor if (Proto->isVariadic()) { 2241e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor if (Proto->getNumArgs() == 0) 2242218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddPlaceholderChunk("..."); 2243aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor 2244218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor MaybeAddSentinel(Context, Function, Result); 2245aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor } 224686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 224786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 224886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Add template parameter chunks to the given code completion string. 224986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorstatic void AddTemplateParameterChunks(ASTContext &Context, 22508987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor const PrintingPolicy &Policy, 225186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor TemplateDecl *Template, 2252218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder &Result, 2253218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor unsigned MaxParameters = 0, 2254218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor unsigned Start = 0, 2255218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor bool InDefaultArg = false) { 225686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool FirstParameter = true; 225786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 225886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor TemplateParameterList *Params = Template->getTemplateParameters(); 225986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor TemplateParameterList::iterator PEnd = Params->end(); 226086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (MaxParameters) 226186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PEnd = Params->begin() + MaxParameters; 2262218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor for (TemplateParameterList::iterator P = Params->begin() + Start; 2263218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor P != PEnd; ++P) { 226486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool HasDefaultArg = false; 226586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor std::string PlaceholderStr; 226686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(*P)) { 226786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (TTP->wasDeclaredWithTypename()) 226886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr = "typename"; 226986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor else 227086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr = "class"; 227186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 227286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (TTP->getIdentifier()) { 227386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr += ' '; 227486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr += TTP->getIdentifier()->getName(); 227586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 227686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 227786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor HasDefaultArg = TTP->hasDefaultArgument(); 227886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } else if (NonTypeTemplateParmDecl *NTTP 2279218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor = dyn_cast<NonTypeTemplateParmDecl>(*P)) { 228086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (NTTP->getIdentifier()) 228186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr = NTTP->getIdentifier()->getName(); 2282f85e193739c953358c865005855253af4f68a497John McCall NTTP->getType().getAsStringInternal(PlaceholderStr, Policy); 228386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor HasDefaultArg = NTTP->hasDefaultArgument(); 228486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } else { 228586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor assert(isa<TemplateTemplateParmDecl>(*P)); 228686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor TemplateTemplateParmDecl *TTP = cast<TemplateTemplateParmDecl>(*P); 228786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 228886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Since putting the template argument list into the placeholder would 228986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // be very, very long, we just use an abbreviation. 229086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr = "template<...> class"; 229186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (TTP->getIdentifier()) { 229286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr += ' '; 229386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr += TTP->getIdentifier()->getName(); 229486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 229586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 229686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor HasDefaultArg = TTP->hasDefaultArgument(); 229786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 229886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 2299218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor if (HasDefaultArg && !InDefaultArg) { 230086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // When we see an optional default argument, put that argument and 230186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // the remaining default arguments into a new, optional string. 230228a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Opt(Result.getAllocator(), 230328a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis Result.getCodeCompletionTUInfo()); 2304218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor if (!FirstParameter) 23051eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Opt.AddChunk(CodeCompletionString::CK_Comma); 23068987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor AddTemplateParameterChunks(Context, Policy, Template, Opt, MaxParameters, 2307218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor P - Params->begin(), true); 2308218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddOptionalChunk(Opt.TakeString()); 2309218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor break; 231086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 231186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 2312218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor InDefaultArg = false; 2313218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor 231486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (FirstParameter) 231586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor FirstParameter = false; 231686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor else 23171eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.AddChunk(CodeCompletionString::CK_Comma); 231886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 231986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add the placeholder string. 2320dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddPlaceholderChunk( 2321dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.getAllocator().CopyString(PlaceholderStr)); 232286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 232386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 232486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 2325b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor/// \brief Add a qualifier to the given code-completion string, if the 2326b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor/// provided nested-name-specifier is non-NULL. 2327a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregorstatic void 2328218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas GregorAddQualifierToCompletionString(CodeCompletionBuilder &Result, 2329a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor NestedNameSpecifier *Qualifier, 2330a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor bool QualifierIsInformative, 23318987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor ASTContext &Context, 23328987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor const PrintingPolicy &Policy) { 2333b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor if (!Qualifier) 2334b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor return; 2335b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor 2336b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor std::string PrintedNNS; 2337b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor { 2338b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor llvm::raw_string_ostream OS(PrintedNNS); 23398987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor Qualifier->print(OS, Policy); 2340b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor } 23410563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor if (QualifierIsInformative) 2342dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddInformativeChunk(Result.getAllocator().CopyString(PrintedNNS)); 23430563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor else 2344dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTextChunk(Result.getAllocator().CopyString(PrintedNNS)); 2345b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor} 2346b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor 2347218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregorstatic void 2348218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas GregorAddFunctionTypeQualsToCompletionString(CodeCompletionBuilder &Result, 2349218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor FunctionDecl *Function) { 2350a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor const FunctionProtoType *Proto 2351a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor = Function->getType()->getAs<FunctionProtoType>(); 2352a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor if (!Proto || !Proto->getTypeQuals()) 2353a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor return; 2354a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor 2355a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor // FIXME: Add ref-qualifier! 2356a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor 2357a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor // Handle single qualifiers without copying 2358a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor if (Proto->getTypeQuals() == Qualifiers::Const) { 2359a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor Result.AddInformativeChunk(" const"); 2360a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor return; 2361a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor } 2362a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor 2363a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor if (Proto->getTypeQuals() == Qualifiers::Volatile) { 2364a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor Result.AddInformativeChunk(" volatile"); 2365a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor return; 2366a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor } 2367a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor 2368a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor if (Proto->getTypeQuals() == Qualifiers::Restrict) { 2369a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor Result.AddInformativeChunk(" restrict"); 2370a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor return; 2371a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor } 2372a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor 2373a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor // Handle multiple qualifiers. 2374a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor std::string QualsStr; 23754ef832ffc1147ce2f9777f9fad650cb3139a1d00David Blaikie if (Proto->isConst()) 2376a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor QualsStr += " const"; 23774ef832ffc1147ce2f9777f9fad650cb3139a1d00David Blaikie if (Proto->isVolatile()) 2378a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor QualsStr += " volatile"; 23794ef832ffc1147ce2f9777f9fad650cb3139a1d00David Blaikie if (Proto->isRestrict()) 2380a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor QualsStr += " restrict"; 2381dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddInformativeChunk(Result.getAllocator().CopyString(QualsStr)); 2382a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor} 2383a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor 23846f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor/// \brief Add the name of the given declaration 23858987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregorstatic void AddTypedNameChunk(ASTContext &Context, const PrintingPolicy &Policy, 23868987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor NamedDecl *ND, CodeCompletionBuilder &Result) { 23876f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor DeclarationName Name = ND->getDeclName(); 23886f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor if (!Name) 23896f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor return; 23906f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 23916f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor switch (Name.getNameKind()) { 2392a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor case DeclarationName::CXXOperatorName: { 2393a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor const char *OperatorName = 0; 2394a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor switch (Name.getCXXOverloadedOperator()) { 2395a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor case OO_None: 2396a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor case OO_Conditional: 2397a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor case NUM_OVERLOADED_OPERATORS: 2398a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor OperatorName = "operator"; 2399a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor break; 2400a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor 2401a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 2402a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor case OO_##Name: OperatorName = "operator" Spelling; break; 2403a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor#define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly) 2404a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor#include "clang/Basic/OperatorKinds.def" 2405a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor 2406a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor case OO_New: OperatorName = "operator new"; break; 2407a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor case OO_Delete: OperatorName = "operator delete"; break; 2408a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor case OO_Array_New: OperatorName = "operator new[]"; break; 2409a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor case OO_Array_Delete: OperatorName = "operator delete[]"; break; 2410a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor case OO_Call: OperatorName = "operator()"; break; 2411a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor case OO_Subscript: OperatorName = "operator[]"; break; 2412a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor } 2413a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor Result.AddTypedTextChunk(OperatorName); 2414a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor break; 2415a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor } 2416a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor 24176f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case DeclarationName::Identifier: 24186f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case DeclarationName::CXXConversionFunctionName: 24196f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case DeclarationName::CXXDestructorName: 24206f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case DeclarationName::CXXLiteralOperatorName: 2421dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTypedTextChunk( 2422dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.getAllocator().CopyString(ND->getNameAsString())); 24236f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor break; 24246f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 24256f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case DeclarationName::CXXUsingDirective: 24266f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case DeclarationName::ObjCZeroArgSelector: 24276f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case DeclarationName::ObjCOneArgSelector: 24286f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case DeclarationName::ObjCMultiArgSelector: 24296f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor break; 24306f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 24316f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case DeclarationName::CXXConstructorName: { 24326f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor CXXRecordDecl *Record = 0; 24336f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor QualType Ty = Name.getCXXNameType(); 24346f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor if (const RecordType *RecordTy = Ty->getAs<RecordType>()) 24356f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor Record = cast<CXXRecordDecl>(RecordTy->getDecl()); 24366f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor else if (const InjectedClassNameType *InjectedTy 24376f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor = Ty->getAs<InjectedClassNameType>()) 24386f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor Record = InjectedTy->getDecl(); 24396f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor else { 2440dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTypedTextChunk( 2441dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.getAllocator().CopyString(ND->getNameAsString())); 24426f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor break; 24436f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor } 24446f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 2445dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTypedTextChunk( 2446dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.getAllocator().CopyString(Record->getNameAsString())); 24476f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor if (ClassTemplateDecl *Template = Record->getDescribedClassTemplate()) { 24481eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.AddChunk(CodeCompletionString::CK_LeftAngle); 24498987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor AddTemplateParameterChunks(Context, Policy, Template, Result); 24501eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.AddChunk(CodeCompletionString::CK_RightAngle); 24516f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor } 24526f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor break; 24536f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor } 24546f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor } 24556f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor} 24566f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 2457ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios KyrtzidisCodeCompletionString *CodeCompletionResult::CreateCodeCompletionString(Sema &S, 245828a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionAllocator &Allocator, 2459d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko CodeCompletionTUInfo &CCTUInfo, 2460d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko bool IncludeBriefComments) { 2461d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko return CreateCodeCompletionString(S.Context, S.PP, Allocator, CCTUInfo, 2462d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko IncludeBriefComments); 2463ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis} 2464ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis 246586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief If possible, create a new code completion string for the given 246686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// result. 246786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// 246886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \returns Either a new, heap-allocated code completion string describing 246986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// how to use this result, or NULL to indicate that the string or name of the 247086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// result is all that is needed. 247186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas GregorCodeCompletionString * 2472ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios KyrtzidisCodeCompletionResult::CreateCodeCompletionString(ASTContext &Ctx, 2473ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis Preprocessor &PP, 247428a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionAllocator &Allocator, 2475d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko CodeCompletionTUInfo &CCTUInfo, 2476d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko bool IncludeBriefComments) { 247728a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Result(Allocator, CCTUInfo, Priority, Availability); 24780c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 2479ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis PrintingPolicy Policy = getCompletionPrintingPolicy(Ctx, PP); 2480218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor if (Kind == RK_Pattern) { 2481218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Pattern->Priority = Priority; 2482218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Pattern->Availability = Availability; 2483ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor 2484ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor if (Declaration) { 2485ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor Result.addParentContext(Declaration->getDeclContext()); 2486ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor Pattern->ParentKind = Result.getParentKind(); 2487ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor Pattern->ParentName = Result.getParentName(); 2488ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor } 2489ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor 2490218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Pattern; 2491218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor } 24922b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 24932b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor if (Kind == RK_Keyword) { 2494218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddTypedTextChunk(Keyword); 2495218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Result.TakeString(); 24962b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor } 249786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 24983f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor if (Kind == RK_Macro) { 2499ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis MacroInfo *MI = PP.getMacroInfo(Macro); 25002b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor assert(MI && "Not a macro?"); 25012b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 2502dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTypedTextChunk( 2503dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.getAllocator().CopyString(Macro->getName())); 25042b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 25052b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor if (!MI->isFunctionLike()) 2506218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Result.TakeString(); 25073f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor 25083f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor // Format a function-like macro with placeholders for the arguments. 25091eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.AddChunk(CodeCompletionString::CK_LeftParen); 2510e42447021239015db97202fb04c304d82e84135fDouglas Gregor MacroInfo::arg_iterator A = MI->arg_begin(), AEnd = MI->arg_end(); 2511c8dc1352071575c36401158094a865ad682fb886Douglas Gregor 2512c8dc1352071575c36401158094a865ad682fb886Douglas Gregor // C99 variadic macros add __VA_ARGS__ at the end. Skip it. 2513c8dc1352071575c36401158094a865ad682fb886Douglas Gregor if (MI->isC99Varargs()) { 2514c8dc1352071575c36401158094a865ad682fb886Douglas Gregor --AEnd; 2515c8dc1352071575c36401158094a865ad682fb886Douglas Gregor 2516c8dc1352071575c36401158094a865ad682fb886Douglas Gregor if (A == AEnd) { 2517c8dc1352071575c36401158094a865ad682fb886Douglas Gregor Result.AddPlaceholderChunk("..."); 2518c8dc1352071575c36401158094a865ad682fb886Douglas Gregor } 2519e42447021239015db97202fb04c304d82e84135fDouglas Gregor } 2520c8dc1352071575c36401158094a865ad682fb886Douglas Gregor 2521e42447021239015db97202fb04c304d82e84135fDouglas Gregor for (MacroInfo::arg_iterator A = MI->arg_begin(); A != AEnd; ++A) { 25223f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor if (A != MI->arg_begin()) 25231eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.AddChunk(CodeCompletionString::CK_Comma); 2524c8dc1352071575c36401158094a865ad682fb886Douglas Gregor 2525c8dc1352071575c36401158094a865ad682fb886Douglas Gregor if (MI->isVariadic() && (A+1) == AEnd) { 2526f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith SmallString<32> Arg = (*A)->getName(); 2527c8dc1352071575c36401158094a865ad682fb886Douglas Gregor if (MI->isC99Varargs()) 2528c8dc1352071575c36401158094a865ad682fb886Douglas Gregor Arg += ", ..."; 2529c8dc1352071575c36401158094a865ad682fb886Douglas Gregor else 2530c8dc1352071575c36401158094a865ad682fb886Douglas Gregor Arg += "..."; 2531dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddPlaceholderChunk(Result.getAllocator().CopyString(Arg)); 2532c8dc1352071575c36401158094a865ad682fb886Douglas Gregor break; 25333f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor } 2534c8dc1352071575c36401158094a865ad682fb886Douglas Gregor 2535c8dc1352071575c36401158094a865ad682fb886Douglas Gregor // Non-variadic macros are simple. 2536c8dc1352071575c36401158094a865ad682fb886Douglas Gregor Result.AddPlaceholderChunk( 2537c8dc1352071575c36401158094a865ad682fb886Douglas Gregor Result.getAllocator().CopyString((*A)->getName())); 2538e42447021239015db97202fb04c304d82e84135fDouglas Gregor } 25391eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.AddChunk(CodeCompletionString::CK_RightParen); 2540218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Result.TakeString(); 25413f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor } 25423f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor 2543d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor assert(Kind == RK_Declaration && "Missed a result kind?"); 254486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NamedDecl *ND = Declaration; 2545ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor Result.addParentContext(ND->getDeclContext()); 2546d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko 2547d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko if (IncludeBriefComments) { 2548d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko // Add documentation comment, if it exists. 2549f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko if (const RawComment *RC = Ctx.getRawCommentForAnyRedecl(ND)) { 2550d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko Result.addBriefComment(RC->getBriefText(Ctx)); 2551d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko } 2552d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko } 2553d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko 25540c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor if (StartsNestedNameSpecifier) { 2555dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTypedTextChunk( 2556dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.getAllocator().CopyString(ND->getNameAsString())); 2557218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddTextChunk("::"); 2558218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Result.TakeString(); 25590c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor } 25606164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen 25616164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen for (Decl::attr_iterator i = ND->attr_begin(); i != ND->attr_end(); ++i) { 25626164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen if (AnnotateAttr *Attr = dyn_cast_or_null<AnnotateAttr>(*i)) { 25636164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen Result.AddAnnotation(Result.getAllocator().CopyString(Attr->getAnnotation())); 25646164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen } 25656164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen } 25660c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 2567ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis AddResultTypeChunk(Ctx, Policy, ND, Result); 2568ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor 256986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (FunctionDecl *Function = dyn_cast<FunctionDecl>(ND)) { 25700563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative, 2571ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis Ctx, Policy); 2572ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis AddTypedNameChunk(Ctx, Policy, ND, Result); 25731eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.AddChunk(CodeCompletionString::CK_LeftParen); 2574ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis AddFunctionParameterChunks(Ctx, Policy, Function, Result); 25751eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.AddChunk(CodeCompletionString::CK_RightParen); 2576a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor AddFunctionTypeQualsToCompletionString(Result, Function); 2577218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Result.TakeString(); 257886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 257986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 258086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (FunctionTemplateDecl *FunTmpl = dyn_cast<FunctionTemplateDecl>(ND)) { 25810563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative, 2582ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis Ctx, Policy); 258386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor FunctionDecl *Function = FunTmpl->getTemplatedDecl(); 2584ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis AddTypedNameChunk(Ctx, Policy, Function, Result); 25856f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 258686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Figure out which template parameters are deduced (or have default 258786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // arguments). 2588013b3668b67c8cb3ad2ee516c5607a3eba11829fBenjamin Kramer llvm::SmallBitVector Deduced; 2589ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis Sema::MarkDeducedTemplateParameters(Ctx, FunTmpl, Deduced); 259086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor unsigned LastDeducibleArgument; 259186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor for (LastDeducibleArgument = Deduced.size(); LastDeducibleArgument > 0; 259286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor --LastDeducibleArgument) { 259386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!Deduced[LastDeducibleArgument - 1]) { 259486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // C++0x: Figure out if the template argument has a default. If so, 259586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // the user doesn't need to type this argument. 259686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // FIXME: We need to abstract template parameters better! 259786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool HasDefaultArg = false; 259886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NamedDecl *Param = FunTmpl->getTemplateParameters()->getParam( 2599218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor LastDeducibleArgument - 1); 260086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(Param)) 260186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor HasDefaultArg = TTP->hasDefaultArgument(); 260286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor else if (NonTypeTemplateParmDecl *NTTP 260386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor = dyn_cast<NonTypeTemplateParmDecl>(Param)) 260486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor HasDefaultArg = NTTP->hasDefaultArgument(); 260586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor else { 260686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor assert(isa<TemplateTemplateParmDecl>(Param)); 260786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor HasDefaultArg 26080c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor = cast<TemplateTemplateParmDecl>(Param)->hasDefaultArgument(); 260986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 261086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 261186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!HasDefaultArg) 261286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor break; 261386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 261486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 261586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 261686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (LastDeducibleArgument) { 261786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Some of the function template arguments cannot be deduced from a 261886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // function call, so we introduce an explicit template argument list 261986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // containing all of the arguments up to the first deducible argument. 26201eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.AddChunk(CodeCompletionString::CK_LeftAngle); 2621ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis AddTemplateParameterChunks(Ctx, Policy, FunTmpl, Result, 262286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor LastDeducibleArgument); 26231eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.AddChunk(CodeCompletionString::CK_RightAngle); 262486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 262586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 262686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add the function parameters 26271eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.AddChunk(CodeCompletionString::CK_LeftParen); 2628ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis AddFunctionParameterChunks(Ctx, Policy, Function, Result); 26291eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.AddChunk(CodeCompletionString::CK_RightParen); 2630a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor AddFunctionTypeQualsToCompletionString(Result, Function); 2631218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Result.TakeString(); 263286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 263386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 263486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (TemplateDecl *Template = dyn_cast<TemplateDecl>(ND)) { 26350563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative, 2636ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis Ctx, Policy); 2637dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTypedTextChunk( 2638dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.getAllocator().CopyString(Template->getNameAsString())); 26391eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.AddChunk(CodeCompletionString::CK_LeftAngle); 2640ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis AddTemplateParameterChunks(Ctx, Policy, Template, Result); 26411eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.AddChunk(CodeCompletionString::CK_RightAngle); 2642218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Result.TakeString(); 264386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 264486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 26459630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(ND)) { 26469630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor Selector Sel = Method->getSelector(); 26479630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor if (Sel.isUnarySelector()) { 2648dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTypedTextChunk(Result.getAllocator().CopyString( 2649813d8346529bf094eb2b249648906ba7fd226688Douglas Gregor Sel.getNameForSlot(0))); 2650218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Result.TakeString(); 26519630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor } 26529630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor 2653813d8346529bf094eb2b249648906ba7fd226688Douglas Gregor std::string SelName = Sel.getNameForSlot(0).str(); 2654d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor SelName += ':'; 2655d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor if (StartParameter == 0) 2656dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTypedTextChunk(Result.getAllocator().CopyString(SelName)); 2657d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor else { 2658dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddInformativeChunk(Result.getAllocator().CopyString(SelName)); 2659d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor 2660d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor // If there is only one parameter, and we're past it, add an empty 2661d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor // typed-text chunk since there is nothing to type. 2662d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor if (Method->param_size() == 1) 2663218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddTypedTextChunk(""); 2664d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor } 26659630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor unsigned Idx = 0; 26669630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor for (ObjCMethodDecl::param_iterator P = Method->param_begin(), 26679630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor PEnd = Method->param_end(); 26689630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor P != PEnd; (void)++P, ++Idx) { 26699630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor if (Idx > 0) { 2670d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor std::string Keyword; 2671d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor if (Idx > StartParameter) 2672218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(CodeCompletionString::CK_HorizontalSpace); 26739630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor if (IdentifierInfo *II = Sel.getIdentifierInfoForSlot(Idx)) 2674a0651c5f5d1c8928d3ae062435ed9cf0aa0d04baBenjamin Kramer Keyword += II->getName(); 26759630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor Keyword += ":"; 26761f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor if (Idx < StartParameter || AllParametersAreInformative) 2677dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddInformativeChunk(Result.getAllocator().CopyString(Keyword)); 2678c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor else 2679dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTypedTextChunk(Result.getAllocator().CopyString(Keyword)); 26809630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor } 2681d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor 2682d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor // If we're before the starting parameter, skip the placeholder. 2683d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor if (Idx < StartParameter) 2684d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor continue; 26859630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor 26869630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor std::string Arg; 268783482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor 268883482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor if ((*P)->getType()->isBlockPointerType() && !DeclaringEntity) 2689ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis Arg = FormatFunctionParameter(Ctx, Policy, *P, true); 269083482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor else { 2691f85e193739c953358c865005855253af4f68a497John McCall (*P)->getType().getAsStringInternal(Arg, Policy); 26926fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor Arg = "(" + formatObjCParamQualifiers((*P)->getObjCDeclQualifier()) 26936fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor + Arg + ")"; 269483482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor if (IdentifierInfo *II = (*P)->getIdentifier()) 2695aba480862485ea1140a81f25c23f43bb080edc90Douglas Gregor if (DeclaringEntity || AllParametersAreInformative) 2696a0651c5f5d1c8928d3ae062435ed9cf0aa0d04baBenjamin Kramer Arg += II->getName(); 269783482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor } 269883482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor 2699e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor if (Method->isVariadic() && (P + 1) == PEnd) 2700e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor Arg += ", ..."; 2701e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor 27021f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor if (DeclaringEntity) 2703dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTextChunk(Result.getAllocator().CopyString(Arg)); 27041f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor else if (AllParametersAreInformative) 2705dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddInformativeChunk(Result.getAllocator().CopyString(Arg)); 27064ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor else 2707dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddPlaceholderChunk(Result.getAllocator().CopyString(Arg)); 27089630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor } 27099630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor 27102a17af0c7e05500e25d4cc71341f1f232085ebeaDouglas Gregor if (Method->isVariadic()) { 2711e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor if (Method->param_size() == 0) { 2712e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor if (DeclaringEntity) 2713218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddTextChunk(", ..."); 2714e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor else if (AllParametersAreInformative) 2715218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddInformativeChunk(", ..."); 2716e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor else 2717218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddPlaceholderChunk(", ..."); 2718e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor } 2719aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor 2720ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis MaybeAddSentinel(Ctx, Method, Result); 27212a17af0c7e05500e25d4cc71341f1f232085ebeaDouglas Gregor } 27222a17af0c7e05500e25d4cc71341f1f232085ebeaDouglas Gregor 2723218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Result.TakeString(); 27249630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor } 27259630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor 27262b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor if (Qualifier) 27270563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative, 2728ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis Ctx, Policy); 27292b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 2730dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTypedTextChunk( 2731dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.getAllocator().CopyString(ND->getNameAsString())); 2732218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Result.TakeString(); 273386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 273486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 273586d802e03a267af79663990c39865c67e0645238Douglas GregorCodeCompletionString * 273686d802e03a267af79663990c39865c67e0645238Douglas GregorCodeCompleteConsumer::OverloadCandidate::CreateSignatureString( 273786d802e03a267af79663990c39865c67e0645238Douglas Gregor unsigned CurrentArg, 273832be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor Sema &S, 273928a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionAllocator &Allocator, 274028a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionTUInfo &CCTUInfo) const { 27418987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor PrintingPolicy Policy = getCompletionPrintingPolicy(S); 2742f85e193739c953358c865005855253af4f68a497John McCall 2743218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor // FIXME: Set priority, availability appropriately. 274428a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Result(Allocator,CCTUInfo, 1, CXAvailability_Available); 274586d802e03a267af79663990c39865c67e0645238Douglas Gregor FunctionDecl *FDecl = getFunction(); 27468987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor AddResultTypeChunk(S.Context, Policy, FDecl, Result); 274786d802e03a267af79663990c39865c67e0645238Douglas Gregor const FunctionProtoType *Proto 274886d802e03a267af79663990c39865c67e0645238Douglas Gregor = dyn_cast<FunctionProtoType>(getFunctionType()); 274986d802e03a267af79663990c39865c67e0645238Douglas Gregor if (!FDecl && !Proto) { 275086d802e03a267af79663990c39865c67e0645238Douglas Gregor // Function without a prototype. Just give the return type and a 275186d802e03a267af79663990c39865c67e0645238Douglas Gregor // highlighted ellipsis. 275286d802e03a267af79663990c39865c67e0645238Douglas Gregor const FunctionType *FT = getFunctionType(); 2753a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor Result.AddTextChunk(GetCompletionTypeString(FT->getResultType(), 27548987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor S.Context, Policy, 2755a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor Result.getAllocator())); 27561eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.AddChunk(CodeCompletionString::CK_LeftParen); 27571eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.AddChunk(CodeCompletionString::CK_CurrentParameter, "..."); 27581eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.AddChunk(CodeCompletionString::CK_RightParen); 2759218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Result.TakeString(); 276086d802e03a267af79663990c39865c67e0645238Douglas Gregor } 276186d802e03a267af79663990c39865c67e0645238Douglas Gregor 276286d802e03a267af79663990c39865c67e0645238Douglas Gregor if (FDecl) 2763dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTextChunk( 2764dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.getAllocator().CopyString(FDecl->getNameAsString())); 276586d802e03a267af79663990c39865c67e0645238Douglas Gregor else 2766218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddTextChunk( 2767dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.getAllocator().CopyString( 2768f85e193739c953358c865005855253af4f68a497John McCall Proto->getResultType().getAsString(Policy))); 276986d802e03a267af79663990c39865c67e0645238Douglas Gregor 27701eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.AddChunk(CodeCompletionString::CK_LeftParen); 277186d802e03a267af79663990c39865c67e0645238Douglas Gregor unsigned NumParams = FDecl? FDecl->getNumParams() : Proto->getNumArgs(); 277286d802e03a267af79663990c39865c67e0645238Douglas Gregor for (unsigned I = 0; I != NumParams; ++I) { 277386d802e03a267af79663990c39865c67e0645238Douglas Gregor if (I) 27741eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.AddChunk(CodeCompletionString::CK_Comma); 277586d802e03a267af79663990c39865c67e0645238Douglas Gregor 277686d802e03a267af79663990c39865c67e0645238Douglas Gregor std::string ArgString; 277786d802e03a267af79663990c39865c67e0645238Douglas Gregor QualType ArgType; 277886d802e03a267af79663990c39865c67e0645238Douglas Gregor 277986d802e03a267af79663990c39865c67e0645238Douglas Gregor if (FDecl) { 278086d802e03a267af79663990c39865c67e0645238Douglas Gregor ArgString = FDecl->getParamDecl(I)->getNameAsString(); 278186d802e03a267af79663990c39865c67e0645238Douglas Gregor ArgType = FDecl->getParamDecl(I)->getOriginalType(); 278286d802e03a267af79663990c39865c67e0645238Douglas Gregor } else { 278386d802e03a267af79663990c39865c67e0645238Douglas Gregor ArgType = Proto->getArgType(I); 278486d802e03a267af79663990c39865c67e0645238Douglas Gregor } 278586d802e03a267af79663990c39865c67e0645238Douglas Gregor 2786f85e193739c953358c865005855253af4f68a497John McCall ArgType.getAsStringInternal(ArgString, Policy); 278786d802e03a267af79663990c39865c67e0645238Douglas Gregor 278886d802e03a267af79663990c39865c67e0645238Douglas Gregor if (I == CurrentArg) 27891eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.AddChunk(CodeCompletionString::CK_CurrentParameter, 27901eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.getAllocator().CopyString(ArgString)); 279186d802e03a267af79663990c39865c67e0645238Douglas Gregor else 2792dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTextChunk(Result.getAllocator().CopyString(ArgString)); 279386d802e03a267af79663990c39865c67e0645238Douglas Gregor } 279486d802e03a267af79663990c39865c67e0645238Douglas Gregor 279586d802e03a267af79663990c39865c67e0645238Douglas Gregor if (Proto && Proto->isVariadic()) { 27961eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.AddChunk(CodeCompletionString::CK_Comma); 279786d802e03a267af79663990c39865c67e0645238Douglas Gregor if (CurrentArg < NumParams) 2798218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddTextChunk("..."); 279986d802e03a267af79663990c39865c67e0645238Douglas Gregor else 28001eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.AddChunk(CodeCompletionString::CK_CurrentParameter, "..."); 280186d802e03a267af79663990c39865c67e0645238Douglas Gregor } 28021eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.AddChunk(CodeCompletionString::CK_RightParen); 280386d802e03a267af79663990c39865c67e0645238Douglas Gregor 2804218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Result.TakeString(); 280586d802e03a267af79663990c39865c67e0645238Douglas Gregor} 280686d802e03a267af79663990c39865c67e0645238Douglas Gregor 28075f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerunsigned clang::getMacroUsagePriority(StringRef MacroName, 2808b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor const LangOptions &LangOpts, 28091827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor bool PreferredTypeIsPointer) { 28101827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor unsigned Priority = CCP_Macro; 28111827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor 2812b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor // Treat the "nil", "Nil" and "NULL" macros as null pointer constants. 2813b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor if (MacroName.equals("nil") || MacroName.equals("NULL") || 2814b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor MacroName.equals("Nil")) { 28151827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor Priority = CCP_Constant; 28161827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor if (PreferredTypeIsPointer) 28171827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor Priority = Priority / CCF_SimilarTypeMatch; 2818b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor } 2819b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor // Treat "YES", "NO", "true", and "false" as constants. 2820b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor else if (MacroName.equals("YES") || MacroName.equals("NO") || 2821b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor MacroName.equals("true") || MacroName.equals("false")) 2822b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor Priority = CCP_Constant; 2823b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor // Treat "bool" as a type. 2824b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor else if (MacroName.equals("bool")) 2825b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor Priority = CCP_Type + (LangOpts.ObjC1? CCD_bool_in_ObjC : 0); 2826b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor 28271827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor 28281827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor return Priority; 28291827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor} 28301827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor 2831e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas GregorCXCursorKind clang::getCursorKindForDecl(Decl *D) { 2832e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor if (!D) 2833e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor return CXCursor_UnexposedDecl; 2834e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor 2835e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor switch (D->getKind()) { 2836e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::Enum: return CXCursor_EnumDecl; 2837e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::EnumConstant: return CXCursor_EnumConstantDecl; 2838e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::Field: return CXCursor_FieldDecl; 2839e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::Function: 2840e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor return CXCursor_FunctionDecl; 2841e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::ObjCCategory: return CXCursor_ObjCCategoryDecl; 2842e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::ObjCCategoryImpl: return CXCursor_ObjCCategoryImplDecl; 2843e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::ObjCImplementation: return CXCursor_ObjCImplementationDecl; 2844375bb1413c041055262c8a416f20d10474a5eda9Douglas Gregor 2845c15707d8da08df2eb22f6ed047743fa3f7c9831bArgyrios Kyrtzidis case Decl::ObjCInterface: return CXCursor_ObjCInterfaceDecl; 2846e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::ObjCIvar: return CXCursor_ObjCIvarDecl; 2847e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::ObjCMethod: 2848e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor return cast<ObjCMethodDecl>(D)->isInstanceMethod() 2849e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor ? CXCursor_ObjCInstanceMethodDecl : CXCursor_ObjCClassMethodDecl; 2850e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::CXXMethod: return CXCursor_CXXMethod; 2851e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::CXXConstructor: return CXCursor_Constructor; 2852e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::CXXDestructor: return CXCursor_Destructor; 2853e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::CXXConversion: return CXCursor_ConversionFunction; 2854e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::ObjCProperty: return CXCursor_ObjCPropertyDecl; 2855c15707d8da08df2eb22f6ed047743fa3f7c9831bArgyrios Kyrtzidis case Decl::ObjCProtocol: return CXCursor_ObjCProtocolDecl; 2856e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::ParmVar: return CXCursor_ParmDecl; 2857e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::Typedef: return CXCursor_TypedefDecl; 2858162e1c1b487352434552147967c3dd296ebee2f7Richard Smith case Decl::TypeAlias: return CXCursor_TypeAliasDecl; 2859e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::Var: return CXCursor_VarDecl; 2860e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::Namespace: return CXCursor_Namespace; 2861e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::NamespaceAlias: return CXCursor_NamespaceAlias; 2862e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::TemplateTypeParm: return CXCursor_TemplateTypeParameter; 2863e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::NonTypeTemplateParm:return CXCursor_NonTypeTemplateParameter; 2864e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::TemplateTemplateParm:return CXCursor_TemplateTemplateParameter; 2865e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::FunctionTemplate: return CXCursor_FunctionTemplate; 2866e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::ClassTemplate: return CXCursor_ClassTemplate; 28672dfdb948bef51a601e763191e4becfe59880d382Argyrios Kyrtzidis case Decl::AccessSpec: return CXCursor_CXXAccessSpecifier; 2868e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::ClassTemplatePartialSpecialization: 2869e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor return CXCursor_ClassTemplatePartialSpecialization; 2870e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::UsingDirective: return CXCursor_UsingDirective; 28718e5900c8e9bd32bcc385124f564f3d38a11d0e28Douglas Gregor case Decl::TranslationUnit: return CXCursor_TranslationUnit; 2872e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor 2873e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::Using: 2874e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::UnresolvedUsingValue: 2875e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::UnresolvedUsingTypename: 2876e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor return CXCursor_UsingDeclaration; 2877e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor 2878352697a87bca664356f21a838b162084013625eaDouglas Gregor case Decl::ObjCPropertyImpl: 2879352697a87bca664356f21a838b162084013625eaDouglas Gregor switch (cast<ObjCPropertyImplDecl>(D)->getPropertyImplementation()) { 2880352697a87bca664356f21a838b162084013625eaDouglas Gregor case ObjCPropertyImplDecl::Dynamic: 2881352697a87bca664356f21a838b162084013625eaDouglas Gregor return CXCursor_ObjCDynamicDecl; 2882352697a87bca664356f21a838b162084013625eaDouglas Gregor 2883352697a87bca664356f21a838b162084013625eaDouglas Gregor case ObjCPropertyImplDecl::Synthesize: 2884352697a87bca664356f21a838b162084013625eaDouglas Gregor return CXCursor_ObjCSynthesizeDecl; 2885352697a87bca664356f21a838b162084013625eaDouglas Gregor } 2886352697a87bca664356f21a838b162084013625eaDouglas Gregor 2887e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor default: 2888e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor if (TagDecl *TD = dyn_cast<TagDecl>(D)) { 2889e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor switch (TD->getTagKind()) { 28906666ed4ed2e2bc13da5ac5d0a4947019137d45beJoao Matos case TTK_Interface: // fall through 2891e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case TTK_Struct: return CXCursor_StructDecl; 2892e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case TTK_Class: return CXCursor_ClassDecl; 2893e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case TTK_Union: return CXCursor_UnionDecl; 2894e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case TTK_Enum: return CXCursor_EnumDecl; 2895e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor } 2896e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor } 2897e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor } 2898e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor 2899e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor return CXCursor_UnexposedDecl; 2900e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor} 2901e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor 2902590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregorstatic void AddMacroResults(Preprocessor &PP, ResultBuilder &Results, 2903590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregor bool TargetTypeIsPointer = false) { 29040a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 2905590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregor 29063f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor Results.EnterNewScope(); 2907c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor 29080c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor for (Preprocessor::macro_iterator M = PP.macro_begin(), 29090c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor MEnd = PP.macro_end(); 2910590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregor M != MEnd; ++M) { 29118a64bb58c3b24d7d97895e435bbc0965c99bd3beAlexander Kornienko // FIXME: Eventually, we'd want to be able to look back to the macro 29128a64bb58c3b24d7d97895e435bbc0965c99bd3beAlexander Kornienko // definition that was actually active at the point of code completion (even 29138a64bb58c3b24d7d97895e435bbc0965c99bd3beAlexander Kornienko // if that macro has since been #undef'd). 29148a64bb58c3b24d7d97895e435bbc0965c99bd3beAlexander Kornienko if (M->first->hasMacroDefinition()) 29158a64bb58c3b24d7d97895e435bbc0965c99bd3beAlexander Kornienko Results.AddResult(Result(M->first, 29161827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor getMacroUsagePriority(M->first->getName(), 29174e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie PP.getLangOpts(), 29181827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor TargetTypeIsPointer))); 2919590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregor } 2920c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor 29213f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor Results.ExitScope(); 2922c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor 29233f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor} 29243f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor 2925aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregorstatic void AddPrettyFunctionResults(const LangOptions &LangOpts, 2926aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor ResultBuilder &Results) { 29270a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 2928aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor 2929aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor Results.EnterNewScope(); 2930c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor 2931aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor Results.AddResult(Result("__PRETTY_FUNCTION__", CCP_Constant)); 2932aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor Results.AddResult(Result("__FUNCTION__", CCP_Constant)); 2933aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor if (LangOpts.C99 || LangOpts.CPlusPlus0x) 2934aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor Results.AddResult(Result("__func__", CCP_Constant)); 2935aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor Results.ExitScope(); 2936aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor} 2937aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor 29383a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbarstatic void HandleCodeCompleteResults(Sema *S, 29393a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar CodeCompleteConsumer *CodeCompleter, 2940e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext Context, 29410a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall CodeCompletionResult *Results, 2942e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor unsigned NumResults) { 294386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (CodeCompleter) 2944e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompleter->ProcessCodeCompleteResults(*S, Context, Results, NumResults); 294586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 294686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 2947e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregorstatic enum CodeCompletionContext::Kind mapCodeCompletionContext(Sema &S, 2948e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Sema::ParserCompletionContext PCC) { 2949e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor switch (PCC) { 2950f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Namespace: 2951e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor return CodeCompletionContext::CCC_TopLevel; 2952e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor 2953f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Class: 2954e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor return CodeCompletionContext::CCC_ClassStructUnion; 2955e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor 2956f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ObjCInterface: 2957e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor return CodeCompletionContext::CCC_ObjCInterface; 2958e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor 2959f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ObjCImplementation: 2960e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor return CodeCompletionContext::CCC_ObjCImplementation; 2961e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor 2962f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ObjCInstanceVariableList: 2963e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor return CodeCompletionContext::CCC_ObjCIvarList; 2964e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor 2965f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Template: 2966f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_MemberTemplate: 296752779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor if (S.CurContext->isFileContext()) 296852779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor return CodeCompletionContext::CCC_TopLevel; 29697530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie if (S.CurContext->isRecord()) 297052779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor return CodeCompletionContext::CCC_ClassStructUnion; 29717530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie return CodeCompletionContext::CCC_Other; 297252779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor 2973f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_RecoveryInFunction: 297452779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor return CodeCompletionContext::CCC_Recovery; 2975a5450a097e83072c0e545ccd8df8b07e172f1b09Douglas Gregor 2976f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ForInit: 29774e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (S.getLangOpts().CPlusPlus || S.getLangOpts().C99 || 29784e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie S.getLangOpts().ObjC1) 2979a5450a097e83072c0e545ccd8df8b07e172f1b09Douglas Gregor return CodeCompletionContext::CCC_ParenthesizedExpression; 2980a5450a097e83072c0e545ccd8df8b07e172f1b09Douglas Gregor else 2981a5450a097e83072c0e545ccd8df8b07e172f1b09Douglas Gregor return CodeCompletionContext::CCC_Expression; 2982a5450a097e83072c0e545ccd8df8b07e172f1b09Douglas Gregor 2983a5450a097e83072c0e545ccd8df8b07e172f1b09Douglas Gregor case Sema::PCC_Expression: 2984f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Condition: 2985e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor return CodeCompletionContext::CCC_Expression; 2986e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor 2987f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Statement: 2988e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor return CodeCompletionContext::CCC_Statement; 298972db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor 2990f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Type: 299172db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor return CodeCompletionContext::CCC_Type; 29920268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor 29930268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor case Sema::PCC_ParenthesizedExpression: 29940268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor return CodeCompletionContext::CCC_ParenthesizedExpression; 299568e3c2eef52701a178fbcc2bb424f31dd4b36931Douglas Gregor 299668e3c2eef52701a178fbcc2bb424f31dd4b36931Douglas Gregor case Sema::PCC_LocalDeclarationSpecifiers: 299768e3c2eef52701a178fbcc2bb424f31dd4b36931Douglas Gregor return CodeCompletionContext::CCC_Type; 2998e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor } 29997530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie 30007530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie llvm_unreachable("Invalid ParserCompletionContext!"); 3001e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor} 3002e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor 3003f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor/// \brief If we're in a C++ virtual member function, add completion results 3004f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor/// that invoke the functions we override, since it's common to invoke the 3005f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor/// overridden function as well as adding new functionality. 3006f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor/// 3007f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor/// \param S The semantic analysis object for which we are generating results. 3008f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor/// 3009f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor/// \param InContext This context in which the nested-name-specifier preceding 3010f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor/// the code-completion point 3011f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregorstatic void MaybeAddOverrideCalls(Sema &S, DeclContext *InContext, 3012f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor ResultBuilder &Results) { 3013f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor // Look through blocks. 3014f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor DeclContext *CurContext = S.CurContext; 3015f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor while (isa<BlockDecl>(CurContext)) 3016f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor CurContext = CurContext->getParent(); 3017f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor 3018f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor 3019f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(CurContext); 3020f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor if (!Method || !Method->isVirtual()) 3021f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor return; 3022f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor 3023f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor // We need to have names for all of the parameters, if we're going to 3024f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor // generate a forwarding call. 3025f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor for (CXXMethodDecl::param_iterator P = Method->param_begin(), 3026f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor PEnd = Method->param_end(); 3027f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor P != PEnd; 3028f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor ++P) { 3029f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor if (!(*P)->getDeclName()) 3030f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor return; 3031f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor } 3032f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor 30338987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor PrintingPolicy Policy = getCompletionPrintingPolicy(S); 3034f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor for (CXXMethodDecl::method_iterator M = Method->begin_overridden_methods(), 3035f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor MEnd = Method->end_overridden_methods(); 3036f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor M != MEnd; ++M) { 303728a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Builder(Results.getAllocator(), 303828a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis Results.getCodeCompletionTUInfo()); 3039f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor CXXMethodDecl *Overridden = const_cast<CXXMethodDecl *>(*M); 3040f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor if (Overridden->getCanonicalDecl() == Method->getCanonicalDecl()) 3041f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor continue; 3042f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor 3043f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor // If we need a nested-name-specifier, add one now. 3044f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor if (!InContext) { 3045f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor NestedNameSpecifier *NNS 3046f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor = getRequiredQualification(S.Context, CurContext, 3047f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor Overridden->getDeclContext()); 3048f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor if (NNS) { 3049f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor std::string Str; 3050f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor llvm::raw_string_ostream OS(Str); 30518987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor NNS->print(OS, Policy); 3052dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddTextChunk(Results.getAllocator().CopyString(OS.str())); 3053f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor } 3054f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor } else if (!InContext->Equals(Overridden->getDeclContext())) 3055f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor continue; 3056f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor 3057dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddTypedTextChunk(Results.getAllocator().CopyString( 3058218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Overridden->getNameAsString())); 3059218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 3060f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor bool FirstParam = true; 3061f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor for (CXXMethodDecl::param_iterator P = Method->param_begin(), 3062f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor PEnd = Method->param_end(); 3063f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor P != PEnd; ++P) { 3064f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor if (FirstParam) 3065f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor FirstParam = false; 3066f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor else 3067218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_Comma); 3068f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor 3069dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddPlaceholderChunk(Results.getAllocator().CopyString( 3070218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor (*P)->getIdentifier()->getName())); 3071f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor } 3072218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 3073218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(CodeCompletionResult(Builder.TakeString(), 3074f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor CCP_SuperCompletion, 3075ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor CXCursor_CXXMethod, 3076ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor CXAvailability_Available, 3077ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor Overridden)); 3078f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor Results.Ignore(Overridden); 3079f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor } 3080f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor} 3081f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor 3082c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregorvoid Sema::CodeCompleteModuleImport(SourceLocation ImportLoc, 3083c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor ModuleIdPath Path) { 3084c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor typedef CodeCompletionResult Result; 3085c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 308628a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 3087c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor CodeCompletionContext::CCC_Other); 3088c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor Results.EnterNewScope(); 3089c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor 3090c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor CodeCompletionAllocator &Allocator = Results.getAllocator(); 309128a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo()); 3092c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor typedef CodeCompletionResult Result; 3093c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor if (Path.empty()) { 3094c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor // Enumerate all top-level modules. 3095c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor llvm::SmallVector<Module *, 8> Modules; 3096c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor PP.getHeaderSearchInfo().collectAllModules(Modules); 3097c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor for (unsigned I = 0, N = Modules.size(); I != N; ++I) { 3098c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor Builder.AddTypedTextChunk( 3099c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor Builder.getAllocator().CopyString(Modules[I]->Name)); 3100c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor Results.AddResult(Result(Builder.TakeString(), 3101c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor CCP_Declaration, 3102c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor CXCursor_NotImplemented, 3103c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor Modules[I]->isAvailable() 3104c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor ? CXAvailability_Available 3105c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor : CXAvailability_NotAvailable)); 3106c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor } 3107c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor } else { 3108c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor // Load the named module. 3109c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor Module *Mod = PP.getModuleLoader().loadModule(ImportLoc, Path, 3110c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor Module::AllVisible, 3111c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor /*IsInclusionDirective=*/false); 3112c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor // Enumerate submodules. 3113c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor if (Mod) { 3114c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor for (Module::submodule_iterator Sub = Mod->submodule_begin(), 3115c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor SubEnd = Mod->submodule_end(); 3116c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor Sub != SubEnd; ++Sub) { 3117c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor 3118c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor Builder.AddTypedTextChunk( 3119c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor Builder.getAllocator().CopyString((*Sub)->Name)); 3120c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor Results.AddResult(Result(Builder.TakeString(), 3121c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor CCP_Declaration, 3122c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor CXCursor_NotImplemented, 3123c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor (*Sub)->isAvailable() 3124c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor ? CXAvailability_Available 3125c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor : CXAvailability_NotAvailable)); 3126c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor } 3127c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor } 3128c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor } 3129c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor Results.ExitScope(); 3130c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 3131c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor Results.data(),Results.size()); 3132c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor} 3133c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor 313401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregorvoid Sema::CodeCompleteOrdinaryName(Scope *S, 3135e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor ParserCompletionContext CompletionContext) { 3136218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 313728a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 313852779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor mapCodeCompletionContext(*this, CompletionContext)); 3139f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor Results.EnterNewScope(); 3140cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor 314101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Determine how to filter results, e.g., so that the names of 314201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // values (functions, enumerators, function templates, etc.) are 314301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // only allowed where we can have an expression. 314401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor switch (CompletionContext) { 3145e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_Namespace: 3146e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_Class: 3147e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_ObjCInterface: 3148e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_ObjCImplementation: 3149e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_ObjCInstanceVariableList: 3150e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_Template: 3151e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_MemberTemplate: 315272db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_Type: 315368e3c2eef52701a178fbcc2bb424f31dd4b36931Douglas Gregor case PCC_LocalDeclarationSpecifiers: 315401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Results.setFilter(&ResultBuilder::IsOrdinaryNonValueName); 315501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 315601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 3157e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_Statement: 31580268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor case PCC_ParenthesizedExpression: 3159eb0d0145910f3024d9bdefe279a1e9b95495f2fdDouglas Gregor case PCC_Expression: 3160e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_ForInit: 3161e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_Condition: 31624e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (WantTypesInContext(CompletionContext, getLangOpts())) 31634710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor Results.setFilter(&ResultBuilder::IsOrdinaryName); 31644710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor else 31654710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor Results.setFilter(&ResultBuilder::IsOrdinaryNonTypeName); 3166f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor 31674e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (getLangOpts().CPlusPlus) 3168f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor MaybeAddOverrideCalls(*this, /*InContext=*/0, Results); 316901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 3170dc8453422bec3bbf70c03920e01498d75783d122Douglas Gregor 3171e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_RecoveryInFunction: 3172dc8453422bec3bbf70c03920e01498d75783d122Douglas Gregor // Unfiltered 3173dc8453422bec3bbf70c03920e01498d75783d122Douglas Gregor break; 317401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 317501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 31763cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor // If we are in a C++ non-static member function, check the qualifiers on 31773cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor // the member function to filter/prioritize the results list. 31783cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor if (CXXMethodDecl *CurMethod = dyn_cast<CXXMethodDecl>(CurContext)) 31793cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor if (CurMethod->isInstance()) 31803cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor Results.setObjectTypeQualifiers( 31813cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor Qualifiers::fromCVRMask(CurMethod->getTypeQualifiers())); 31823cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor 31831ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 31848071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 31858071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompleter->includeGlobals()); 31862a7925c4abe45650f3ab27be09468e3a3a98084aDouglas Gregor 3187bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddOrdinaryNameResults(CompletionContext, S, *this, Results); 31882a7925c4abe45650f3ab27be09468e3a3a98084aDouglas Gregor Results.ExitScope(); 31892a7925c4abe45650f3ab27be09468e3a3a98084aDouglas Gregor 3190aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor switch (CompletionContext) { 31910268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor case PCC_ParenthesizedExpression: 319272db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_Expression: 319372db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_Statement: 319472db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_RecoveryInFunction: 319572db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor if (S->getFnParent()) 31964e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie AddPrettyFunctionResults(PP.getLangOpts(), Results); 319772db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor break; 319872db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor 319972db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_Namespace: 320072db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_Class: 320172db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_ObjCInterface: 320272db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_ObjCImplementation: 320372db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_ObjCInstanceVariableList: 320472db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_Template: 320572db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_MemberTemplate: 320672db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_ForInit: 320772db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_Condition: 320872db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_Type: 320968e3c2eef52701a178fbcc2bb424f31dd4b36931Douglas Gregor case PCC_LocalDeclarationSpecifiers: 321072db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor break; 3211aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor } 3212aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor 32130c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor if (CodeCompleter->includeMacros()) 3214bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddMacroResults(PP, Results); 3215aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor 3216cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 3217e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 3218791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor} 3219791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor 3220c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregorstatic void AddClassMessageCompletions(Sema &SemaRef, Scope *S, 3221c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor ParsedType Receiver, 3222c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor IdentifierInfo **SelIdents, 3223c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor unsigned NumSelIdents, 322470c5ac70ace21b011dc2d4001bae26cdcf62ff8dDouglas Gregor bool AtArgumentExpression, 3225c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor bool IsSuper, 3226c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor ResultBuilder &Results); 3227c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor 3228c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregorvoid Sema::CodeCompleteDeclSpec(Scope *S, DeclSpec &DS, 3229c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor bool AllowNonIdentifiers, 3230c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor bool AllowNestedNameSpecifiers) { 32310a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 3232218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 323328a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 323452779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor AllowNestedNameSpecifiers 323552779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor ? CodeCompletionContext::CCC_PotentiallyQualifiedName 323652779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor : CodeCompletionContext::CCC_Name); 32372ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor Results.EnterNewScope(); 32382ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor 32392ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor // Type qualifiers can come after names. 32402ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor Results.AddResult(Result("const")); 32412ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor Results.AddResult(Result("volatile")); 32424e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (getLangOpts().C99) 32432ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor Results.AddResult(Result("restrict")); 32442ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor 32454e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (getLangOpts().CPlusPlus) { 32462ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor if (AllowNonIdentifiers) { 32472ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor Results.AddResult(Result("operator")); 32482ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor } 32492ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor 32502ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor // Add nested-name-specifiers. 32512ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor if (AllowNestedNameSpecifiers) { 32522ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor Results.allowNestedNameSpecifiers(); 325352779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor Results.setFilter(&ResultBuilder::IsImpossibleToSatisfy); 32542ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 32552ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor LookupVisibleDecls(S, LookupNestedNameSpecifierName, Consumer, 32562ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor CodeCompleter->includeGlobals()); 325752779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor Results.setFilter(0); 32582ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor } 32592ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor } 32602ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor Results.ExitScope(); 32612ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor 3262c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor // If we're in a context where we might have an expression (rather than a 3263c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor // declaration), and what we've seen so far is an Objective-C type that could 3264c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor // be a receiver of a class message, this may be a class message send with 3265c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor // the initial opening bracket '[' missing. Add appropriate completions. 3266c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor if (AllowNonIdentifiers && !AllowNestedNameSpecifiers && 3267c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor DS.getTypeSpecType() == DeclSpec::TST_typename && 3268c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor DS.getStorageClassSpecAsWritten() == DeclSpec::SCS_unspecified && 3269c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor !DS.isThreadSpecified() && !DS.isExternInLinkageSpec() && 3270c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor DS.getTypeSpecComplex() == DeclSpec::TSC_unspecified && 3271c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor DS.getTypeSpecSign() == DeclSpec::TSS_unspecified && 3272c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor DS.getTypeQualifiers() == 0 && 3273c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor S && 3274c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor (S->getFlags() & Scope::DeclScope) != 0 && 3275c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor (S->getFlags() & (Scope::ClassScope | Scope::TemplateParamScope | 3276c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor Scope::FunctionPrototypeScope | 3277c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor Scope::AtCatchScope)) == 0) { 3278c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor ParsedType T = DS.getRepAsType(); 3279c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor if (!T.get().isNull() && T.get()->isObjCObjectOrInterfaceType()) 328070c5ac70ace21b011dc2d4001bae26cdcf62ff8dDouglas Gregor AddClassMessageCompletions(*this, S, T, 0, 0, false, false, Results); 3281c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor } 3282c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor 32834497dd49f78eb5e1a7c3f19d1a13564f79e12341Douglas Gregor // Note that we intentionally suppress macro results here, since we do not 32844497dd49f78eb5e1a7c3f19d1a13564f79e12341Douglas Gregor // encourage using macros to produce the names of entities. 32854497dd49f78eb5e1a7c3f19d1a13564f79e12341Douglas Gregor 328652779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 328752779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor Results.getCompletionContext(), 32882ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor Results.data(), Results.size()); 32892ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor} 32902ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor 3291fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregorstruct Sema::CodeCompleteExpressionData { 3292fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor CodeCompleteExpressionData(QualType PreferredType = QualType()) 3293fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor : PreferredType(PreferredType), IntegralConstantExpression(false), 3294fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor ObjCCollection(false) { } 3295fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor 3296fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor QualType PreferredType; 3297fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor bool IntegralConstantExpression; 3298fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor bool ObjCCollection; 32995f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<Decl *, 4> IgnoreDecls; 3300fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor}; 3301fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor 33025ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor/// \brief Perform code-completion in an expression context when we know what 33035ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor/// type we're looking for. 3304fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregorvoid Sema::CodeCompleteExpression(Scope *S, 3305fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor const CodeCompleteExpressionData &Data) { 3306218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 330728a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 3308218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Expression); 3309fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor if (Data.ObjCCollection) 3310fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor Results.setFilter(&ResultBuilder::IsObjCCollection); 3311fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor else if (Data.IntegralConstantExpression) 3312f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor Results.setFilter(&ResultBuilder::IsIntegralConstantValue); 33134e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie else if (WantTypesInContext(PCC_Expression, getLangOpts())) 33145ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor Results.setFilter(&ResultBuilder::IsOrdinaryName); 33155ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor else 33165ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor Results.setFilter(&ResultBuilder::IsOrdinaryNonTypeName); 3317fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor 3318fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor if (!Data.PreferredType.isNull()) 3319fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor Results.setPreferredType(Data.PreferredType.getNonReferenceType()); 3320fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor 3321fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor // Ignore any declarations that we were told that we don't care about. 3322fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor for (unsigned I = 0, N = Data.IgnoreDecls.size(); I != N; ++I) 3323fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor Results.Ignore(Data.IgnoreDecls[I]); 33245ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 33255ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 33268071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 33278071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompleter->includeGlobals()); 33285ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 33295ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor Results.EnterNewScope(); 3330e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor AddOrdinaryNameResults(PCC_Expression, S, *this, Results); 33315ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor Results.ExitScope(); 33325ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 3333590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregor bool PreferredTypeIsPointer = false; 3334fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor if (!Data.PreferredType.isNull()) 3335fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor PreferredTypeIsPointer = Data.PreferredType->isAnyPointerType() 3336fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor || Data.PreferredType->isMemberPointerType() 3337fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor || Data.PreferredType->isBlockPointerType(); 3338590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregor 3339aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor if (S->getFnParent() && 3340aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor !Data.ObjCCollection && 3341aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor !Data.IntegralConstantExpression) 33424e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie AddPrettyFunctionResults(PP.getLangOpts(), Results); 3343aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor 33445ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (CodeCompleter->includeMacros()) 3345590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregor AddMacroResults(PP, Results, PreferredTypeIsPointer); 3346e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 3347fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor CodeCompletionContext(CodeCompletionContext::CCC_Expression, 3348fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor Data.PreferredType), 3349e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 33505ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor} 33515ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 3352ac5fd8404fa8ecfae28be76f98fd0d926350354cDouglas Gregorvoid Sema::CodeCompletePostfixExpression(Scope *S, ExprResult E) { 3353ac5fd8404fa8ecfae28be76f98fd0d926350354cDouglas Gregor if (E.isInvalid()) 3354ac5fd8404fa8ecfae28be76f98fd0d926350354cDouglas Gregor CodeCompleteOrdinaryName(S, PCC_RecoveryInFunction); 33554e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie else if (getLangOpts().ObjC1) 3356ac5fd8404fa8ecfae28be76f98fd0d926350354cDouglas Gregor CodeCompleteObjCInstanceMessage(S, E.take(), 0, 0, false); 335778edf515544f0b9dddf69d6c1678fd83e94d8352Douglas Gregor} 33585ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 33597344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor/// \brief The set of properties that have already been added, referenced by 33607344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor/// property name. 33617344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregortypedef llvm::SmallPtrSet<IdentifierInfo*, 16> AddedPropertiesSet; 33627344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor 3363b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor/// \brief Retrieve the container definition, if any? 3364b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregorstatic ObjCContainerDecl *getContainerDef(ObjCContainerDecl *Container) { 3365b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor if (ObjCInterfaceDecl *Interface = dyn_cast<ObjCInterfaceDecl>(Container)) { 3366b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor if (Interface->hasDefinition()) 3367b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor return Interface->getDefinition(); 3368b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor 3369b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor return Interface; 3370b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor } 3371b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor 3372b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) { 3373b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor if (Protocol->hasDefinition()) 3374b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor return Protocol->getDefinition(); 3375b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor 3376b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor return Protocol; 3377b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor } 3378b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor return Container; 3379b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor} 3380b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor 3381b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregorstatic void AddObjCProperties(ObjCContainerDecl *Container, 3382322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor bool AllowCategories, 33834b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor bool AllowNullaryMethods, 338495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor DeclContext *CurContext, 33857344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor AddedPropertiesSet &AddedProperties, 338695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor ResultBuilder &Results) { 33870a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 338895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 3389b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor // Retrieve the definition. 3390b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor Container = getContainerDef(Container); 3391b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor 339295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Add properties in this container. 339395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor for (ObjCContainerDecl::prop_iterator P = Container->prop_begin(), 339495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor PEnd = Container->prop_end(); 339595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor P != PEnd; 33967344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor ++P) { 33977344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor if (AddedProperties.insert(P->getIdentifier())) 3398581deb3da481053c4993c7600f97acf7768caac5David Blaikie Results.MaybeAddResult(Result(*P, 0), CurContext); 33997344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor } 340095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 34014b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor // Add nullary methods 34024b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor if (AllowNullaryMethods) { 34034b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor ASTContext &Context = Container->getASTContext(); 34048987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor PrintingPolicy Policy = getCompletionPrintingPolicy(Results.getSema()); 34054b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor for (ObjCContainerDecl::method_iterator M = Container->meth_begin(), 34064b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor MEnd = Container->meth_end(); 34074b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor M != MEnd; ++M) { 34084b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor if (M->getSelector().isUnarySelector()) 34094b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor if (IdentifierInfo *Name = M->getSelector().getIdentifierInfoForSlot(0)) 34104b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor if (AddedProperties.insert(Name)) { 341128a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Builder(Results.getAllocator(), 341228a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis Results.getCodeCompletionTUInfo()); 3413581deb3da481053c4993c7600f97acf7768caac5David Blaikie AddResultTypeChunk(Context, Policy, *M, Builder); 34144b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor Builder.AddTypedTextChunk( 34154b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor Results.getAllocator().CopyString(Name->getName())); 34164b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor 3417581deb3da481053c4993c7600f97acf7768caac5David Blaikie Results.MaybeAddResult(Result(Builder.TakeString(), *M, 3418ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor CCP_MemberDeclaration + CCD_MethodAsProperty), 34194b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor CurContext); 34204b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor } 34214b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor } 34224b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor } 34234b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor 34244b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor 342595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Add properties in referenced protocols. 342695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) { 342795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor for (ObjCProtocolDecl::protocol_iterator P = Protocol->protocol_begin(), 342895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor PEnd = Protocol->protocol_end(); 342995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor P != PEnd; ++P) 34304b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddObjCProperties(*P, AllowCategories, AllowNullaryMethods, CurContext, 34314b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddedProperties, Results); 343295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } else if (ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container)){ 3433322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor if (AllowCategories) { 3434322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Look through categories. 3435322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor for (ObjCCategoryDecl *Category = IFace->getCategoryList(); 3436322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Category; Category = Category->getNextClassCategory()) 34374b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddObjCProperties(Category, AllowCategories, AllowNullaryMethods, 34384b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor CurContext, AddedProperties, Results); 3439322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor } 344095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 344195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Look through protocols. 344253b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek for (ObjCInterfaceDecl::all_protocol_iterator 344353b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek I = IFace->all_referenced_protocol_begin(), 344453b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek E = IFace->all_referenced_protocol_end(); I != E; ++I) 34454b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddObjCProperties(*I, AllowCategories, AllowNullaryMethods, CurContext, 34464b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddedProperties, Results); 344795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 344895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Look in the superclass. 344995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (IFace->getSuperClass()) 34504b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddObjCProperties(IFace->getSuperClass(), AllowCategories, 34514b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AllowNullaryMethods, CurContext, 34527344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor AddedProperties, Results); 345395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } else if (const ObjCCategoryDecl *Category 345495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor = dyn_cast<ObjCCategoryDecl>(Container)) { 345595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Look through protocols. 345653b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek for (ObjCCategoryDecl::protocol_iterator P = Category->protocol_begin(), 345753b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek PEnd = Category->protocol_end(); 345895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor P != PEnd; ++P) 34594b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddObjCProperties(*P, AllowCategories, AllowNullaryMethods, CurContext, 34604b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddedProperties, Results); 346195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } 346295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor} 346395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 3464f5cd27d7eef3fd4021545dd76a1faf7152fda344Douglas Gregorvoid Sema::CodeCompleteMemberReferenceExpr(Scope *S, Expr *Base, 346581b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor SourceLocation OpLoc, 346681b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor bool IsArrow) { 3467f5cd27d7eef3fd4021545dd76a1faf7152fda344Douglas Gregor if (!Base || !CodeCompleter) 346881b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor return; 346981b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor 3470f5cd27d7eef3fd4021545dd76a1faf7152fda344Douglas Gregor ExprResult ConvertedBase = PerformMemberExprBaseConversion(Base, IsArrow); 3471f5cd27d7eef3fd4021545dd76a1faf7152fda344Douglas Gregor if (ConvertedBase.isInvalid()) 3472f5cd27d7eef3fd4021545dd76a1faf7152fda344Douglas Gregor return; 3473f5cd27d7eef3fd4021545dd76a1faf7152fda344Douglas Gregor Base = ConvertedBase.get(); 3474f5cd27d7eef3fd4021545dd76a1faf7152fda344Douglas Gregor 34750a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 347686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 347781b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor QualType BaseType = Base->getType(); 347886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 347986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (IsArrow) { 348086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (const PointerType *Ptr = BaseType->getAs<PointerType>()) 348186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor BaseType = Ptr->getPointeeType(); 348286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor else if (BaseType->isObjCObjectPointerType()) 34833cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor /*Do nothing*/ ; 348486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor else 348586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return; 348686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 348786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 34883da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor enum CodeCompletionContext::Kind contextKind; 34893da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor 34903da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor if (IsArrow) { 34913da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contextKind = CodeCompletionContext::CCC_ArrowMemberAccess; 34923da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 34933da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor else { 34943da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor if (BaseType->isObjCObjectPointerType() || 34953da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor BaseType->isObjCObjectOrInterfaceType()) { 34963da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contextKind = CodeCompletionContext::CCC_ObjCPropertyAccess; 34973da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 34983da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor else { 34993da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contextKind = CodeCompletionContext::CCC_DotMemberAccess; 35003da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 35013da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 35023da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor 3503218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 350428a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 35053da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CodeCompletionContext(contextKind, 350652779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor BaseType), 350752779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor &ResultBuilder::IsMember); 350895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor Results.EnterNewScope(); 350995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (const RecordType *Record = BaseType->getAs<RecordType>()) { 35103cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor // Indicate that we are performing a member access, and the cv-qualifiers 35113cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor // for the base object type. 35123cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor Results.setObjectTypeQualifiers(BaseType.getQualifiers()); 35133cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor 351495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Access to a C/C++ class, struct, or union. 351545bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor Results.allowNestedNameSpecifiers(); 35160cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 35178071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(Record->getDecl(), LookupMemberName, Consumer, 35188071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompleter->includeGlobals()); 35193a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar 35204e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (getLangOpts().CPlusPlus) { 352195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (!Results.empty()) { 352295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // The "template" keyword can follow "->" or "." in the grammar. 352395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // However, we only want to suggest the template keyword if something 352495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // is dependent. 352595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor bool IsDependent = BaseType->isDependentType(); 352695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (!IsDependent) { 352795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor for (Scope *DepScope = S; DepScope; DepScope = DepScope->getParent()) 352895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (DeclContext *Ctx = (DeclContext *)DepScope->getEntity()) { 352995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor IsDependent = Ctx->isDependentContext(); 353095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor break; 353195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } 353295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } 35333a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar 353495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (IsDependent) 3535a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("template")); 353686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 353795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } 353895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } else if (!IsArrow && BaseType->getAsObjCInterfacePointerType()) { 353995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Objective-C property reference. 35407344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor AddedPropertiesSet AddedProperties; 354195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 354295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Add property results based on our interface. 354395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor const ObjCObjectPointerType *ObjCPtr 354495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor = BaseType->getAsObjCInterfacePointerType(); 354595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor assert(ObjCPtr && "Non-NULL pointer guaranteed above!"); 35464b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddObjCProperties(ObjCPtr->getInterfaceDecl(), true, 35474b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor /*AllowNullaryMethods=*/true, CurContext, 35487344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor AddedProperties, Results); 354995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 355095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Add properties from the protocols in a qualified interface. 355195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor for (ObjCObjectPointerType::qual_iterator I = ObjCPtr->qual_begin(), 355295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor E = ObjCPtr->qual_end(); 355395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor I != E; ++I) 35544b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddObjCProperties(*I, true, /*AllowNullaryMethods=*/true, CurContext, 35554b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddedProperties, Results); 355695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } else if ((IsArrow && BaseType->isObjCObjectPointerType()) || 3557c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall (!IsArrow && BaseType->isObjCObjectType())) { 355895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Objective-C instance variable access. 355995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor ObjCInterfaceDecl *Class = 0; 356095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (const ObjCObjectPointerType *ObjCPtr 356195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor = BaseType->getAs<ObjCObjectPointerType>()) 356295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor Class = ObjCPtr->getInterfaceDecl(); 356395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor else 3564c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall Class = BaseType->getAs<ObjCObjectType>()->getInterface(); 356595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 356695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Add all ivars from this class and its superclasses. 356780f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor if (Class) { 356880f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 356980f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor Results.setFilter(&ResultBuilder::IsObjCIvar); 35708071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(Class, LookupMemberName, Consumer, 35718071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompleter->includeGlobals()); 357286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 357386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 357495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 357595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // FIXME: How do we cope with isa? 357695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 357795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor Results.ExitScope(); 35783a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar 35793a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar // Hand off the results found for code completion. 3580e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 358152779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor Results.getCompletionContext(), 3582e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 358381b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor} 358481b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor 3585374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregorvoid Sema::CodeCompleteTag(Scope *S, unsigned TagSpec) { 3586374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor if (!CodeCompleter) 3587374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor return; 3588374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor 358986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ResultBuilder::LookupFilter Filter = 0; 3590e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor enum CodeCompletionContext::Kind ContextKind 3591e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor = CodeCompletionContext::CCC_Other; 3592374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor switch ((DeclSpec::TST)TagSpec) { 3593374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor case DeclSpec::TST_enum: 359486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Filter = &ResultBuilder::IsEnum; 3595e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor ContextKind = CodeCompletionContext::CCC_EnumTag; 3596374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor break; 3597374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor 3598374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor case DeclSpec::TST_union: 359986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Filter = &ResultBuilder::IsUnion; 3600e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor ContextKind = CodeCompletionContext::CCC_UnionTag; 3601374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor break; 3602374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor 3603374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor case DeclSpec::TST_struct: 3604374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor case DeclSpec::TST_class: 36056666ed4ed2e2bc13da5ac5d0a4947019137d45beJoao Matos case DeclSpec::TST_interface: 360686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Filter = &ResultBuilder::IsClassOrStruct; 3607e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor ContextKind = CodeCompletionContext::CCC_ClassOrStructTag; 3608374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor break; 3609374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor 3610374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor default: 3611b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("Unknown type specifier kind in CodeCompleteTag"); 3612374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor } 361386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 361428a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis ResultBuilder Results(*this, CodeCompleter->getAllocator(), 361528a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), ContextKind); 36165d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 36170d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCall 36180d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCall // First pass: look for tags. 36190d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCall Results.setFilter(Filter); 36208071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(S, LookupTagName, Consumer, 36218071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompleter->includeGlobals()); 36220d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCall 36238071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor if (CodeCompleter->includeGlobals()) { 36248071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor // Second pass: look for nested name specifiers. 36258071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor Results.setFilter(&ResultBuilder::IsNestedNameSpecifier); 36268071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(S, LookupNestedNameSpecifierName, Consumer); 36278071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor } 362886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 362952779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 3630e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 3631374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor} 3632374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor 36331a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregorvoid Sema::CodeCompleteTypeQualifiers(DeclSpec &DS) { 3634218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 363528a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 3636218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_TypeQualifiers); 36371a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor Results.EnterNewScope(); 36381a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor if (!(DS.getTypeQualifiers() & DeclSpec::TQ_const)) 36391a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor Results.AddResult("const"); 36401a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor if (!(DS.getTypeQualifiers() & DeclSpec::TQ_volatile)) 36411a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor Results.AddResult("volatile"); 36424e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (getLangOpts().C99 && 36431a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor !(DS.getTypeQualifiers() & DeclSpec::TQ_restrict)) 36441a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor Results.AddResult("restrict"); 36451a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor Results.ExitScope(); 36461a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 364752779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor Results.getCompletionContext(), 36481a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor Results.data(), Results.size()); 36491a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor} 36501a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor 36513e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregorvoid Sema::CodeCompleteCase(Scope *S) { 3652781472fe99a120098c631b0cbe33c89f8cef5e70John McCall if (getCurFunction()->SwitchStack.empty() || !CodeCompleter) 36533e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor return; 3654a8e0cd8cdecc7e0ba1792e46773b884c6eed4829John McCall 3655781472fe99a120098c631b0cbe33c89f8cef5e70John McCall SwitchStmt *Switch = getCurFunction()->SwitchStack.back(); 3656a8e0cd8cdecc7e0ba1792e46773b884c6eed4829John McCall QualType type = Switch->getCond()->IgnoreImplicit()->getType(); 3657a8e0cd8cdecc7e0ba1792e46773b884c6eed4829John McCall if (!type->isEnumeralType()) { 3658a8e0cd8cdecc7e0ba1792e46773b884c6eed4829John McCall CodeCompleteExpressionData Data(type); 3659fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor Data.IntegralConstantExpression = true; 3660fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor CodeCompleteExpression(S, Data); 36613e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor return; 3662f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor } 36633e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 36643e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // Code-complete the cases of a switch statement over an enumeration type 36653e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // by providing the list of 3666a8e0cd8cdecc7e0ba1792e46773b884c6eed4829John McCall EnumDecl *Enum = type->castAs<EnumType>()->getDecl(); 3667b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor if (EnumDecl *Def = Enum->getDefinition()) 3668b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor Enum = Def; 36693e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 36703e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // Determine which enumerators we have already seen in the switch statement. 36713e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // FIXME: Ideally, we would also be able to look *past* the code-completion 36723e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // token, in case we are code-completing in the middle of the switch and not 36733e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // at the end. However, we aren't able to do so at the moment. 36743e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor llvm::SmallPtrSet<EnumConstantDecl *, 8> EnumeratorsSeen; 3675b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor NestedNameSpecifier *Qualifier = 0; 36763e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor for (SwitchCase *SC = Switch->getSwitchCaseList(); SC; 36773e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor SC = SC->getNextSwitchCase()) { 36783e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor CaseStmt *Case = dyn_cast<CaseStmt>(SC); 36793e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor if (!Case) 36803e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor continue; 36813e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 36823e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor Expr *CaseVal = Case->getLHS()->IgnoreParenCasts(); 36833e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(CaseVal)) 36843e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor if (EnumConstantDecl *Enumerator 36853e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor = dyn_cast<EnumConstantDecl>(DRE->getDecl())) { 36863e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // We look into the AST of the case statement to determine which 36873e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // enumerator was named. Alternatively, we could compute the value of 36883e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // the integral constant expression, then compare it against the 36893e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // values of each enumerator. However, value-based approach would not 36903e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // work as well with C++ templates where enumerators declared within a 36913e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // template are type- and value-dependent. 36923e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor EnumeratorsSeen.insert(Enumerator); 36933e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 3694b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // If this is a qualified-id, keep track of the nested-name-specifier 3695b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // so that we can reproduce it as part of code completion, e.g., 36963e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // 36973e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // switch (TagD.getKind()) { 36983e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // case TagDecl::TK_enum: 36993e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // break; 37003e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // case XXX 37013e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // 3702b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // At the XXX, our completions are TagDecl::TK_union, 37033e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // TagDecl::TK_struct, and TagDecl::TK_class, rather than TK_union, 37043e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // TK_struct, and TK_class. 3705a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor Qualifier = DRE->getQualifier(); 37063e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor } 37073e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor } 37083e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 37094e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (getLangOpts().CPlusPlus && !Qualifier && EnumeratorsSeen.empty()) { 3710b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // If there are no prior enumerators in C++, check whether we have to 3711b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // qualify the names of the enumerators that we suggest, because they 3712b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // may not be visible in this scope. 3713b223d8c4266655fe7a9491a0aff0263597672823Douglas Gregor Qualifier = getRequiredQualification(Context, CurContext, Enum); 3714b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor } 3715b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor 37163e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // Add any enumerators that have not yet been mentioned. 3717218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 371828a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 3719218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Expression); 37203e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor Results.EnterNewScope(); 37213e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor for (EnumDecl::enumerator_iterator E = Enum->enumerator_begin(), 37223e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor EEnd = Enum->enumerator_end(); 37233e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor E != EEnd; ++E) { 3724581deb3da481053c4993c7600f97acf7768caac5David Blaikie if (EnumeratorsSeen.count(*E)) 37253e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor continue; 37263e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 3727581deb3da481053c4993c7600f97acf7768caac5David Blaikie CodeCompletionResult R(*E, Qualifier); 37285c722c7020b33da57090422b854072258a50b3f0Douglas Gregor R.Priority = CCP_EnumInCase; 37295c722c7020b33da57090422b854072258a50b3f0Douglas Gregor Results.AddResult(R, CurContext, 0, false); 37303e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor } 37313e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor Results.ExitScope(); 37322f880e47ca32d007d7e9e5ff5efa05f5c3432744Douglas Gregor 37333da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor //We need to make sure we're setting the right context, 37343da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor //so only say we include macros if the code completer says we do 37353da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor enum CodeCompletionContext::Kind kind = CodeCompletionContext::CCC_Other; 37363da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor if (CodeCompleter->includeMacros()) { 3737bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddMacroResults(PP, Results); 37383da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor kind = CodeCompletionContext::CCC_OtherWithMacros; 37393da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 37403da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor 3741e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 37423da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor kind, 3743e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 37443e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor} 37453e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 37469c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregornamespace { 37479c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor struct IsBetterOverloadCandidate { 37489c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor Sema &S; 37495769d6195087229770d7ac90449443e026c47103John McCall SourceLocation Loc; 37509c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 37519c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor public: 37525769d6195087229770d7ac90449443e026c47103John McCall explicit IsBetterOverloadCandidate(Sema &S, SourceLocation Loc) 37535769d6195087229770d7ac90449443e026c47103John McCall : S(S), Loc(Loc) { } 37549c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 37559c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor bool 37569c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor operator()(const OverloadCandidate &X, const OverloadCandidate &Y) const { 3757120d63cd4465230c2cd56508c7cd8e0ad00848e7John McCall return isBetterOverloadCandidate(S, X, Y, Loc); 37589c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor } 37599c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor }; 37609c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor} 37619c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 376213a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charlesstatic bool anyNullArguments(llvm::ArrayRef<Expr*> Args) { 376313a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles if (Args.size() && !Args.data()) 3764d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor return true; 376513a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles 376613a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles for (unsigned I = 0; I != Args.size(); ++I) 3767d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor if (!Args[I]) 3768d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor return true; 376913a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles 3770d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor return false; 3771d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor} 3772d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor 3773f81e5a9e3f3ff80c56e4afb4fe6311a8735f36e8Richard Trieuvoid Sema::CodeCompleteCall(Scope *S, Expr *FnIn, 377413a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles llvm::ArrayRef<Expr *> Args) { 37759c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor if (!CodeCompleter) 37769c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor return; 3777ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor 3778ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor // When we're code-completing for a call, we fall back to ordinary 3779ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor // name code-completion whenever we can't produce specific 3780ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor // results. We may want to revisit this strategy in the future, 3781ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor // e.g., by merging the two kinds of results. 3782ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor 37839c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor Expr *Fn = (Expr *)FnIn; 3784ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor 37859c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor // Ignore type-dependent call expressions entirely. 378613a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles if (!Fn || Fn->isTypeDependent() || anyNullArguments(Args) || 378713a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles Expr::hasAnyTypeDependentArguments(Args)) { 3788e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompleteOrdinaryName(S, PCC_Expression); 37899c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor return; 3790ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor } 37919c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 37923b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall // Build an overload candidate set based on the functions we find. 37935769d6195087229770d7ac90449443e026c47103John McCall SourceLocation Loc = Fn->getExprLoc(); 37945769d6195087229770d7ac90449443e026c47103John McCall OverloadCandidateSet CandidateSet(Loc); 37953b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall 37969c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor // FIXME: What if we're calling something that isn't a function declaration? 37979c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor // FIXME: What if we're calling a pseudo-destructor? 37989c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor // FIXME: What if we're calling a member function? 37999c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 3800c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor typedef CodeCompleteConsumer::OverloadCandidate ResultCandidate; 38015f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<ResultCandidate, 8> Results; 3802c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor 38033b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall Expr *NakedFn = Fn->IgnoreParenCasts(); 38043b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(NakedFn)) 380513a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles AddOverloadedCallCandidates(ULE, Args, CandidateSet, 38063b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall /*PartialOverloading=*/ true); 38073b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall else if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(NakedFn)) { 38083b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall FunctionDecl *FDecl = dyn_cast<FunctionDecl>(DRE->getDecl()); 3809c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor if (FDecl) { 38104e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (!getLangOpts().CPlusPlus || 3811d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor !FDecl->getType()->getAs<FunctionProtoType>()) 3812c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor Results.push_back(ResultCandidate(FDecl)); 3813c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor else 381486820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall // FIXME: access? 381513a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles AddOverloadCandidate(FDecl, DeclAccessPair::make(FDecl, AS_none), Args, 381613a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles CandidateSet, false, /*PartialOverloading*/true); 3817c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor } 38183b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall } 38199c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 38205ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor QualType ParamType; 38215ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 3822c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor if (!CandidateSet.empty()) { 3823c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor // Sort the overload candidate set by placing the best overloads first. 3824c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor std::stable_sort(CandidateSet.begin(), CandidateSet.end(), 38255769d6195087229770d7ac90449443e026c47103John McCall IsBetterOverloadCandidate(*this, Loc)); 3826c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor 3827c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor // Add the remaining viable overload candidates as code-completion reslults. 3828c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor for (OverloadCandidateSet::iterator Cand = CandidateSet.begin(), 3829c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor CandEnd = CandidateSet.end(); 3830c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor Cand != CandEnd; ++Cand) { 3831c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor if (Cand->Viable) 3832c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor Results.push_back(ResultCandidate(Cand->Function)); 3833c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor } 38345ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 38355ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor // From the viable candidates, try to determine the type of this parameter. 38365ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor for (unsigned I = 0, N = Results.size(); I != N; ++I) { 38375ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (const FunctionType *FType = Results[I].getFunctionType()) 38385ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (const FunctionProtoType *Proto = dyn_cast<FunctionProtoType>(FType)) 383913a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles if (Args.size() < Proto->getNumArgs()) { 38405ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (ParamType.isNull()) 384113a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles ParamType = Proto->getArgType(Args.size()); 38425ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor else if (!Context.hasSameUnqualifiedType( 38435ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor ParamType.getNonReferenceType(), 384413a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles Proto->getArgType(Args.size()).getNonReferenceType())) { 38455ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor ParamType = QualType(); 38465ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor break; 38475ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor } 38485ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor } 38495ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor } 38505ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor } else { 38515ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor // Try to determine the parameter type from the type of the expression 38525ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor // being called. 38535ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor QualType FunctionType = Fn->getType(); 38545ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (const PointerType *Ptr = FunctionType->getAs<PointerType>()) 38555ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor FunctionType = Ptr->getPointeeType(); 38565ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor else if (const BlockPointerType *BlockPtr 38575ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor = FunctionType->getAs<BlockPointerType>()) 38585ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor FunctionType = BlockPtr->getPointeeType(); 38595ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor else if (const MemberPointerType *MemPtr 38605ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor = FunctionType->getAs<MemberPointerType>()) 38615ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor FunctionType = MemPtr->getPointeeType(); 38625ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 38635ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (const FunctionProtoType *Proto 38645ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor = FunctionType->getAs<FunctionProtoType>()) { 386513a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles if (Args.size() < Proto->getNumArgs()) 386613a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles ParamType = Proto->getArgType(Args.size()); 38675ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor } 38689c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor } 3869ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor 38705ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (ParamType.isNull()) 3871e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompleteOrdinaryName(S, PCC_Expression); 38725ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor else 38735ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor CodeCompleteExpression(S, ParamType); 38745ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 38752e4c7a5865739709a310d847da34096aa402d183Douglas Gregor if (!Results.empty()) 387613a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles CodeCompleter->ProcessOverloadCandidates(*this, Args.size(), Results.data(), 3877ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor Results.size()); 38789c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor} 38799c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 3880d226f65006733ed7f709c3174f22ce33391cb58fJohn McCallvoid Sema::CodeCompleteInitializer(Scope *S, Decl *D) { 3881d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall ValueDecl *VD = dyn_cast_or_null<ValueDecl>(D); 38825ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (!VD) { 3883e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompleteOrdinaryName(S, PCC_Expression); 38845ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor return; 38855ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor } 38865ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 38875ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor CodeCompleteExpression(S, VD->getType()); 38885ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor} 38895ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 38905ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregorvoid Sema::CodeCompleteReturn(Scope *S) { 38915ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor QualType ResultType; 38925ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (isa<BlockDecl>(CurContext)) { 38935ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (BlockScopeInfo *BSI = getCurBlock()) 38945ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor ResultType = BSI->ReturnType; 38955ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor } else if (FunctionDecl *Function = dyn_cast<FunctionDecl>(CurContext)) 38965ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor ResultType = Function->getResultType(); 38975ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor else if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(CurContext)) 38985ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor ResultType = Method->getResultType(); 38995ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 39005ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (ResultType.isNull()) 3901e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompleteOrdinaryName(S, PCC_Expression); 39025ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor else 39035ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor CodeCompleteExpression(S, ResultType); 39045ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor} 39055ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 3906d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregorvoid Sema::CodeCompleteAfterIf(Scope *S) { 3907d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 390828a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 3909d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor mapCodeCompletionContext(*this, PCC_Statement)); 3910d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Results.setFilter(&ResultBuilder::IsOrdinaryName); 3911d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Results.EnterNewScope(); 3912d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor 3913d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 3914d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 3915d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor CodeCompleter->includeGlobals()); 3916d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor 3917d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor AddOrdinaryNameResults(PCC_Statement, S, *this, Results); 3918d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor 3919d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor // "else" block 392028a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Builder(Results.getAllocator(), 392128a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis Results.getCodeCompletionTUInfo()); 3922d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddTypedTextChunk("else"); 3923f11641a2c651e4e9733c5f5011993554d7c635e5Douglas Gregor if (Results.includeCodePatterns()) { 3924f11641a2c651e4e9733c5f5011993554d7c635e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 3925f11641a2c651e4e9733c5f5011993554d7c635e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 3926f11641a2c651e4e9733c5f5011993554d7c635e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 3927f11641a2c651e4e9733c5f5011993554d7c635e5Douglas Gregor Builder.AddPlaceholderChunk("statements"); 3928f11641a2c651e4e9733c5f5011993554d7c635e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 3929f11641a2c651e4e9733c5f5011993554d7c635e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 3930f11641a2c651e4e9733c5f5011993554d7c635e5Douglas Gregor } 3931d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Results.AddResult(Builder.TakeString()); 3932d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor 3933d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor // "else if" block 3934d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddTypedTextChunk("else"); 3935d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 3936d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddTextChunk("if"); 3937d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 3938d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 39394e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (getLangOpts().CPlusPlus) 3940d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddPlaceholderChunk("condition"); 3941d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor else 3942d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddPlaceholderChunk("expression"); 3943d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 3944f11641a2c651e4e9733c5f5011993554d7c635e5Douglas Gregor if (Results.includeCodePatterns()) { 3945f11641a2c651e4e9733c5f5011993554d7c635e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 3946f11641a2c651e4e9733c5f5011993554d7c635e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 3947f11641a2c651e4e9733c5f5011993554d7c635e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 3948f11641a2c651e4e9733c5f5011993554d7c635e5Douglas Gregor Builder.AddPlaceholderChunk("statements"); 3949f11641a2c651e4e9733c5f5011993554d7c635e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 3950f11641a2c651e4e9733c5f5011993554d7c635e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 3951f11641a2c651e4e9733c5f5011993554d7c635e5Douglas Gregor } 3952d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Results.AddResult(Builder.TakeString()); 3953d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor 3954d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Results.ExitScope(); 3955d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor 3956d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor if (S->getFnParent()) 39574e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie AddPrettyFunctionResults(PP.getLangOpts(), Results); 3958d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor 3959d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor if (CodeCompleter->includeMacros()) 3960d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor AddMacroResults(PP, Results); 3961d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor 3962d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 3963d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Results.data(),Results.size()); 3964d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor} 3965d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor 3966f81e5a9e3f3ff80c56e4afb4fe6311a8735f36e8Richard Trieuvoid Sema::CodeCompleteAssignmentRHS(Scope *S, Expr *LHS) { 39675ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (LHS) 39685ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor CodeCompleteExpression(S, static_cast<Expr *>(LHS)->getType()); 39695ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor else 3970e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompleteOrdinaryName(S, PCC_Expression); 39715ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor} 39725ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 39739ab14541716928894821cf5d53d6b4c95ffdf3a3Jeffrey Yasskinvoid Sema::CodeCompleteQualifiedId(Scope *S, CXXScopeSpec &SS, 397481b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor bool EnteringContext) { 397581b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor if (!SS.getScopeRep() || !CodeCompleter) 397681b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor return; 397781b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor 397886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor DeclContext *Ctx = computeDeclContext(SS, EnteringContext); 397986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!Ctx) 398086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return; 3981d1cd31aeb806077340be94e32429f3192cf139b0Douglas Gregor 3982d1cd31aeb806077340be94e32429f3192cf139b0Douglas Gregor // Try to instantiate any non-dependent declaration contexts before 3983d1cd31aeb806077340be94e32429f3192cf139b0Douglas Gregor // we look in them. 398477bb1aa78bcd26e42c0382043e65a2b03242be4dJohn McCall if (!isDependentScopeSpecifier(SS) && RequireCompleteDeclContext(SS, Ctx)) 3985d1cd31aeb806077340be94e32429f3192cf139b0Douglas Gregor return; 3986d1cd31aeb806077340be94e32429f3192cf139b0Douglas Gregor 3987218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 398828a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 3989218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Name); 3990f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor Results.EnterNewScope(); 399152779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor 399286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // The "template" keyword can follow "::" in the grammar, but only 399386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // put it into the grammar if the nested-name-specifier is dependent. 399486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NestedNameSpecifier *NNS = (NestedNameSpecifier *)SS.getScopeRep(); 399586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!Results.empty() && NNS->isDependent()) 3996a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult("template"); 3997f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor 3998f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor // Add calls to overridden virtual functions, if there are any. 3999f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor // 4000f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor // FIXME: This isn't wonderful, because we don't know whether we're actually 4001f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor // in a context that permits expressions. This is a general issue with 4002f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor // qualified-id completions. 4003f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor if (!EnteringContext) 4004f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor MaybeAddOverrideCalls(*this, Ctx, Results); 4005f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor Results.ExitScope(); 400686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 4007f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 4008f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor LookupVisibleDecls(Ctx, LookupOrdinaryName, Consumer); 4009f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor 4010e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 4011430d7a1a621a126a9ffe442ad8987ba02b46dae9Douglas Gregor Results.getCompletionContext(), 4012e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 401381b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor} 401449f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 401549f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregorvoid Sema::CodeCompleteUsing(Scope *S) { 401649f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor if (!CodeCompleter) 401749f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor return; 401849f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 4019218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 402028a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 402152779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor CodeCompletionContext::CCC_PotentiallyQualifiedName, 402252779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor &ResultBuilder::IsNestedNameSpecifier); 40238e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.EnterNewScope(); 402486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 402586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // If we aren't in class scope, we could see the "namespace" keyword. 402686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!S->isClassScope()) 40270a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall Results.AddResult(CodeCompletionResult("namespace")); 402886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 402986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // After "using", we can see anything that would start a 403086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // nested-name-specifier. 40315d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 40328071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 40338071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompleter->includeGlobals()); 40348e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.ExitScope(); 403586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 4036e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 403752779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor CodeCompletionContext::CCC_PotentiallyQualifiedName, 4038e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 403949f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor} 404049f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 404149f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregorvoid Sema::CodeCompleteUsingDirective(Scope *S) { 404249f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor if (!CodeCompleter) 404349f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor return; 404449f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 404586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // After "using namespace", we expect to see a namespace name or namespace 404686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // alias. 4047218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 404828a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 4049218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Namespace, 405052779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor &ResultBuilder::IsNamespaceOrAlias); 40518e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.EnterNewScope(); 40525d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 40538071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 40548071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompleter->includeGlobals()); 40558e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.ExitScope(); 4056e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 40578071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompletionContext::CCC_Namespace, 4058e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 405949f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor} 406049f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 406149f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregorvoid Sema::CodeCompleteNamespaceDecl(Scope *S) { 406249f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor if (!CodeCompleter) 406349f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor return; 406449f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 406586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor DeclContext *Ctx = (DeclContext *)S->getEntity(); 406686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!S->getParent()) 406786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Ctx = Context.getTranslationUnitDecl(); 406886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 406952779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor bool SuppressedGlobalResults 407052779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor = Ctx && !CodeCompleter->includeGlobals() && isa<TranslationUnitDecl>(Ctx); 407152779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor 4072218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 407328a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 407452779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor SuppressedGlobalResults 407552779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor ? CodeCompletionContext::CCC_Namespace 407652779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor : CodeCompletionContext::CCC_Other, 407752779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor &ResultBuilder::IsNamespace); 407852779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor 407952779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor if (Ctx && Ctx->isFileContext() && !SuppressedGlobalResults) { 408086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // We only want to see those namespaces that have already been defined 408186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // within this scope, because its likely that the user is creating an 408286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // extended namespace declaration. Keep track of the most recent 408386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // definition of each namespace. 408486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor std::map<NamespaceDecl *, NamespaceDecl *> OrigToLatest; 408586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor for (DeclContext::specific_decl_iterator<NamespaceDecl> 408686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NS(Ctx->decls_begin()), NSEnd(Ctx->decls_end()); 408786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NS != NSEnd; ++NS) 4088581deb3da481053c4993c7600f97acf7768caac5David Blaikie OrigToLatest[NS->getOriginalNamespace()] = *NS; 408986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 409086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add the most recent definition (or extended definition) of each 409186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // namespace to the list of results. 40928e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.EnterNewScope(); 409386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor for (std::map<NamespaceDecl *, NamespaceDecl *>::iterator 4094ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor NS = OrigToLatest.begin(), 4095ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor NSEnd = OrigToLatest.end(); 409686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NS != NSEnd; ++NS) 40970a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall Results.AddResult(CodeCompletionResult(NS->second, 0), 4098608300be1972c43fe99154d25d62d697e7c0a0c2Douglas Gregor CurContext, 0, false); 40998e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.ExitScope(); 410086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 410186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 4102e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 410352779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor Results.getCompletionContext(), 4104e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 410549f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor} 410649f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 410749f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregorvoid Sema::CodeCompleteNamespaceAliasDecl(Scope *S) { 410849f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor if (!CodeCompleter) 410949f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor return; 411049f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 411186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // After "namespace", we expect to see a namespace or alias. 4112218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 411328a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 4114218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Namespace, 411552779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor &ResultBuilder::IsNamespaceOrAlias); 41165d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 41178071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 41188071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompleter->includeGlobals()); 4119e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 412052779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor Results.getCompletionContext(), 4121e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 412249f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor} 412349f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 4124ed8d322b4086b8b1e1f78b21389cabb23457dcb3Douglas Gregorvoid Sema::CodeCompleteOperatorName(Scope *S) { 4125ed8d322b4086b8b1e1f78b21389cabb23457dcb3Douglas Gregor if (!CodeCompleter) 4126ed8d322b4086b8b1e1f78b21389cabb23457dcb3Douglas Gregor return; 412786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 41280a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 4129218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 413028a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 4131218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Type, 413252779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor &ResultBuilder::IsType); 41338e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.EnterNewScope(); 413486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 413586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add the names of overloadable operators. 413686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 413786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (std::strcmp(Spelling, "?")) \ 4138a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Spelling)); 413986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor#include "clang/Basic/OperatorKinds.def" 414086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 414186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add any type names visible from the current scope 414245bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor Results.allowNestedNameSpecifiers(); 41435d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 41448071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 41458071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompleter->includeGlobals()); 414686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 414786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add any type specifiers 41484e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie AddTypeSpecifierResults(getLangOpts(), Results); 41498e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.ExitScope(); 4150ed8d322b4086b8b1e1f78b21389cabb23457dcb3Douglas Gregor 4151e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 41528071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompletionContext::CCC_Type, 4153e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 4154c464ae8444edb6d07ea49b7a0eae1674c0fa1bb8Douglas Gregor} 4155c464ae8444edb6d07ea49b7a0eae1674c0fa1bb8Douglas Gregor 41560133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregorvoid Sema::CodeCompleteConstructorInitializer(Decl *ConstructorD, 4157cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt CXXCtorInitializer** Initializers, 41580133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor unsigned NumInitializers) { 41598987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor PrintingPolicy Policy = getCompletionPrintingPolicy(*this); 41600133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor CXXConstructorDecl *Constructor 41610133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor = static_cast<CXXConstructorDecl *>(ConstructorD); 41620133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor if (!Constructor) 41630133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor return; 41640133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor 4165218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 416628a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 416752779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor CodeCompletionContext::CCC_PotentiallyQualifiedName); 41680133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor Results.EnterNewScope(); 41690133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor 41700133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor // Fill in any already-initialized fields or base classes. 41710133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor llvm::SmallPtrSet<FieldDecl *, 4> InitializedFields; 41720133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor llvm::SmallPtrSet<CanQualType, 4> InitializedBases; 41730133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor for (unsigned I = 0; I != NumInitializers; ++I) { 41740133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor if (Initializers[I]->isBaseInitializer()) 41750133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor InitializedBases.insert( 41760133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor Context.getCanonicalType(QualType(Initializers[I]->getBaseClass(), 0))); 41770133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor else 417800eb3f9c5b33e3d99aee1f8b75dd9c9678fdd66bFrancois Pichet InitializedFields.insert(cast<FieldDecl>( 417900eb3f9c5b33e3d99aee1f8b75dd9c9678fdd66bFrancois Pichet Initializers[I]->getAnyMember())); 41800133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor } 41810133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor 41820133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor // Add completions for base classes. 418328a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Builder(Results.getAllocator(), 418428a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis Results.getCodeCompletionTUInfo()); 41850c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor bool SawLastInitializer = (NumInitializers == 0); 41860133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor CXXRecordDecl *ClassDecl = Constructor->getParent(); 41870133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor for (CXXRecordDecl::base_class_iterator Base = ClassDecl->bases_begin(), 41880133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor BaseEnd = ClassDecl->bases_end(); 41890133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor Base != BaseEnd; ++Base) { 41900c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor if (!InitializedBases.insert(Context.getCanonicalType(Base->getType()))) { 41910c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor SawLastInitializer 41920c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor = NumInitializers > 0 && 41930c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor Initializers[NumInitializers - 1]->isBaseInitializer() && 41940c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor Context.hasSameUnqualifiedType(Base->getType(), 41950c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor QualType(Initializers[NumInitializers - 1]->getBaseClass(), 0)); 41960133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor continue; 41970c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor } 41980133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor 4199218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk( 4200dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Results.getAllocator().CopyString( 4201f85e193739c953358c865005855253af4f68a497John McCall Base->getType().getAsString(Policy))); 4202218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4203218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("args"); 4204218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 4205218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(CodeCompletionResult(Builder.TakeString(), 42060c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor SawLastInitializer? CCP_NextInitializer 42070c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor : CCP_MemberDeclaration)); 42080c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor SawLastInitializer = false; 42090133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor } 42100133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor 42110133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor // Add completions for virtual base classes. 42120133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor for (CXXRecordDecl::base_class_iterator Base = ClassDecl->vbases_begin(), 42130133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor BaseEnd = ClassDecl->vbases_end(); 42140133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor Base != BaseEnd; ++Base) { 42150c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor if (!InitializedBases.insert(Context.getCanonicalType(Base->getType()))) { 42160c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor SawLastInitializer 42170c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor = NumInitializers > 0 && 42180c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor Initializers[NumInitializers - 1]->isBaseInitializer() && 42190c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor Context.hasSameUnqualifiedType(Base->getType(), 42200c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor QualType(Initializers[NumInitializers - 1]->getBaseClass(), 0)); 42210133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor continue; 42220c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor } 42230133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor 4224218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk( 4225dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.getAllocator().CopyString( 4226f85e193739c953358c865005855253af4f68a497John McCall Base->getType().getAsString(Policy))); 4227218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4228218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("args"); 4229218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 4230218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(CodeCompletionResult(Builder.TakeString(), 42310c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor SawLastInitializer? CCP_NextInitializer 42320c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor : CCP_MemberDeclaration)); 42330c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor SawLastInitializer = false; 42340133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor } 42350133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor 42360133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor // Add completions for members. 42370133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor for (CXXRecordDecl::field_iterator Field = ClassDecl->field_begin(), 42380133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor FieldEnd = ClassDecl->field_end(); 42390133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor Field != FieldEnd; ++Field) { 42400c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor if (!InitializedFields.insert(cast<FieldDecl>(Field->getCanonicalDecl()))) { 42410c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor SawLastInitializer 42420c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor = NumInitializers > 0 && 424300eb3f9c5b33e3d99aee1f8b75dd9c9678fdd66bFrancois Pichet Initializers[NumInitializers - 1]->isAnyMemberInitializer() && 4244581deb3da481053c4993c7600f97acf7768caac5David Blaikie Initializers[NumInitializers - 1]->getAnyMember() == *Field; 42450133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor continue; 42460c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor } 42470133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor 42480133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor if (!Field->getDeclName()) 42490133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor continue; 42500133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor 4251dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddTypedTextChunk(Builder.getAllocator().CopyString( 4252218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Field->getIdentifier()->getName())); 4253218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4254218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("args"); 4255218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 4256218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(CodeCompletionResult(Builder.TakeString(), 42570c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor SawLastInitializer? CCP_NextInitializer 4258a67e03fdf1ae8a1f92463a307d0b6281f1161f40Douglas Gregor : CCP_MemberDeclaration, 4259ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor CXCursor_MemberRef, 4260ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor CXAvailability_Available, 4261581deb3da481053c4993c7600f97acf7768caac5David Blaikie *Field)); 42620c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor SawLastInitializer = false; 42630133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor } 42640133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor Results.ExitScope(); 42650133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor 426652779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 42670133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor Results.data(), Results.size()); 42680133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor} 42690133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor 427081f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor/// \brief Determine whether this scope denotes a namespace. 427181f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregorstatic bool isNamespaceScope(Scope *S) { 427281f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor DeclContext *DC = static_cast<DeclContext *>(S->getEntity()); 427381f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor if (!DC) 427481f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor return false; 427581f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor 427681f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor return DC->isFileContext(); 427781f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor} 427881f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor 427981f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregorvoid Sema::CodeCompleteLambdaIntroducer(Scope *S, LambdaIntroducer &Intro, 428081f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor bool AfterAmpersand) { 428181f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 428228a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 428381f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor CodeCompletionContext::CCC_Other); 428481f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor Results.EnterNewScope(); 428581f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor 428681f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor // Note what has already been captured. 428781f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor llvm::SmallPtrSet<IdentifierInfo *, 4> Known; 428881f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor bool IncludedThis = false; 428981f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor for (SmallVectorImpl<LambdaCapture>::iterator C = Intro.Captures.begin(), 429081f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor CEnd = Intro.Captures.end(); 429181f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor C != CEnd; ++C) { 429281f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor if (C->Kind == LCK_This) { 429381f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor IncludedThis = true; 429481f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor continue; 429581f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor } 429681f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor 429781f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor Known.insert(C->Id); 429881f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor } 429981f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor 430081f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor // Look for other capturable variables. 430181f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor for (; S && !isNamespaceScope(S); S = S->getParent()) { 430281f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor for (Scope::decl_iterator D = S->decl_begin(), DEnd = S->decl_end(); 430381f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor D != DEnd; ++D) { 430481f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor VarDecl *Var = dyn_cast<VarDecl>(*D); 430581f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor if (!Var || 430681f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor !Var->hasLocalStorage() || 430781f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor Var->hasAttr<BlocksAttr>()) 430881f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor continue; 430981f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor 431081f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor if (Known.insert(Var->getIdentifier())) 431181f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor Results.AddResult(CodeCompletionResult(Var), CurContext, 0, false); 431281f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor } 431381f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor } 431481f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor 431581f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor // Add 'this', if it would be valid. 431681f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor if (!IncludedThis && !AfterAmpersand && Intro.Default != LCD_ByCopy) 431781f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor addThisCompletion(*this, Results); 431881f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor 431981f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor Results.ExitScope(); 432081f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor 432181f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 432281f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor Results.data(), Results.size()); 432381f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor} 432481f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor 4325a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett/// Macro that optionally prepends an "@" to the string literal passed in via 4326a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett/// Keyword, depending on whether NeedAt is true or false. 4327a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett#define OBJC_AT_KEYWORD_NAME(NeedAt,Keyword) ((NeedAt)? "@" Keyword : Keyword) 4328a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett 4329bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCImplementationResults(const LangOptions &LangOpts, 4330b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor ResultBuilder &Results, 4331b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor bool NeedAt) { 43320a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 4333b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // Since we have an implementation, we can end it. 4334a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,"end"))); 4335b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 433628a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Builder(Results.getAllocator(), 433728a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis Results.getCodeCompletionTUInfo()); 4338b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor if (LangOpts.ObjC2) { 4339b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @dynamic 4340a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"dynamic")); 4341218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4342218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("property"); 4343218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 4344b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 4345b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @synthesize 4346a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"synthesize")); 4347218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4348218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("property"); 4349218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 4350b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor } 4351b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor} 4352c464ae8444edb6d07ea49b7a0eae1674c0fa1bb8Douglas Gregor 4353bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCInterfaceResults(const LangOptions &LangOpts, 4354b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor ResultBuilder &Results, 4355b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor bool NeedAt) { 43560a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 4357b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 4358b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // Since we have an interface or protocol, we can end it. 4359a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,"end"))); 4360b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 4361b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor if (LangOpts.ObjC2) { 4362b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @property 4363a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,"property"))); 4364b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 4365b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @required 4366a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,"required"))); 4367b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 4368b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @optional 4369a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,"optional"))); 4370b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor } 4371b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor} 4372834389b87451b24618513b907b4dfb5b00d211f3Douglas Gregor 4373bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCTopLevelResults(ResultBuilder &Results, bool NeedAt) { 43740a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 437528a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Builder(Results.getAllocator(), 437628a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis Results.getCodeCompletionTUInfo()); 4377b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 4378b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @class name ; 4379a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"class")); 4380218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4381218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("name"); 4382218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 4383b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 4384c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor if (Results.includeCodePatterns()) { 4385c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // @interface name 4386c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // FIXME: Could introduce the whole pattern, including superclasses and 4387c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // such. 4388a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"interface")); 4389218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4390218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("class"); 4391218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 4392b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 4393c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // @protocol name 4394a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"protocol")); 4395218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4396218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("protocol"); 4397218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 4398c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor 4399c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // @implementation name 4400a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"implementation")); 4401218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4402218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("class"); 4403218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 4404c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor } 4405b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 4406b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @compatibility_alias name 4407a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"compatibility_alias")); 4408218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4409218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("alias"); 4410218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4411218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("class"); 4412218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 4413b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor} 4414834389b87451b24618513b907b4dfb5b00d211f3Douglas Gregor 4415a28948f34817476d02412fa204cae038e228c827Fariborz Jahanianvoid Sema::CodeCompleteObjCAtDirective(Scope *S) { 4416218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 441728a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 4418218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 4419b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Results.EnterNewScope(); 4420a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian if (isa<ObjCImplDecl>(CurContext)) 44214e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie AddObjCImplementationResults(getLangOpts(), Results, false); 4422a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian else if (CurContext->isObjCContainer()) 44234e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie AddObjCInterfaceResults(getLangOpts(), Results, false); 4424b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor else 4425bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCTopLevelResults(Results, false); 4426c464ae8444edb6d07ea49b7a0eae1674c0fa1bb8Douglas Gregor Results.ExitScope(); 4427e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 4428e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 4429e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 44309a0c85e640a08174569a303db22981612f05d385Douglas Gregor} 44319a0c85e640a08174569a303db22981612f05d385Douglas Gregor 4432bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCExpressionResults(ResultBuilder &Results, bool NeedAt) { 44330a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 443428a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Builder(Results.getAllocator(), 443528a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis Results.getCodeCompletionTUInfo()); 44369a0c85e640a08174569a303db22981612f05d385Douglas Gregor 44379a0c85e640a08174569a303db22981612f05d385Douglas Gregor // @encode ( type-name ) 44388ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor const char *EncodeType = "char[]"; 44394e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (Results.getSema().getLangOpts().CPlusPlus || 44404e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie Results.getSema().getLangOpts().ConstStrings) 44411f6e22d14419db7162202854190f690f393daf2dJordan Rose EncodeType = "const char[]"; 44428ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk(EncodeType); 4443a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"encode")); 4444218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4445218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("type-name"); 4446218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 4447218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 44489a0c85e640a08174569a303db22981612f05d385Douglas Gregor 44499a0c85e640a08174569a303db22981612f05d385Douglas Gregor // @protocol ( protocol-name ) 44508ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("Protocol *"); 4451a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"protocol")); 4452218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4453218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("protocol-name"); 4454218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 4455218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 44569a0c85e640a08174569a303db22981612f05d385Douglas Gregor 44579a0c85e640a08174569a303db22981612f05d385Douglas Gregor // @selector ( selector ) 44588ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("SEL"); 4459a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"selector")); 4460218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4461218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("selector"); 4462218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 4463218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 44641f6e22d14419db7162202854190f690f393daf2dJordan Rose 44651f6e22d14419db7162202854190f690f393daf2dJordan Rose // @"string" 44661f6e22d14419db7162202854190f690f393daf2dJordan Rose Builder.AddResultTypeChunk("NSString *"); 44671f6e22d14419db7162202854190f690f393daf2dJordan Rose Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"\"")); 44681f6e22d14419db7162202854190f690f393daf2dJordan Rose Builder.AddPlaceholderChunk("string"); 44691f6e22d14419db7162202854190f690f393daf2dJordan Rose Builder.AddTextChunk("\""); 44701f6e22d14419db7162202854190f690f393daf2dJordan Rose Results.AddResult(Result(Builder.TakeString())); 44711f6e22d14419db7162202854190f690f393daf2dJordan Rose 4472796158971bda18cf4af237c46769914cfa7276b7Douglas Gregor // @[objects, ...] 44731f6e22d14419db7162202854190f690f393daf2dJordan Rose Builder.AddResultTypeChunk("NSArray *"); 4474a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"[")); 4475ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek Builder.AddPlaceholderChunk("objects, ..."); 4476ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek Builder.AddChunk(CodeCompletionString::CK_RightBracket); 4477ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek Results.AddResult(Result(Builder.TakeString())); 4478ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek 4479796158971bda18cf4af237c46769914cfa7276b7Douglas Gregor // @{key : object, ...} 44801f6e22d14419db7162202854190f690f393daf2dJordan Rose Builder.AddResultTypeChunk("NSDictionary *"); 4481a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"{")); 4482ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek Builder.AddPlaceholderChunk("key"); 4483ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek Builder.AddChunk(CodeCompletionString::CK_Colon); 4484ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4485ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek Builder.AddPlaceholderChunk("object, ..."); 4486ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek Builder.AddChunk(CodeCompletionString::CK_RightBrace); 4487ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek Results.AddResult(Result(Builder.TakeString())); 44881f6e22d14419db7162202854190f690f393daf2dJordan Rose 4489796158971bda18cf4af237c46769914cfa7276b7Douglas Gregor // @(expression) 44901f6e22d14419db7162202854190f690f393daf2dJordan Rose Builder.AddResultTypeChunk("id"); 44911f6e22d14419db7162202854190f690f393daf2dJordan Rose Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "(")); 44921f6e22d14419db7162202854190f690f393daf2dJordan Rose Builder.AddPlaceholderChunk("expression"); 44931f6e22d14419db7162202854190f690f393daf2dJordan Rose Builder.AddChunk(CodeCompletionString::CK_RightParen); 44941f6e22d14419db7162202854190f690f393daf2dJordan Rose Results.AddResult(Result(Builder.TakeString())); 44959a0c85e640a08174569a303db22981612f05d385Douglas Gregor} 44969a0c85e640a08174569a303db22981612f05d385Douglas Gregor 4497bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCStatementResults(ResultBuilder &Results, bool NeedAt) { 44980a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 449928a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Builder(Results.getAllocator(), 450028a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis Results.getCodeCompletionTUInfo()); 4501b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 4502c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor if (Results.includeCodePatterns()) { 4503c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // @try { statements } @catch ( declaration ) { statements } @finally 4504c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // { statements } 4505a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"try")); 4506218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 4507218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("statements"); 4508218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 4509218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("@catch"); 4510218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4511218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("parameter"); 4512218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 4513218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 4514218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("statements"); 4515218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 4516218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("@finally"); 4517218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 4518218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("statements"); 4519218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 4520218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 4521c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor } 4522b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 45239a0c85e640a08174569a303db22981612f05d385Douglas Gregor // @throw 4524a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"throw")); 4525218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4526218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 4527218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 4528b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 4529c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor if (Results.includeCodePatterns()) { 4530c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // @synchronized ( expression ) { statements } 4531a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"synchronized")); 4532218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4533218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4534218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 4535218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 4536218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 4537218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("statements"); 4538218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 4539218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 4540c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor } 4541b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor} 45429a0c85e640a08174569a303db22981612f05d385Douglas Gregor 4543bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCVisibilityResults(const LangOptions &LangOpts, 4544c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor ResultBuilder &Results, 4545c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor bool NeedAt) { 45460a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 4547a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,"private"))); 4548a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,"protected"))); 4549a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,"public"))); 4550c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor if (LangOpts.ObjC2) 4551a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,"package"))); 4552c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor} 4553c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor 4554c38c3e1e726630458154534227d74eda833d26a0Douglas Gregorvoid Sema::CodeCompleteObjCAtVisibility(Scope *S) { 4555218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 455628a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 4557218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 4558c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor Results.EnterNewScope(); 45594e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie AddObjCVisibilityResults(getLangOpts(), Results, false); 4560c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor Results.ExitScope(); 4561e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 4562e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 4563e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 4564c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor} 4565c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor 4566c38c3e1e726630458154534227d74eda833d26a0Douglas Gregorvoid Sema::CodeCompleteObjCAtStatement(Scope *S) { 4567218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 456828a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 4569218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 4570b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Results.EnterNewScope(); 4571bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCStatementResults(Results, false); 4572bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCExpressionResults(Results, false); 45739a0c85e640a08174569a303db22981612f05d385Douglas Gregor Results.ExitScope(); 4574e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 4575e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 4576e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 45779a0c85e640a08174569a303db22981612f05d385Douglas Gregor} 45789a0c85e640a08174569a303db22981612f05d385Douglas Gregor 45799a0c85e640a08174569a303db22981612f05d385Douglas Gregorvoid Sema::CodeCompleteObjCAtExpression(Scope *S) { 4580218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 458128a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 4582218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 45839a0c85e640a08174569a303db22981612f05d385Douglas Gregor Results.EnterNewScope(); 4584bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCExpressionResults(Results, false); 45859a0c85e640a08174569a303db22981612f05d385Douglas Gregor Results.ExitScope(); 4586e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 4587e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 4588e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 4589ed8d322b4086b8b1e1f78b21389cabb23457dcb3Douglas Gregor} 459049f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 4591988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor/// \brief Determine whether the addition of the given flag to an Objective-C 4592988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor/// property's attributes will cause a conflict. 4593988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregorstatic bool ObjCPropertyFlagConflicts(unsigned Attributes, unsigned NewFlag) { 4594988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor // Check if we've already added this flag. 4595988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (Attributes & NewFlag) 4596988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor return true; 4597988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor 4598988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor Attributes |= NewFlag; 4599988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor 4600988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor // Check for collisions with "readonly". 4601988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if ((Attributes & ObjCDeclSpec::DQ_PR_readonly) && 4602d7403a70176a50b8f71cb4e2e18ac6ed49fe357eJordan Rose (Attributes & ObjCDeclSpec::DQ_PR_readwrite)) 4603988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor return true; 4604988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor 4605d7403a70176a50b8f71cb4e2e18ac6ed49fe357eJordan Rose // Check for more than one of { assign, copy, retain, strong, weak }. 4606988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor unsigned AssignCopyRetMask = Attributes & (ObjCDeclSpec::DQ_PR_assign | 4607f85e193739c953358c865005855253af4f68a497John McCall ObjCDeclSpec::DQ_PR_unsafe_unretained | 4608988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor ObjCDeclSpec::DQ_PR_copy | 4609d7403a70176a50b8f71cb4e2e18ac6ed49fe357eJordan Rose ObjCDeclSpec::DQ_PR_retain | 4610d7403a70176a50b8f71cb4e2e18ac6ed49fe357eJordan Rose ObjCDeclSpec::DQ_PR_strong | 4611d7403a70176a50b8f71cb4e2e18ac6ed49fe357eJordan Rose ObjCDeclSpec::DQ_PR_weak); 4612988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (AssignCopyRetMask && 4613988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor AssignCopyRetMask != ObjCDeclSpec::DQ_PR_assign && 4614f85e193739c953358c865005855253af4f68a497John McCall AssignCopyRetMask != ObjCDeclSpec::DQ_PR_unsafe_unretained && 4615988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor AssignCopyRetMask != ObjCDeclSpec::DQ_PR_copy && 4616f85e193739c953358c865005855253af4f68a497John McCall AssignCopyRetMask != ObjCDeclSpec::DQ_PR_retain && 4617d7403a70176a50b8f71cb4e2e18ac6ed49fe357eJordan Rose AssignCopyRetMask != ObjCDeclSpec::DQ_PR_strong && 4618d7403a70176a50b8f71cb4e2e18ac6ed49fe357eJordan Rose AssignCopyRetMask != ObjCDeclSpec::DQ_PR_weak) 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 4630218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 463128a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 4632218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 4633ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff Results.EnterNewScope(); 4634988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_readonly)) 46350a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall Results.AddResult(CodeCompletionResult("readonly")); 4636988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_assign)) 46370a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall Results.AddResult(CodeCompletionResult("assign")); 4638f85e193739c953358c865005855253af4f68a497John McCall if (!ObjCPropertyFlagConflicts(Attributes, 4639f85e193739c953358c865005855253af4f68a497John McCall ObjCDeclSpec::DQ_PR_unsafe_unretained)) 4640f85e193739c953358c865005855253af4f68a497John McCall Results.AddResult(CodeCompletionResult("unsafe_unretained")); 4641988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_readwrite)) 46420a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall Results.AddResult(CodeCompletionResult("readwrite")); 4643988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_retain)) 46440a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall Results.AddResult(CodeCompletionResult("retain")); 4645f85e193739c953358c865005855253af4f68a497John McCall if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_strong)) 4646f85e193739c953358c865005855253af4f68a497John McCall Results.AddResult(CodeCompletionResult("strong")); 4647988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_copy)) 46480a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall Results.AddResult(CodeCompletionResult("copy")); 4649988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_nonatomic)) 46500a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall Results.AddResult(CodeCompletionResult("nonatomic")); 465127f45236005d9dd2bbbfeb1682eb349cb8b6998bFariborz Jahanian if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_atomic)) 465227f45236005d9dd2bbbfeb1682eb349cb8b6998bFariborz Jahanian Results.AddResult(CodeCompletionResult("atomic")); 4653d7403a70176a50b8f71cb4e2e18ac6ed49fe357eJordan Rose 4654d7403a70176a50b8f71cb4e2e18ac6ed49fe357eJordan Rose // Only suggest "weak" if we're compiling for ARC-with-weak-references or GC. 46550a7dd788dbef975f35f273c7ab913f480f7edd60John McCall if (getLangOpts().ObjCARCWeak || getLangOpts().getGC() != LangOptions::NonGC) 4656d7403a70176a50b8f71cb4e2e18ac6ed49fe357eJordan Rose if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_weak)) 4657d7403a70176a50b8f71cb4e2e18ac6ed49fe357eJordan Rose Results.AddResult(CodeCompletionResult("weak")); 4658d7403a70176a50b8f71cb4e2e18ac6ed49fe357eJordan Rose 4659988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_setter)) { 466028a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Setter(Results.getAllocator(), 466128a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis Results.getCodeCompletionTUInfo()); 4662218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Setter.AddTypedTextChunk("setter"); 4663218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Setter.AddTextChunk(" = "); 4664218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Setter.AddPlaceholderChunk("method"); 4665218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(CodeCompletionResult(Setter.TakeString())); 466654f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor } 4667988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_getter)) { 466828a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Getter(Results.getAllocator(), 466928a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis Results.getCodeCompletionTUInfo()); 4670218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Getter.AddTypedTextChunk("getter"); 4671218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Getter.AddTextChunk(" = "); 4672218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Getter.AddPlaceholderChunk("method"); 4673218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(CodeCompletionResult(Getter.TakeString())); 467454f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor } 4675ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff Results.ExitScope(); 4676e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 4677e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 4678e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 4679ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff} 4680c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff 4681de23c7e9069b2ea2cd2633efd9566546e2c68926James Dennett/// \brief Describes the kind of Objective-C method that we want to find 46824ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor/// via code completion. 46834ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregorenum ObjCMethodKind { 468449fdccb4595862828aa5cadc1497d466a8031ddaDmitri Gribenko MK_Any, ///< Any kind of method, provided it means other specified criteria. 468549fdccb4595862828aa5cadc1497d466a8031ddaDmitri Gribenko MK_ZeroArgSelector, ///< Zero-argument (unary) selector. 468649fdccb4595862828aa5cadc1497d466a8031ddaDmitri Gribenko MK_OneArgSelector ///< One-argument selector. 46874ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor}; 46884ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 4689458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregorstatic bool isAcceptableObjCSelector(Selector Sel, 4690458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor ObjCMethodKind WantKind, 4691458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor IdentifierInfo **SelIdents, 4692cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor unsigned NumSelIdents, 4693cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor bool AllowSameLength = true) { 46944ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (NumSelIdents > Sel.getNumArgs()) 46954ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor return false; 4696458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor 46974ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor switch (WantKind) { 4698458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor case MK_Any: break; 4699458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor case MK_ZeroArgSelector: return Sel.isUnarySelector(); 4700458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor case MK_OneArgSelector: return Sel.getNumArgs() == 1; 47014ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor } 4702458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor 4703cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor if (!AllowSameLength && NumSelIdents && NumSelIdents == Sel.getNumArgs()) 4704cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor return false; 4705cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor 47064ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor for (unsigned I = 0; I != NumSelIdents; ++I) 47074ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (SelIdents[I] != Sel.getIdentifierInfoForSlot(I)) 47084ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor return false; 4709458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor 47104ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor return true; 47114ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor} 4712458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor 4713458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregorstatic bool isAcceptableObjCMethod(ObjCMethodDecl *Method, 4714458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor ObjCMethodKind WantKind, 4715458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor IdentifierInfo **SelIdents, 4716cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor unsigned NumSelIdents, 4717cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor bool AllowSameLength = true) { 4718458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor return isAcceptableObjCSelector(Method->getSelector(), WantKind, SelIdents, 4719cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor NumSelIdents, AllowSameLength); 4720458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor} 4721d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor 4722d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregornamespace { 4723d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor /// \brief A set of selectors, which is used to avoid introducing multiple 4724d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor /// completions with the same selector into the result set. 4725d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor typedef llvm::SmallPtrSet<Selector, 16> VisitedSelectorSet; 4726d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor} 4727d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor 472836ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// \brief Add all of the Objective-C methods in the given Objective-C 472936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// container to the set of results. 473036ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// 473136ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// The container will be a class, protocol, category, or implementation of 473236ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// any of the above. This mether will recurse to include methods from 473336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// the superclasses of classes along with their categories, protocols, and 473436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// implementations. 473536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// 473636ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// \param Container the container in which we'll look to find methods. 473736ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// 4738a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett/// \param WantInstanceMethods Whether to add instance methods (only); if 4739a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett/// false, this routine will add factory methods (only). 474036ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// 474136ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// \param CurContext the context in which we're performing the lookup that 474236ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// finds methods. 474336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// 4744cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor/// \param AllowSameLength Whether we allow a method to be added to the list 4745cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor/// when it has the same number of parameters as we have selector identifiers. 4746cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor/// 474736ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// \param Results the structure into which we'll add results. 474836ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregorstatic void AddObjCMethods(ObjCContainerDecl *Container, 474936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor bool WantInstanceMethods, 47504ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor ObjCMethodKind WantKind, 4751d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor IdentifierInfo **SelIdents, 4752d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor unsigned NumSelIdents, 475336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor DeclContext *CurContext, 4754d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor VisitedSelectorSet &Selectors, 4755cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor bool AllowSameLength, 4756408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor ResultBuilder &Results, 4757408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor bool InOriginalClass = true) { 47580a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 4759b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor Container = getContainerDef(Container); 476036ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor for (ObjCContainerDecl::method_iterator M = Container->meth_begin(), 476136ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor MEnd = Container->meth_end(); 476236ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor M != MEnd; ++M) { 4763262bc18e32500558af7cb0afa205b34bd37bafedDavid Blaikie if (M->isInstanceMethod() == WantInstanceMethods) { 4764d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor // Check whether the selector identifiers we've been given are a 4765d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor // subset of the identifiers for this particular method. 4766581deb3da481053c4993c7600f97acf7768caac5David Blaikie if (!isAcceptableObjCMethod(*M, WantKind, SelIdents, NumSelIdents, 4767cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor AllowSameLength)) 4768d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor continue; 47694ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 4770262bc18e32500558af7cb0afa205b34bd37bafedDavid Blaikie if (!Selectors.insert(M->getSelector())) 4771d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor continue; 4772d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor 4773581deb3da481053c4993c7600f97acf7768caac5David Blaikie Result R = Result(*M, 0); 4774d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor R.StartParameter = NumSelIdents; 47754ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor R.AllParametersAreInformative = (WantKind != MK_Any); 4776408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor if (!InOriginalClass) 4777408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor R.Priority += CCD_InBaseClass; 4778d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor Results.MaybeAddResult(R, CurContext); 4779d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor } 478036ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor } 478136ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 4782e396c7bd99ed99fd8136fadc8945791754c61b16Douglas Gregor // Visit the protocols of protocols. 4783e396c7bd99ed99fd8136fadc8945791754c61b16Douglas Gregor if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) { 47845e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor if (Protocol->hasDefinition()) { 47855e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor const ObjCList<ObjCProtocolDecl> &Protocols 47865e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor = Protocol->getReferencedProtocols(); 47875e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 47885e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor E = Protocols.end(); 47895e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor I != E; ++I) 47905e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents, 47915e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor NumSelIdents, CurContext, Selectors, AllowSameLength, 47925e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor Results, false); 47935e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor } 4794e396c7bd99ed99fd8136fadc8945791754c61b16Douglas Gregor } 4795e396c7bd99ed99fd8136fadc8945791754c61b16Douglas Gregor 479636ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container); 47972e5c15be82f362611c5928ce853d0685ff98c766Douglas Gregor if (!IFace || !IFace->hasDefinition()) 479836ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor return; 479936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 480036ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add methods in protocols. 4801a5f4441de7890953460d95f4e88b9fa432b48dc2Argyrios Kyrtzidis for (ObjCInterfaceDecl::protocol_iterator I = IFace->protocol_begin(), 4802a5f4441de7890953460d95f4e88b9fa432b48dc2Argyrios Kyrtzidis E = IFace->protocol_end(); 480336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor I != E; ++I) 48044ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents, NumSelIdents, 4805cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor CurContext, Selectors, AllowSameLength, Results, false); 480636ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 480736ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add methods in categories. 480836ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor for (ObjCCategoryDecl *CatDecl = IFace->getCategoryList(); CatDecl; 480936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor CatDecl = CatDecl->getNextClassCategory()) { 48104ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(CatDecl, WantInstanceMethods, WantKind, SelIdents, 4811cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor NumSelIdents, CurContext, Selectors, AllowSameLength, 4812cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor Results, InOriginalClass); 481336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 481436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add a categories protocol methods. 481536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor const ObjCList<ObjCProtocolDecl> &Protocols 481636ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor = CatDecl->getReferencedProtocols(); 481736ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 481836ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor E = Protocols.end(); 481936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor I != E; ++I) 48204ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents, 4821cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor NumSelIdents, CurContext, Selectors, AllowSameLength, 4822cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor Results, false); 482336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 482436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add methods in category implementations. 482536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor if (ObjCCategoryImplDecl *Impl = CatDecl->getImplementation()) 48264ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(Impl, WantInstanceMethods, WantKind, SelIdents, 4827cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor NumSelIdents, CurContext, Selectors, AllowSameLength, 4828cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor Results, InOriginalClass); 482936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor } 483036ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 483136ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add methods in superclass. 483236ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor if (IFace->getSuperClass()) 48334ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(IFace->getSuperClass(), WantInstanceMethods, WantKind, 4834cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor SelIdents, NumSelIdents, CurContext, Selectors, 4835cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor AllowSameLength, Results, false); 483636ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 483736ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add methods in our implementation, if any. 483836ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor if (ObjCImplementationDecl *Impl = IFace->getImplementation()) 48394ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(Impl, WantInstanceMethods, WantKind, SelIdents, 4840cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor NumSelIdents, CurContext, Selectors, AllowSameLength, 4841cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor Results, InOriginalClass); 48424ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor} 48434ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 48444ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 4845a28948f34817476d02412fa204cae038e228c827Fariborz Jahanianvoid Sema::CodeCompleteObjCPropertyGetter(Scope *S) { 48464ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor // Try to find the interface where getters might live. 4847a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurContext); 48484ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (!Class) { 48494ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (ObjCCategoryDecl *Category 4850a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian = dyn_cast_or_null<ObjCCategoryDecl>(CurContext)) 48514ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Class = Category->getClassInterface(); 48524ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 48534ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (!Class) 48544ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor return; 48554ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor } 48564ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 48574ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor // Find all of the potential getters. 4858218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 485928a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 4860218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 48614ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Results.EnterNewScope(); 48624ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 4863d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor VisitedSelectorSet Selectors; 4864d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor AddObjCMethods(Class, true, MK_ZeroArgSelector, 0, 0, CurContext, Selectors, 4865cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor /*AllowSameLength=*/true, Results); 48664ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Results.ExitScope(); 4867e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 4868e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 4869e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 48704ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor} 48714ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 4872a28948f34817476d02412fa204cae038e228c827Fariborz Jahanianvoid Sema::CodeCompleteObjCPropertySetter(Scope *S) { 48734ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor // Try to find the interface where setters might live. 48744ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor ObjCInterfaceDecl *Class 4875a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian = dyn_cast_or_null<ObjCInterfaceDecl>(CurContext); 48764ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (!Class) { 48774ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (ObjCCategoryDecl *Category 4878a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian = dyn_cast_or_null<ObjCCategoryDecl>(CurContext)) 48794ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Class = Category->getClassInterface(); 48804ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 48814ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (!Class) 48824ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor return; 48834ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor } 48844ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 48854ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor // Find all of the potential getters. 4886218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 488728a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 4888218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 48894ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Results.EnterNewScope(); 48904ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 4891d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor VisitedSelectorSet Selectors; 4892d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor AddObjCMethods(Class, true, MK_OneArgSelector, 0, 0, CurContext, 4893cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor Selectors, /*AllowSameLength=*/true, Results); 48944ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 48954ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Results.ExitScope(); 4896e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 4897e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 4898e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 489936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor} 490036ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 4901afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregorvoid Sema::CodeCompleteObjCPassingType(Scope *S, ObjCDeclSpec &DS, 4902afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor bool IsParameter) { 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/// 504570517ca5c07c4b41ff8662b94ee22047b0299f8cDmitri Gribenko/// \param 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) { 5872218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 587328a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 5874218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 5875322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 5876322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Figure out where this @synthesize lives. 5877322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor ObjCContainerDecl *Container 5878a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian = dyn_cast_or_null<ObjCContainerDecl>(CurContext); 5879322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor if (!Container || 5880322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor (!isa<ObjCImplementationDecl>(Container) && 5881322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor !isa<ObjCCategoryImplDecl>(Container))) 5882322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor return; 5883322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 5884322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Ignore any properties that have already been implemented. 5885b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor Container = getContainerDef(Container); 5886b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor for (DeclContext::decl_iterator D = Container->decls_begin(), 5887322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor DEnd = Container->decls_end(); 5888322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor D != DEnd; ++D) 5889322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor if (ObjCPropertyImplDecl *PropertyImpl = dyn_cast<ObjCPropertyImplDecl>(*D)) 5890322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Results.Ignore(PropertyImpl->getPropertyDecl()); 5891322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 5892322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Add any properties that we find. 58937344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor AddedPropertiesSet AddedProperties; 5894322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Results.EnterNewScope(); 5895322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor if (ObjCImplementationDecl *ClassImpl 5896322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor = dyn_cast<ObjCImplementationDecl>(Container)) 58974b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddObjCProperties(ClassImpl->getClassInterface(), false, 58984b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor /*AllowNullaryMethods=*/false, CurContext, 58997344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor AddedProperties, Results); 5900322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor else 5901322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor AddObjCProperties(cast<ObjCCategoryImplDecl>(Container)->getCategoryDecl(), 59024b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor false, /*AllowNullaryMethods=*/false, CurContext, 59034b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddedProperties, Results); 5904322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Results.ExitScope(); 5905322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 5906e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 5907e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 5908e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 5909322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor} 5910322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 5911322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregorvoid Sema::CodeCompleteObjCPropertySynthesizeIvar(Scope *S, 5912a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian IdentifierInfo *PropertyName) { 59130a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 5914218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 591528a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 5916218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 5917322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 5918322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Figure out where this @synthesize lives. 5919322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor ObjCContainerDecl *Container 5920a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian = dyn_cast_or_null<ObjCContainerDecl>(CurContext); 5921322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor if (!Container || 5922322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor (!isa<ObjCImplementationDecl>(Container) && 5923322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor !isa<ObjCCategoryImplDecl>(Container))) 5924322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor return; 5925322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 5926322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Figure out which interface we're looking into. 5927322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor ObjCInterfaceDecl *Class = 0; 5928322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor if (ObjCImplementationDecl *ClassImpl 5929322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor = dyn_cast<ObjCImplementationDecl>(Container)) 5930322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Class = ClassImpl->getClassInterface(); 5931322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor else 5932322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Class = cast<ObjCCategoryImplDecl>(Container)->getCategoryDecl() 5933322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor ->getClassInterface(); 5934322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 5935e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor // Determine the type of the property we're synthesizing. 5936e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor QualType PropertyType = Context.getObjCIdType(); 5937e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor if (Class) { 5938e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor if (ObjCPropertyDecl *Property 5939e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor = Class->FindPropertyDeclaration(PropertyName)) { 5940e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor PropertyType 5941e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor = Property->getType().getNonReferenceType().getUnqualifiedType(); 5942e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor 5943e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor // Give preference to ivars 5944e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor Results.setPreferredType(PropertyType); 5945e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor } 5946e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor } 5947e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor 5948322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Add all of the instance variables in this class and its superclasses. 5949322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Results.EnterNewScope(); 5950aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor bool SawSimilarlyNamedIvar = false; 5951aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor std::string NameWithPrefix; 5952aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor NameWithPrefix += '_'; 5953a0651c5f5d1c8928d3ae062435ed9cf0aa0d04baBenjamin Kramer NameWithPrefix += PropertyName->getName(); 5954aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor std::string NameWithSuffix = PropertyName->getName().str(); 5955aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor NameWithSuffix += '_'; 5956322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor for(; Class; Class = Class->getSuperClass()) { 5957aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor for (ObjCIvarDecl *Ivar = Class->all_declared_ivar_begin(); Ivar; 5958aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor Ivar = Ivar->getNextIvar()) { 5959e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor Results.AddResult(Result(Ivar, 0), CurContext, 0, false); 5960e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor 5961aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor // Determine whether we've seen an ivar with a name similar to the 5962aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor // property. 5963e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor if ((PropertyName == Ivar->getIdentifier() || 5964aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor NameWithPrefix == Ivar->getName() || 5965e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor NameWithSuffix == Ivar->getName())) { 5966aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor SawSimilarlyNamedIvar = true; 5967e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor 5968e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor // Reduce the priority of this result by one, to give it a slight 5969e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor // advantage over other results whose names don't match so closely. 5970e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor if (Results.size() && 5971e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor Results.data()[Results.size() - 1].Kind 5972e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor == CodeCompletionResult::RK_Declaration && 5973e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor Results.data()[Results.size() - 1].Declaration == Ivar) 5974e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor Results.data()[Results.size() - 1].Priority--; 5975e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor } 5976aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor } 5977322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor } 5978aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor 5979aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor if (!SawSimilarlyNamedIvar) { 5980aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor // Create ivar result _propName, that the user can use to synthesize 5981e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor // an ivar of the appropriate type. 5982e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor unsigned Priority = CCP_MemberDeclaration + 1; 5983aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor typedef CodeCompletionResult Result; 5984aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor CodeCompletionAllocator &Allocator = Results.getAllocator(); 598528a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo(), 598628a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis Priority,CXAvailability_Available); 5987aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor 59888987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor PrintingPolicy Policy = getCompletionPrintingPolicy(*this); 5989e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor Builder.AddResultTypeChunk(GetCompletionTypeString(PropertyType, Context, 59908987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor Policy, Allocator)); 5991aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(NameWithPrefix)); 5992aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor Results.AddResult(Result(Builder.TakeString(), Priority, 5993aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor CXCursor_ObjCIvarDecl)); 5994aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor } 5995aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor 5996322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Results.ExitScope(); 5997322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 5998e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 5999e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 6000e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 6001322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor} 6002e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6003408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor// Mapping from selectors to the methods that implement that selector, along 6004408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor// with the "in original class" flag. 6005408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregortypedef llvm::DenseMap<Selector, std::pair<ObjCMethodDecl *, bool> > 6006408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor KnownMethodsMap; 6007e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6008e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor/// \brief Find all of the methods that reside in the given container 6009e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor/// (and its superclasses, protocols, etc.) that meet the given 6010e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor/// criteria. Insert those methods into the map of known methods, 6011e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor/// indexed by selector so they can be easily found. 6012e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregorstatic void FindImplementableMethods(ASTContext &Context, 6013e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor ObjCContainerDecl *Container, 6014e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor bool WantInstanceMethods, 6015e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor QualType ReturnType, 6016408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor KnownMethodsMap &KnownMethods, 6017408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor bool InOriginalClass = true) { 6018e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container)) { 6019b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor // Make sure we have a definition; that's what we'll walk. 60202e5c15be82f362611c5928ce853d0685ff98c766Douglas Gregor if (!IFace->hasDefinition()) 60212e5c15be82f362611c5928ce853d0685ff98c766Douglas Gregor return; 6022b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor 6023b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor IFace = IFace->getDefinition(); 6024b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor Container = IFace; 60252e5c15be82f362611c5928ce853d0685ff98c766Douglas Gregor 6026e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor const ObjCList<ObjCProtocolDecl> &Protocols 6027e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor = IFace->getReferencedProtocols(); 6028e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 6029ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor E = Protocols.end(); 6030e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor I != E; ++I) 6031e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType, 6032ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor KnownMethods, InOriginalClass); 6033e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6034ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor // Add methods from any class extensions and categories. 6035ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor for (const ObjCCategoryDecl *Cat = IFace->getCategoryList(); Cat; 6036ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor Cat = Cat->getNextClassCategory()) 603780aa1cd7973561889e51c1c152c8990a8de9c953Fariborz Jahanian FindImplementableMethods(Context, const_cast<ObjCCategoryDecl*>(Cat), 603880aa1cd7973561889e51c1c152c8990a8de9c953Fariborz Jahanian WantInstanceMethods, ReturnType, 6039ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor KnownMethods, false); 6040ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor 6041ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor // Visit the superclass. 6042ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor if (IFace->getSuperClass()) 6043ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor FindImplementableMethods(Context, IFace->getSuperClass(), 6044ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor WantInstanceMethods, ReturnType, 6045ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor KnownMethods, false); 6046e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 6047e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6048e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(Container)) { 6049e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Recurse into protocols. 6050e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor const ObjCList<ObjCProtocolDecl> &Protocols 6051e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor = Category->getReferencedProtocols(); 6052e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 6053ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor E = Protocols.end(); 6054e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor I != E; ++I) 6055e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType, 6056ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor KnownMethods, InOriginalClass); 6057ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor 6058ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor // If this category is the original class, jump to the interface. 6059ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor if (InOriginalClass && Category->getClassInterface()) 6060ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor FindImplementableMethods(Context, Category->getClassInterface(), 6061ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor WantInstanceMethods, ReturnType, KnownMethods, 6062ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor false); 6063e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 6064e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6065e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) { 6066b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor // Make sure we have a definition; that's what we'll walk. 6067b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor if (!Protocol->hasDefinition()) 6068b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor return; 6069b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor Protocol = Protocol->getDefinition(); 6070b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor Container = Protocol; 6071b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor 6072b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor // Recurse into protocols. 6073b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor const ObjCList<ObjCProtocolDecl> &Protocols 6074b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor = Protocol->getReferencedProtocols(); 6075b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 6076b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor E = Protocols.end(); 6077b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor I != E; ++I) 6078b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType, 6079b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor KnownMethods, false); 6080e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 6081e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6082e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Add methods in this container. This operation occurs last because 6083e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // we want the methods from this container to override any methods 6084e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // we've previously seen with the same selector. 6085e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor for (ObjCContainerDecl::method_iterator M = Container->meth_begin(), 6086e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor MEnd = Container->meth_end(); 6087e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor M != MEnd; ++M) { 6088262bc18e32500558af7cb0afa205b34bd37bafedDavid Blaikie if (M->isInstanceMethod() == WantInstanceMethods) { 6089e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (!ReturnType.isNull() && 6090262bc18e32500558af7cb0afa205b34bd37bafedDavid Blaikie !Context.hasSameUnqualifiedType(ReturnType, M->getResultType())) 6091e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor continue; 6092e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6093581deb3da481053c4993c7600f97acf7768caac5David Blaikie KnownMethods[M->getSelector()] = std::make_pair(*M, InOriginalClass); 6094e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 6095e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 6096e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor} 6097e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6098577cdfdb20840350e841a483df630237326126d5Douglas Gregor/// \brief Add the parenthesized return or parameter type chunk to a code 6099577cdfdb20840350e841a483df630237326126d5Douglas Gregor/// completion string. 6100577cdfdb20840350e841a483df630237326126d5Douglas Gregorstatic void AddObjCPassingTypeChunk(QualType Type, 610190f5f47348b6581eab5d42eaeacf7f2b28b8118fDouglas Gregor unsigned ObjCDeclQuals, 6102577cdfdb20840350e841a483df630237326126d5Douglas Gregor ASTContext &Context, 61038987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor const PrintingPolicy &Policy, 6104577cdfdb20840350e841a483df630237326126d5Douglas Gregor CodeCompletionBuilder &Builder) { 6105577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 610690f5f47348b6581eab5d42eaeacf7f2b28b8118fDouglas Gregor std::string Quals = formatObjCParamQualifiers(ObjCDeclQuals); 610790f5f47348b6581eab5d42eaeacf7f2b28b8118fDouglas Gregor if (!Quals.empty()) 610890f5f47348b6581eab5d42eaeacf7f2b28b8118fDouglas Gregor Builder.AddTextChunk(Builder.getAllocator().CopyString(Quals)); 61098987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor Builder.AddTextChunk(GetCompletionTypeString(Type, Context, Policy, 6110577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.getAllocator())); 6111577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6112577cdfdb20840350e841a483df630237326126d5Douglas Gregor} 6113577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6114577cdfdb20840350e841a483df630237326126d5Douglas Gregor/// \brief Determine whether the given class is or inherits from a class by 6115577cdfdb20840350e841a483df630237326126d5Douglas Gregor/// the given name. 6116577cdfdb20840350e841a483df630237326126d5Douglas Gregorstatic bool InheritsFromClassNamed(ObjCInterfaceDecl *Class, 61175f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef Name) { 6118577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (!Class) 6119577cdfdb20840350e841a483df630237326126d5Douglas Gregor return false; 6120577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6121577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (Class->getIdentifier() && Class->getIdentifier()->getName() == Name) 6122577cdfdb20840350e841a483df630237326126d5Douglas Gregor return true; 6123577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6124577cdfdb20840350e841a483df630237326126d5Douglas Gregor return InheritsFromClassNamed(Class->getSuperClass(), Name); 6125577cdfdb20840350e841a483df630237326126d5Douglas Gregor} 6126577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6127577cdfdb20840350e841a483df630237326126d5Douglas Gregor/// \brief Add code completions for Objective-C Key-Value Coding (KVC) and 6128577cdfdb20840350e841a483df630237326126d5Douglas Gregor/// Key-Value Observing (KVO). 6129577cdfdb20840350e841a483df630237326126d5Douglas Gregorstatic void AddObjCKeyValueCompletions(ObjCPropertyDecl *Property, 6130577cdfdb20840350e841a483df630237326126d5Douglas Gregor bool IsInstanceMethod, 6131577cdfdb20840350e841a483df630237326126d5Douglas Gregor QualType ReturnType, 6132577cdfdb20840350e841a483df630237326126d5Douglas Gregor ASTContext &Context, 6133e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor VisitedSelectorSet &KnownSelectors, 6134577cdfdb20840350e841a483df630237326126d5Douglas Gregor ResultBuilder &Results) { 6135577cdfdb20840350e841a483df630237326126d5Douglas Gregor IdentifierInfo *PropName = Property->getIdentifier(); 6136577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (!PropName || PropName->getLength() == 0) 6137577cdfdb20840350e841a483df630237326126d5Douglas Gregor return; 6138577cdfdb20840350e841a483df630237326126d5Douglas Gregor 61398987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor PrintingPolicy Policy = getCompletionPrintingPolicy(Results.getSema()); 61408987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor 6141577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Builder that will create each code completion. 6142577cdfdb20840350e841a483df630237326126d5Douglas Gregor typedef CodeCompletionResult Result; 6143577cdfdb20840350e841a483df630237326126d5Douglas Gregor CodeCompletionAllocator &Allocator = Results.getAllocator(); 614428a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo()); 6145577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6146577cdfdb20840350e841a483df630237326126d5Douglas Gregor // The selector table. 6147577cdfdb20840350e841a483df630237326126d5Douglas Gregor SelectorTable &Selectors = Context.Selectors; 6148577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6149577cdfdb20840350e841a483df630237326126d5Douglas Gregor // The property name, copied into the code completion allocation region 6150577cdfdb20840350e841a483df630237326126d5Douglas Gregor // on demand. 6151577cdfdb20840350e841a483df630237326126d5Douglas Gregor struct KeyHolder { 6152577cdfdb20840350e841a483df630237326126d5Douglas Gregor CodeCompletionAllocator &Allocator; 61535f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef Key; 6154577cdfdb20840350e841a483df630237326126d5Douglas Gregor const char *CopiedKey; 6155577cdfdb20840350e841a483df630237326126d5Douglas Gregor 61565f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner KeyHolder(CodeCompletionAllocator &Allocator, StringRef Key) 6157577cdfdb20840350e841a483df630237326126d5Douglas Gregor : Allocator(Allocator), Key(Key), CopiedKey(0) { } 6158577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6159577cdfdb20840350e841a483df630237326126d5Douglas Gregor operator const char *() { 6160577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (CopiedKey) 6161577cdfdb20840350e841a483df630237326126d5Douglas Gregor return CopiedKey; 6162577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6163577cdfdb20840350e841a483df630237326126d5Douglas Gregor return CopiedKey = Allocator.CopyString(Key); 6164577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6165577cdfdb20840350e841a483df630237326126d5Douglas Gregor } Key(Allocator, PropName->getName()); 6166577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6167577cdfdb20840350e841a483df630237326126d5Douglas Gregor // The uppercased name of the property name. 6168577cdfdb20840350e841a483df630237326126d5Douglas Gregor std::string UpperKey = PropName->getName(); 6169577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (!UpperKey.empty()) 6170577cdfdb20840350e841a483df630237326126d5Douglas Gregor UpperKey[0] = toupper(UpperKey[0]); 6171577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6172577cdfdb20840350e841a483df630237326126d5Douglas Gregor bool ReturnTypeMatchesProperty = ReturnType.isNull() || 6173577cdfdb20840350e841a483df630237326126d5Douglas Gregor Context.hasSameUnqualifiedType(ReturnType.getNonReferenceType(), 6174577cdfdb20840350e841a483df630237326126d5Douglas Gregor Property->getType()); 6175577cdfdb20840350e841a483df630237326126d5Douglas Gregor bool ReturnTypeMatchesVoid 6176577cdfdb20840350e841a483df630237326126d5Douglas Gregor = ReturnType.isNull() || ReturnType->isVoidType(); 6177577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6178577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Add the normal accessor -(type)key. 6179577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && 6180e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor KnownSelectors.insert(Selectors.getNullarySelector(PropName)) && 6181577cdfdb20840350e841a483df630237326126d5Douglas Gregor ReturnTypeMatchesProperty && !Property->getGetterMethodDecl()) { 6182577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) 618390f5f47348b6581eab5d42eaeacf7f2b28b8118fDouglas Gregor AddObjCPassingTypeChunk(Property->getType(), /*Quals=*/0, 618490f5f47348b6581eab5d42eaeacf7f2b28b8118fDouglas Gregor Context, Policy, Builder); 6185577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6186577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Key); 6187577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern, 6188577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6189577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6190577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6191577cdfdb20840350e841a483df630237326126d5Douglas Gregor // If we have an integral or boolean property (or the user has provided 6192577cdfdb20840350e841a483df630237326126d5Douglas Gregor // an integral or boolean return type), add the accessor -(type)isKey. 6193577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && 6194577cdfdb20840350e841a483df630237326126d5Douglas Gregor ((!ReturnType.isNull() && 6195577cdfdb20840350e841a483df630237326126d5Douglas Gregor (ReturnType->isIntegerType() || ReturnType->isBooleanType())) || 6196577cdfdb20840350e841a483df630237326126d5Douglas Gregor (ReturnType.isNull() && 6197577cdfdb20840350e841a483df630237326126d5Douglas Gregor (Property->getType()->isIntegerType() || 6198577cdfdb20840350e841a483df630237326126d5Douglas Gregor Property->getType()->isBooleanType())))) { 61995f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::string SelectorName = (Twine("is") + UpperKey).str(); 62006204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6201e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))) { 6202577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6203577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6204577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("BOOL"); 6205577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6206577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6207577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6208577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk( 6209577cdfdb20840350e841a483df630237326126d5Douglas Gregor Allocator.CopyString(SelectorId->getName())); 6210577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern, 6211577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6212577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6213577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6214577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6215577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Add the normal mutator. 6216577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid && 6217577cdfdb20840350e841a483df630237326126d5Douglas Gregor !Property->getSetterMethodDecl()) { 62185f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::string SelectorName = (Twine("set") + UpperKey).str(); 62196204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6220e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6221577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6222577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6223577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6224577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6225577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6226577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6227577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk( 6228577cdfdb20840350e841a483df630237326126d5Douglas Gregor Allocator.CopyString(SelectorId->getName())); 6229577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(":"); 623090f5f47348b6581eab5d42eaeacf7f2b28b8118fDouglas Gregor AddObjCPassingTypeChunk(Property->getType(), /*Quals=*/0, 623190f5f47348b6581eab5d42eaeacf7f2b28b8118fDouglas Gregor Context, Policy, Builder); 6232577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk(Key); 6233577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern, 6234577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6235577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6236577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6237577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6238577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Indexed and unordered accessors 6239577cdfdb20840350e841a483df630237326126d5Douglas Gregor unsigned IndexedGetterPriority = CCP_CodePattern; 6240577cdfdb20840350e841a483df630237326126d5Douglas Gregor unsigned IndexedSetterPriority = CCP_CodePattern; 6241577cdfdb20840350e841a483df630237326126d5Douglas Gregor unsigned UnorderedGetterPriority = CCP_CodePattern; 6242577cdfdb20840350e841a483df630237326126d5Douglas Gregor unsigned UnorderedSetterPriority = CCP_CodePattern; 6243577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (const ObjCObjectPointerType *ObjCPointer 6244577cdfdb20840350e841a483df630237326126d5Douglas Gregor = Property->getType()->getAs<ObjCObjectPointerType>()) { 6245577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ObjCInterfaceDecl *IFace = ObjCPointer->getInterfaceDecl()) { 6246577cdfdb20840350e841a483df630237326126d5Douglas Gregor // If this interface type is not provably derived from a known 6247577cdfdb20840350e841a483df630237326126d5Douglas Gregor // collection, penalize the corresponding completions. 6248577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (!InheritsFromClassNamed(IFace, "NSMutableArray")) { 6249577cdfdb20840350e841a483df630237326126d5Douglas Gregor IndexedSetterPriority += CCD_ProbablyNotObjCCollection; 6250577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (!InheritsFromClassNamed(IFace, "NSArray")) 6251577cdfdb20840350e841a483df630237326126d5Douglas Gregor IndexedGetterPriority += CCD_ProbablyNotObjCCollection; 6252577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6253577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6254577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (!InheritsFromClassNamed(IFace, "NSMutableSet")) { 6255577cdfdb20840350e841a483df630237326126d5Douglas Gregor UnorderedSetterPriority += CCD_ProbablyNotObjCCollection; 6256577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (!InheritsFromClassNamed(IFace, "NSSet")) 6257577cdfdb20840350e841a483df630237326126d5Douglas Gregor UnorderedGetterPriority += CCD_ProbablyNotObjCCollection; 6258577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6259577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6260577cdfdb20840350e841a483df630237326126d5Douglas Gregor } else { 6261577cdfdb20840350e841a483df630237326126d5Douglas Gregor IndexedGetterPriority += CCD_ProbablyNotObjCCollection; 6262577cdfdb20840350e841a483df630237326126d5Douglas Gregor IndexedSetterPriority += CCD_ProbablyNotObjCCollection; 6263577cdfdb20840350e841a483df630237326126d5Douglas Gregor UnorderedGetterPriority += CCD_ProbablyNotObjCCollection; 6264577cdfdb20840350e841a483df630237326126d5Douglas Gregor UnorderedSetterPriority += CCD_ProbablyNotObjCCollection; 6265577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6266577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6267577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Add -(NSUInteger)countOf<key> 6268577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && 6269577cdfdb20840350e841a483df630237326126d5Douglas Gregor (ReturnType.isNull() || ReturnType->isIntegerType())) { 62705f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::string SelectorName = (Twine("countOf") + UpperKey).str(); 62716204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6272e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))) { 6273577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6274577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6275577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSUInteger"); 6276577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6277577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6278577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6279577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk( 6280577cdfdb20840350e841a483df630237326126d5Douglas Gregor Allocator.CopyString(SelectorId->getName())); 6281577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), 6282577cdfdb20840350e841a483df630237326126d5Douglas Gregor std::min(IndexedGetterPriority, 6283577cdfdb20840350e841a483df630237326126d5Douglas Gregor UnorderedGetterPriority), 6284577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6285577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6286577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6287577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6288577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Indexed getters 6289577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Add -(id)objectInKeyAtIndex:(NSUInteger)index 6290577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && 6291577cdfdb20840350e841a483df630237326126d5Douglas Gregor (ReturnType.isNull() || ReturnType->isObjCObjectPointerType())) { 62926204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor std::string SelectorName 62935f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner = (Twine("objectIn") + UpperKey + "AtIndex").str(); 62946204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6295e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6296577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6297577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6298577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("id"); 6299577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6300577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6301577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6302577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6303577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6304577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSUInteger"); 6305577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6306577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("index"); 6307577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority, 6308577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6309577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6310577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6311577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6312577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Add -(NSArray *)keyAtIndexes:(NSIndexSet *)indexes 6313577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && 6314577cdfdb20840350e841a483df630237326126d5Douglas Gregor (ReturnType.isNull() || 6315577cdfdb20840350e841a483df630237326126d5Douglas Gregor (ReturnType->isObjCObjectPointerType() && 6316577cdfdb20840350e841a483df630237326126d5Douglas Gregor ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() && 6317577cdfdb20840350e841a483df630237326126d5Douglas Gregor ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() 6318577cdfdb20840350e841a483df630237326126d5Douglas Gregor ->getName() == "NSArray"))) { 63196204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor std::string SelectorName 63205f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner = (Twine(Property->getName()) + "AtIndexes").str(); 63216204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6322e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6323577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6324577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6325577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSArray *"); 6326577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6327577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6328577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6329577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6330577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6331577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSIndexSet *"); 6332577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6333577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("indexes"); 6334577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority, 6335577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6336577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6337577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6338577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6339577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Add -(void)getKey:(type **)buffer range:(NSRange)inRange 6340577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid) { 63415f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::string SelectorName = (Twine("get") + UpperKey).str(); 6342577cdfdb20840350e841a483df630237326126d5Douglas Gregor IdentifierInfo *SelectorIds[2] = { 63436204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor &Context.Idents.get(SelectorName), 6344577cdfdb20840350e841a483df630237326126d5Douglas Gregor &Context.Idents.get("range") 6345577cdfdb20840350e841a483df630237326126d5Douglas Gregor }; 6346577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6347e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds))) { 6348577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6349577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6350577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6351577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6352577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6353577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6354577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6355577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6356577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddPlaceholderChunk("object-type"); 6357577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk(" **"); 6358577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6359577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("buffer"); 6360577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6361577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk("range:"); 6362577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6363577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSRange"); 6364577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6365577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("inRange"); 6366577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority, 6367577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6368577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6369577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6370577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6371577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Mutable indexed accessors 6372577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6373577cdfdb20840350e841a483df630237326126d5Douglas Gregor // - (void)insertObject:(type *)object inKeyAtIndex:(NSUInteger)index 6374577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid) { 63755f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::string SelectorName = (Twine("in") + UpperKey + "AtIndex").str(); 6376577cdfdb20840350e841a483df630237326126d5Douglas Gregor IdentifierInfo *SelectorIds[2] = { 6377577cdfdb20840350e841a483df630237326126d5Douglas Gregor &Context.Idents.get("insertObject"), 63786204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor &Context.Idents.get(SelectorName) 6379577cdfdb20840350e841a483df630237326126d5Douglas Gregor }; 6380577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6381e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds))) { 6382577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6383577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6384577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6385577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6386577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6387577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6388577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk("insertObject:"); 6389577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6390577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddPlaceholderChunk("object-type"); 6391577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk(" *"); 6392577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6393577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("object"); 6394577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6395577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6396577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6397577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddPlaceholderChunk("NSUInteger"); 6398577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6399577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("index"); 6400577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 6401577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6402577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6403577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6404577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6405577cdfdb20840350e841a483df630237326126d5Douglas Gregor // - (void)insertKey:(NSArray *)array atIndexes:(NSIndexSet *)indexes 6406577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid) { 64075f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::string SelectorName = (Twine("insert") + UpperKey).str(); 6408577cdfdb20840350e841a483df630237326126d5Douglas Gregor IdentifierInfo *SelectorIds[2] = { 64096204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor &Context.Idents.get(SelectorName), 6410577cdfdb20840350e841a483df630237326126d5Douglas Gregor &Context.Idents.get("atIndexes") 6411577cdfdb20840350e841a483df630237326126d5Douglas Gregor }; 6412577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6413e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds))) { 6414577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6415577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6416577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6417577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6418577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6419577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6420577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6421577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6422577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSArray *"); 6423577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6424577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("array"); 6425577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6426577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk("atIndexes:"); 6427577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6428577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddPlaceholderChunk("NSIndexSet *"); 6429577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6430577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("indexes"); 6431577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 6432577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6433577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6434577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6435577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6436577cdfdb20840350e841a483df630237326126d5Douglas Gregor // -(void)removeObjectFromKeyAtIndex:(NSUInteger)index 6437577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid) { 64386204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor std::string SelectorName 64395f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner = (Twine("removeObjectFrom") + UpperKey + "AtIndex").str(); 64406204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6441e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6442577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6443577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6444577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6445577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6446577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6447577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6448577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6449577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6450577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSUInteger"); 6451577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6452577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("index"); 6453577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 6454577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6455577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6456577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6457577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6458577cdfdb20840350e841a483df630237326126d5Douglas Gregor // -(void)removeKeyAtIndexes:(NSIndexSet *)indexes 6459577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid) { 64606204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor std::string SelectorName 64615f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner = (Twine("remove") + UpperKey + "AtIndexes").str(); 64626204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6463e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6464577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6465577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6466577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6467577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6468577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6469577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6470577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6471577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6472577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSIndexSet *"); 6473577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6474577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("indexes"); 6475577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 6476577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6477577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6478577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6479577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6480577cdfdb20840350e841a483df630237326126d5Douglas Gregor // - (void)replaceObjectInKeyAtIndex:(NSUInteger)index withObject:(id)object 6481577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid) { 64826204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor std::string SelectorName 64835f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner = (Twine("replaceObjectIn") + UpperKey + "AtIndex").str(); 6484577cdfdb20840350e841a483df630237326126d5Douglas Gregor IdentifierInfo *SelectorIds[2] = { 64856204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor &Context.Idents.get(SelectorName), 6486577cdfdb20840350e841a483df630237326126d5Douglas Gregor &Context.Idents.get("withObject") 6487577cdfdb20840350e841a483df630237326126d5Douglas Gregor }; 6488577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6489e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds))) { 6490577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6491577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6492577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6493577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6494577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6495577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6496577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6497577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6498577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddPlaceholderChunk("NSUInteger"); 6499577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6500577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("index"); 6501577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6502577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk("withObject:"); 6503577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6504577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("id"); 6505577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6506577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("object"); 6507577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 6508577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6509577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6510577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6511577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6512577cdfdb20840350e841a483df630237326126d5Douglas Gregor // - (void)replaceKeyAtIndexes:(NSIndexSet *)indexes withKey:(NSArray *)array 6513577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid) { 65146204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor std::string SelectorName1 65155f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner = (Twine("replace") + UpperKey + "AtIndexes").str(); 65165f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::string SelectorName2 = (Twine("with") + UpperKey).str(); 6517577cdfdb20840350e841a483df630237326126d5Douglas Gregor IdentifierInfo *SelectorIds[2] = { 65186204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor &Context.Idents.get(SelectorName1), 65196204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor &Context.Idents.get(SelectorName2) 6520577cdfdb20840350e841a483df630237326126d5Douglas Gregor }; 6521577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6522e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds))) { 6523577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6524577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6525577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6526577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6527577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6528577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6529577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName1 + ":")); 6530577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6531577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddPlaceholderChunk("NSIndexSet *"); 6532577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6533577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("indexes"); 6534577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6535577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName2 + ":")); 6536577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6537577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSArray *"); 6538577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6539577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("array"); 6540577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 6541577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6542577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6543577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6544577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6545577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Unordered getters 6546577cdfdb20840350e841a483df630237326126d5Douglas Gregor // - (NSEnumerator *)enumeratorOfKey 6547577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && 6548577cdfdb20840350e841a483df630237326126d5Douglas Gregor (ReturnType.isNull() || 6549577cdfdb20840350e841a483df630237326126d5Douglas Gregor (ReturnType->isObjCObjectPointerType() && 6550577cdfdb20840350e841a483df630237326126d5Douglas Gregor ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() && 6551577cdfdb20840350e841a483df630237326126d5Douglas Gregor ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() 6552577cdfdb20840350e841a483df630237326126d5Douglas Gregor ->getName() == "NSEnumerator"))) { 65535f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::string SelectorName = (Twine("enumeratorOf") + UpperKey).str(); 65546204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6555e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))) { 6556577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6557577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6558577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSEnumerator *"); 6559577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6560577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6561577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6562577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName)); 6563577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), UnorderedGetterPriority, 6564577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6565577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6566577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6567577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6568577cdfdb20840350e841a483df630237326126d5Douglas Gregor // - (type *)memberOfKey:(type *)object 6569577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && 6570577cdfdb20840350e841a483df630237326126d5Douglas Gregor (ReturnType.isNull() || ReturnType->isObjCObjectPointerType())) { 65715f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::string SelectorName = (Twine("memberOf") + UpperKey).str(); 65726204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6573e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6574577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6575577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6576577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddPlaceholderChunk("object-type"); 6577577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk(" *"); 6578577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6579577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6580577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6581577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6582577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6583577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6584577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddPlaceholderChunk("object-type"); 6585577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk(" *"); 6586577cdfdb20840350e841a483df630237326126d5Douglas Gregor } else { 6587577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk(GetCompletionTypeString(ReturnType, Context, 65888987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor Policy, 6589577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.getAllocator())); 6590577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6591577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6592577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("object"); 6593577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), UnorderedGetterPriority, 6594577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6595577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6596577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6597577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6598577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Mutable unordered accessors 6599577cdfdb20840350e841a483df630237326126d5Douglas Gregor // - (void)addKeyObject:(type *)object 6600577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid) { 66016204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor std::string SelectorName 66025f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner = (Twine("add") + UpperKey + Twine("Object")).str(); 66036204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6604e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6605577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6606577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6607577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6608577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6609577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6610577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6611577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6612577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6613577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddPlaceholderChunk("object-type"); 6614577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk(" *"); 6615577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6616577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("object"); 6617577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority, 6618577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6619577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6620577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6621577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6622577cdfdb20840350e841a483df630237326126d5Douglas Gregor // - (void)addKey:(NSSet *)objects 6623577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid) { 66245f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::string SelectorName = (Twine("add") + UpperKey).str(); 66256204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6626e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6627577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6628577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6629577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6630577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6631577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6632577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6633577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6634577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6635577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSSet *"); 6636577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6637577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("objects"); 6638577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority, 6639577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6640577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6641577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6642577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6643577cdfdb20840350e841a483df630237326126d5Douglas Gregor // - (void)removeKeyObject:(type *)object 6644577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid) { 66456204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor std::string SelectorName 66465f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner = (Twine("remove") + UpperKey + Twine("Object")).str(); 66476204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6648e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6649577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6650577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6651577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6652577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6653577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6654577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6655577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6656577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6657577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddPlaceholderChunk("object-type"); 6658577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk(" *"); 6659577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6660577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("object"); 6661577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority, 6662577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6663577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6664577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6665577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6666577cdfdb20840350e841a483df630237326126d5Douglas Gregor // - (void)removeKey:(NSSet *)objects 6667577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid) { 66685f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::string SelectorName = (Twine("remove") + UpperKey).str(); 66696204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6670e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6671577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6672577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6673577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6674577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6675577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6676577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6677577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6678577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6679577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSSet *"); 6680577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6681577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("objects"); 6682577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority, 6683577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6684577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6685577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6686577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6687577cdfdb20840350e841a483df630237326126d5Douglas Gregor // - (void)intersectKey:(NSSet *)objects 6688577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid) { 66895f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::string SelectorName = (Twine("intersect") + UpperKey).str(); 66906204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6691e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6692577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6693577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6694577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6695577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6696577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6697577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6698577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6699577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6700577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSSet *"); 6701577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6702577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("objects"); 6703577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority, 6704577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6705577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6706577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6707577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6708577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Key-Value Observing 6709577cdfdb20840350e841a483df630237326126d5Douglas Gregor // + (NSSet *)keyPathsForValuesAffectingKey 6710577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (!IsInstanceMethod && 6711577cdfdb20840350e841a483df630237326126d5Douglas Gregor (ReturnType.isNull() || 6712577cdfdb20840350e841a483df630237326126d5Douglas Gregor (ReturnType->isObjCObjectPointerType() && 6713577cdfdb20840350e841a483df630237326126d5Douglas Gregor ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() && 6714577cdfdb20840350e841a483df630237326126d5Douglas Gregor ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() 6715577cdfdb20840350e841a483df630237326126d5Douglas Gregor ->getName() == "NSSet"))) { 67166204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor std::string SelectorName 67175f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner = (Twine("keyPathsForValuesAffecting") + UpperKey).str(); 67186204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6719e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))) { 6720577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6721577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6722577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSSet *"); 6723577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6724577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6725577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6726577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName)); 6727577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern, 67283f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor CXCursor_ObjCClassMethodDecl)); 67293f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor } 67303f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor } 67313f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor 67323f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor // + (BOOL)automaticallyNotifiesObserversForKey 67333f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor if (!IsInstanceMethod && 67343f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor (ReturnType.isNull() || 67353f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor ReturnType->isIntegerType() || 67363f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor ReturnType->isBooleanType())) { 67373f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor std::string SelectorName 67385f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner = (Twine("automaticallyNotifiesObserversOf") + UpperKey).str(); 67393f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 67403f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))) { 67413f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor if (ReturnType.isNull()) { 67423f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 67433f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor Builder.AddTextChunk("BOOL"); 67443f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 67453f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor } 67463f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor 67473f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName)); 67483f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern, 67493f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor CXCursor_ObjCClassMethodDecl)); 6750577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6751577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6752577cdfdb20840350e841a483df630237326126d5Douglas Gregor} 6753577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6754e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregorvoid Sema::CodeCompleteObjCMethodDecl(Scope *S, 6755e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor bool IsInstanceMethod, 6756a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian ParsedType ReturnTy) { 6757e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Determine the return type of the method we're declaring, if 6758e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // provided. 6759e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor QualType ReturnType = GetTypeFromParser(ReturnTy); 6760a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian Decl *IDecl = 0; 6761a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian if (CurContext->isObjCContainer()) { 6762a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian ObjCContainerDecl *OCD = dyn_cast<ObjCContainerDecl>(CurContext); 6763a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian IDecl = cast<Decl>(OCD); 6764a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian } 6765ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor // Determine where we should start searching for methods. 6766ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor ObjCContainerDecl *SearchDecl = 0; 6767e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor bool IsInImplementation = false; 6768d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall if (Decl *D = IDecl) { 6769e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (ObjCImplementationDecl *Impl = dyn_cast<ObjCImplementationDecl>(D)) { 6770e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor SearchDecl = Impl->getClassInterface(); 6771e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor IsInImplementation = true; 6772e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } else if (ObjCCategoryImplDecl *CatImpl 6773ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor = dyn_cast<ObjCCategoryImplDecl>(D)) { 6774e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor SearchDecl = CatImpl->getCategoryDecl(); 6775e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor IsInImplementation = true; 6776ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor } else 6777e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor SearchDecl = dyn_cast<ObjCContainerDecl>(D); 6778e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 6779e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6780e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (!SearchDecl && S) { 6781ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor if (DeclContext *DC = static_cast<DeclContext *>(S->getEntity())) 6782e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor SearchDecl = dyn_cast<ObjCContainerDecl>(DC); 6783e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 6784e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6785ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor if (!SearchDecl) { 6786e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 6787e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 6788e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor 0, 0); 6789e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor return; 6790e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 6791e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6792e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Find all of the methods that we could declare/implement here. 6793e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor KnownMethodsMap KnownMethods; 6794e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor FindImplementableMethods(Context, SearchDecl, IsInstanceMethod, 6795ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor ReturnType, KnownMethods); 6796e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6797e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Add declarations or definitions for each of the known methods. 67980a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 6799218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 680028a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 6801218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 6802e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Results.EnterNewScope(); 68038987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor PrintingPolicy Policy = getCompletionPrintingPolicy(*this); 6804e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor for (KnownMethodsMap::iterator M = KnownMethods.begin(), 6805e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor MEnd = KnownMethods.end(); 6806e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor M != MEnd; ++M) { 6807408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor ObjCMethodDecl *Method = M->second.first; 680828a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Builder(Results.getAllocator(), 680928a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis Results.getCodeCompletionTUInfo()); 6810e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6811e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // If the result type was not already provided, add it to the 6812e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // pattern as (type). 6813577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) 681490f5f47348b6581eab5d42eaeacf7f2b28b8118fDouglas Gregor AddObjCPassingTypeChunk(Method->getResultType(), 681590f5f47348b6581eab5d42eaeacf7f2b28b8118fDouglas Gregor Method->getObjCDeclQualifier(), 681690f5f47348b6581eab5d42eaeacf7f2b28b8118fDouglas Gregor Context, Policy, 681790f5f47348b6581eab5d42eaeacf7f2b28b8118fDouglas Gregor Builder); 6818e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6819e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Selector Sel = Method->getSelector(); 6820e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6821e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Add the first part of the selector to the pattern. 6822dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddTypedTextChunk(Builder.getAllocator().CopyString( 6823813d8346529bf094eb2b249648906ba7fd226688Douglas Gregor Sel.getNameForSlot(0))); 6824e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6825e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Add parameters to the pattern. 6826e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor unsigned I = 0; 6827e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor for (ObjCMethodDecl::param_iterator P = Method->param_begin(), 6828e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor PEnd = Method->param_end(); 6829e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor P != PEnd; (void)++P, ++I) { 6830e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Add the part of the selector name. 6831e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (I == 0) 6832218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk(":"); 6833e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor else if (I < Sel.getNumArgs()) { 6834218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6835218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk( 6836813d8346529bf094eb2b249648906ba7fd226688Douglas Gregor Builder.getAllocator().CopyString(Sel.getNameForSlot(I) + ":")); 6837e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } else 6838e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor break; 6839e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6840e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Add the parameter type. 684190f5f47348b6581eab5d42eaeacf7f2b28b8118fDouglas Gregor AddObjCPassingTypeChunk((*P)->getOriginalType(), 684290f5f47348b6581eab5d42eaeacf7f2b28b8118fDouglas Gregor (*P)->getObjCDeclQualifier(), 684390f5f47348b6581eab5d42eaeacf7f2b28b8118fDouglas Gregor Context, Policy, 68448987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor Builder); 6845e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6846e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (IdentifierInfo *Id = (*P)->getIdentifier()) 6847dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddTextChunk(Builder.getAllocator().CopyString( Id->getName())); 6848e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 6849e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6850e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (Method->isVariadic()) { 6851e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (Method->param_size() > 0) 6852218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_Comma); 6853218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("..."); 6854e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor } 6855e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6856447107dfff705ab79d1dbf33ce79b524d63572fdDouglas Gregor if (IsInImplementation && Results.includeCodePatterns()) { 6857e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // We will be defining the method here, so add a compound statement. 6858218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6859218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 6860218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 6861e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (!Method->getResultType()->isVoidType()) { 6862e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // If the result type is not void, add a return clause. 6863218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("return"); 6864218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6865218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 6866218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_SemiColon); 6867e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } else 6868218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("statements"); 6869e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6870218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 6871218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 6872e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 6873e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6874408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor unsigned Priority = CCP_CodePattern; 6875408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor if (!M->second.second) 6876408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor Priority += CCD_InBaseClass; 6877408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor 6878ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor Results.AddResult(Result(Builder.TakeString(), Method, Priority)); 6879e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 6880e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6881577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Add Key-Value-Coding and Key-Value-Observing accessor methods for all of 6882577cdfdb20840350e841a483df630237326126d5Douglas Gregor // the properties in this class and its categories. 68834e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (Context.getLangOpts().ObjC2) { 68845f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<ObjCContainerDecl *, 4> Containers; 6885577cdfdb20840350e841a483df630237326126d5Douglas Gregor Containers.push_back(SearchDecl); 6886577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6887e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor VisitedSelectorSet KnownSelectors; 6888e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor for (KnownMethodsMap::iterator M = KnownMethods.begin(), 6889e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor MEnd = KnownMethods.end(); 6890e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor M != MEnd; ++M) 6891e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor KnownSelectors.insert(M->first); 6892e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor 6893e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor 6894577cdfdb20840350e841a483df630237326126d5Douglas Gregor ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(SearchDecl); 6895577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (!IFace) 6896577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(SearchDecl)) 6897577cdfdb20840350e841a483df630237326126d5Douglas Gregor IFace = Category->getClassInterface(); 6898577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6899577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IFace) { 6900577cdfdb20840350e841a483df630237326126d5Douglas Gregor for (ObjCCategoryDecl *Category = IFace->getCategoryList(); Category; 6901577cdfdb20840350e841a483df630237326126d5Douglas Gregor Category = Category->getNextClassCategory()) 6902577cdfdb20840350e841a483df630237326126d5Douglas Gregor Containers.push_back(Category); 6903577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6904577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6905577cdfdb20840350e841a483df630237326126d5Douglas Gregor for (unsigned I = 0, N = Containers.size(); I != N; ++I) { 6906577cdfdb20840350e841a483df630237326126d5Douglas Gregor for (ObjCContainerDecl::prop_iterator P = Containers[I]->prop_begin(), 6907577cdfdb20840350e841a483df630237326126d5Douglas Gregor PEnd = Containers[I]->prop_end(); 6908577cdfdb20840350e841a483df630237326126d5Douglas Gregor P != PEnd; ++P) { 6909581deb3da481053c4993c7600f97acf7768caac5David Blaikie AddObjCKeyValueCompletions(*P, IsInstanceMethod, ReturnType, Context, 6910e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor KnownSelectors, Results); 6911577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6912577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6913577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6914577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6915e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Results.ExitScope(); 6916e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6917e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 6918e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 6919e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 6920e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor} 69211f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 69221f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregorvoid Sema::CodeCompleteObjCMethodDeclSelector(Scope *S, 69231f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor bool IsInstanceMethod, 692440ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor bool AtParameterName, 6925b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall ParsedType ReturnTy, 69261f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor IdentifierInfo **SelIdents, 69271f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor unsigned NumSelIdents) { 69281f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor // If we have an external source, load the entire class method 69293c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl // pool from the AST file. 69301f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor if (ExternalSource) { 69311f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors(); 69321f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor I != N; ++I) { 69331f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor Selector Sel = ExternalSource->GetExternalSelector(I); 6934db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl if (Sel.isNull() || MethodPool.count(Sel)) 69351f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor continue; 6936db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl 6937db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl ReadMethodPool(Sel); 69381f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor } 69391f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor } 69401f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 69411f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor // Build the set of methods we can see. 69420a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 6943218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 694428a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 6945218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 69461f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 69471f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor if (ReturnTy) 69481f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor Results.setPreferredType(GetTypeFromParser(ReturnTy).getNonReferenceType()); 6949db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl 69501f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor Results.EnterNewScope(); 6951db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl for (GlobalMethodPool::iterator M = MethodPool.begin(), 6952db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl MEnd = MethodPool.end(); 6953db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl M != MEnd; ++M) { 6954db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl for (ObjCMethodList *MethList = IsInstanceMethod ? &M->second.first : 6955db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl &M->second.second; 6956db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl MethList && MethList->Method; 69571f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor MethList = MethList->Next) { 69581f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor if (!isAcceptableObjCMethod(MethList->Method, MK_Any, SelIdents, 69591f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor NumSelIdents)) 69601f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor continue; 69611f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 696240ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor if (AtParameterName) { 696340ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor // Suggest parameter names we've seen before. 696440ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor if (NumSelIdents && NumSelIdents <= MethList->Method->param_size()) { 696540ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor ParmVarDecl *Param = MethList->Method->param_begin()[NumSelIdents-1]; 696640ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor if (Param->getIdentifier()) { 696728a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Builder(Results.getAllocator(), 696828a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis Results.getCodeCompletionTUInfo()); 6969dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddTypedTextChunk(Builder.getAllocator().CopyString( 6970218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Param->getIdentifier()->getName())); 6971218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 697240ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor } 697340ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor } 697440ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor 697540ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor continue; 697640ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor } 697740ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor 69781f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor Result R(MethList->Method, 0); 69791f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor R.StartParameter = NumSelIdents; 69801f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor R.AllParametersAreInformative = false; 69811f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor R.DeclaringEntity = true; 69821f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor Results.MaybeAddResult(R, CurContext); 69831f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor } 69841f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor } 69851f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 69861f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor Results.ExitScope(); 6987e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 6988e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 6989e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 69901f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor} 699187c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor 6992f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregorvoid Sema::CodeCompletePreprocessorDirective(bool InConditional) { 6993218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 699428a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 699552779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor CodeCompletionContext::CCC_PreprocessorDirective); 6996f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor Results.EnterNewScope(); 6997f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 6998f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #if <condition> 699928a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Builder(Results.getAllocator(), 700028a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis Results.getCodeCompletionTUInfo()); 7001218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("if"); 7002218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7003218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("condition"); 7004218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 7005f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 7006f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #ifdef <macro> 7007218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("ifdef"); 7008218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7009218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("macro"); 7010218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 7011218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor 7012f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #ifndef <macro> 7013218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("ifndef"); 7014218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7015218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("macro"); 7016218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 7017f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 7018f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor if (InConditional) { 7019f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #elif <condition> 7020218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("elif"); 7021218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7022218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("condition"); 7023218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 7024f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 7025f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #else 7026218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("else"); 7027218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 7028f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 7029f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #endif 7030218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("endif"); 7031218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 7032f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor } 7033f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 7034f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #include "header" 7035218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("include"); 7036218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7037218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("\""); 7038218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("header"); 7039218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("\""); 7040218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 7041f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 7042f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #include <header> 7043218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("include"); 7044218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7045218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("<"); 7046218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("header"); 7047218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk(">"); 7048218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 7049f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 7050f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #define <macro> 7051218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("define"); 7052218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7053218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("macro"); 7054218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 7055f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 7056f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #define <macro>(<args>) 7057218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("define"); 7058218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7059218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("macro"); 7060218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 7061218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("args"); 7062218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 7063218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 7064f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 7065f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #undef <macro> 7066218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("undef"); 7067218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7068218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("macro"); 7069218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 7070f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 7071f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #line <number> 7072218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("line"); 7073218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7074218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("number"); 7075218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 7076f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 7077f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #line <number> "filename" 7078218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("line"); 7079218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7080218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("number"); 7081218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7082218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("\""); 7083218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("filename"); 7084218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("\""); 7085218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 7086f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 7087f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #error <message> 7088218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("error"); 7089218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7090218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("message"); 7091218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 7092f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 7093f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #pragma <arguments> 7094218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("pragma"); 7095218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7096218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("arguments"); 7097218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 7098f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 70994e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (getLangOpts().ObjC1) { 7100f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #import "header" 7101218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("import"); 7102218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7103218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("\""); 7104218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("header"); 7105218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("\""); 7106218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 7107f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 7108f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #import <header> 7109218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("import"); 7110218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7111218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("<"); 7112218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("header"); 7113218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk(">"); 7114218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 7115f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor } 7116f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 7117f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #include_next "header" 7118218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("include_next"); 7119218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7120218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("\""); 7121218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("header"); 7122218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("\""); 7123218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 7124f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 7125f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #include_next <header> 7126218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("include_next"); 7127218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7128218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("<"); 7129218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("header"); 7130218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk(">"); 7131218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 7132f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 7133f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #warning <message> 7134218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("warning"); 7135218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7136218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("message"); 7137218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 7138f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 7139f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // Note: #ident and #sccs are such crazy anachronisms that we don't provide 7140f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // completions for them. And __include_macros is a Clang-internal extension 7141f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // that we don't want to encourage anyone to use. 7142f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 7143f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // FIXME: we don't support #assert or #unassert, so don't suggest them. 7144f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor Results.ExitScope(); 7145f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 7146f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 7147721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor CodeCompletionContext::CCC_PreprocessorDirective, 7148f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor Results.data(), Results.size()); 7149f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor} 7150f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 7151f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregorvoid Sema::CodeCompleteInPreprocessorConditionalExclusion(Scope *S) { 7152f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor CodeCompleteOrdinaryName(S, 7153f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall S->getFnParent()? Sema::PCC_RecoveryInFunction 7154f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall : Sema::PCC_Namespace); 7155f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor} 7156f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 7157f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregorvoid Sema::CodeCompletePreprocessorMacroName(bool IsDefinition) { 7158218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 715928a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 716052779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor IsDefinition? CodeCompletionContext::CCC_MacroName 716152779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor : CodeCompletionContext::CCC_MacroNameUse); 71621fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor if (!IsDefinition && (!CodeCompleter || CodeCompleter->includeMacros())) { 71631fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor // Add just the names of macros, not their arguments. 716428a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Builder(Results.getAllocator(), 716528a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis Results.getCodeCompletionTUInfo()); 71661fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor Results.EnterNewScope(); 71671fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor for (Preprocessor::macro_iterator M = PP.macro_begin(), 71681fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor MEnd = PP.macro_end(); 71691fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor M != MEnd; ++M) { 7170dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddTypedTextChunk(Builder.getAllocator().CopyString( 7171218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor M->first->getName())); 7172218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 71731fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor } 71741fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor Results.ExitScope(); 71751fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor } else if (IsDefinition) { 71761fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor // FIXME: Can we detect when the user just wrote an include guard above? 71771fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor } 71781fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor 717952779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 71801fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor Results.data(), Results.size()); 71811fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor} 71821fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor 7183f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregorvoid Sema::CodeCompletePreprocessorExpression() { 7184218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 718528a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 718652779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor CodeCompletionContext::CCC_PreprocessorExpression); 7187f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor 7188f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor if (!CodeCompleter || CodeCompleter->includeMacros()) 7189f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor AddMacroResults(PP, Results); 7190f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor 7191f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor // defined (<macro>) 7192f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor Results.EnterNewScope(); 719328a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Builder(Results.getAllocator(), 719428a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis Results.getCodeCompletionTUInfo()); 7195218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("defined"); 7196218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7197218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 7198218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("macro"); 7199218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 7200218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 7201f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor Results.ExitScope(); 7202f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor 7203f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 7204f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor CodeCompletionContext::CCC_PreprocessorExpression, 7205f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor Results.data(), Results.size()); 7206f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor} 7207f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor 7208f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregorvoid Sema::CodeCompletePreprocessorMacroArgument(Scope *S, 7209f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor IdentifierInfo *Macro, 7210f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor MacroInfo *MacroInfo, 7211f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor unsigned Argument) { 7212f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor // FIXME: In the future, we could provide "overload" results, much like we 7213f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor // do for function calls. 7214f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor 72155c5f03e4020e90b9760ec547962ba02b029cc359Argyrios Kyrtzidis // Now just ignore this. There will be another code-completion callback 72165c5f03e4020e90b9760ec547962ba02b029cc359Argyrios Kyrtzidis // for the expanded tokens. 7217f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor} 7218f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor 721955817afdf9d453a443262a733f6caf6692dca118Douglas Gregorvoid Sema::CodeCompleteNaturalLanguage() { 722055817afdf9d453a443262a733f6caf6692dca118Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 7221af1c6b532e6e1e944db987f29062e5efce71a573Douglas Gregor CodeCompletionContext::CCC_NaturalLanguage, 722255817afdf9d453a443262a733f6caf6692dca118Douglas Gregor 0, 0); 722355817afdf9d453a443262a733f6caf6692dca118Douglas Gregor} 722455817afdf9d453a443262a733f6caf6692dca118Douglas Gregor 7225dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregorvoid Sema::GatherGlobalCodeCompletions(CodeCompletionAllocator &Allocator, 722628a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionTUInfo &CCTUInfo, 72275f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVectorImpl<CodeCompletionResult> &Results) { 722828a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis ResultBuilder Builder(*this, Allocator, CCTUInfo, 722928a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionContext::CCC_Recovery); 72308071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor if (!CodeCompleter || CodeCompleter->includeGlobals()) { 72318071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompletionDeclConsumer Consumer(Builder, 72328071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor Context.getTranslationUnitDecl()); 72338071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(Context.getTranslationUnitDecl(), LookupAnyName, 72348071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor Consumer); 72358071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor } 723687c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor 723787c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor if (!CodeCompleter || CodeCompleter->includeMacros()) 723887c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor AddMacroResults(PP, Builder); 723987c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor 724087c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor Results.clear(); 724187c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor Results.insert(Results.end(), 724287c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor Builder.data(), Builder.data() + Builder.size()); 724387c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor} 7244