SemaCodeComplete.cpp revision a40f792c685c3ad94fc5a0ef538d0661374c7825
181b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor//===---------------- SemaCodeComplete.cpp - Code Completion ----*- C++ -*-===// 281b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor// 381b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor// The LLVM Compiler Infrastructure 481b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor// 581b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor// This file is distributed under the University of Illinois Open Source 681b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor// License. See LICENSE.TXT for details. 781b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor// 881b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor//===----------------------------------------------------------------------===// 981b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor// 1081b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor// This file defines the code-completion semantic actions. 1181b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor// 1281b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor//===----------------------------------------------------------------------===// 132d88708cbe4e4ec5e04e4acb6bd7f5be68557379John McCall#include "clang/Sema/SemaInternal.h" 14e737f5041a36d0befb39ffeed8d50ba15916d3daDouglas Gregor#include "clang/Sema/Lookup.h" 15120d63cd4465230c2cd56508c7cd8e0ad00848e7John McCall#include "clang/Sema/Overload.h" 1681b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor#include "clang/Sema/CodeCompleteConsumer.h" 17719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor#include "clang/Sema/ExternalSemaSource.h" 185f1e0942a32657b625702aa52f82430d0120f424John McCall#include "clang/Sema/Scope.h" 19781472fe99a120098c631b0cbe33c89f8cef5e70John McCall#include "clang/Sema/ScopeInfo.h" 207cd088e519d7e6caa4c4c12db52e0e4ae35d25c2John McCall#include "clang/AST/DeclObjC.h" 21b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor#include "clang/AST/ExprCXX.h" 2224a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor#include "clang/AST/ExprObjC.h" 23c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor#include "clang/Lex/HeaderSearch.h" 243f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor#include "clang/Lex/MacroInfo.h" 253f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor#include "clang/Lex/Preprocessor.h" 26d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor#include "llvm/ADT/DenseSet.h" 27013b3668b67c8cb3ad2ee516c5607a3eba11829fBenjamin Kramer#include "llvm/ADT/SmallBitVector.h" 2886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor#include "llvm/ADT/SmallPtrSet.h" 298fe83e1df954d72c0f4ffc15d20a5222ec151c21Benjamin Kramer#include "llvm/ADT/SmallString.h" 306a6840326e9b4ac8e81a5a212165f33743847ab8Douglas Gregor#include "llvm/ADT/StringExtras.h" 3122f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor#include "llvm/ADT/StringSwitch.h" 32458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor#include "llvm/ADT/Twine.h" 3386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor#include <list> 3486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor#include <map> 3586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor#include <vector> 3681b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor 3781b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregorusing namespace clang; 38781472fe99a120098c631b0cbe33c89f8cef5e70John McCallusing namespace sema; 3981b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor 4086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregornamespace { 4186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \brief A container of code-completion results. 4286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor class ResultBuilder { 4386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor public: 4486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \brief The type of a name-lookup filter, which can be provided to the 4586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// name-lookup routines to specify which declarations should be included in 4686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// the result set (when it returns true) and which declarations should be 4786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// filtered out (returns false). 4886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor typedef bool (ResultBuilder::*LookupFilter)(NamedDecl *) const; 4986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 500a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 5186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 5286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor private: 5386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \brief The actual results we have found. 5486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor std::vector<Result> Results; 5586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 5686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \brief A record of all of the declarations we have found and placed 5786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// into the result set, used to ensure that no declaration ever gets into 5886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// the result set twice. 5986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor llvm::SmallPtrSet<Decl*, 16> AllDeclsFound; 6086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 61fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor typedef std::pair<NamedDecl *, unsigned> DeclIndexPair; 62fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 63fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor /// \brief An entry in the shadow map, which is optimized to store 64fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor /// a single (declaration, index) mapping (the common case) but 65fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor /// can also store a list of (declaration, index) mappings. 66fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor class ShadowMapEntry { 675f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner typedef SmallVector<DeclIndexPair, 4> DeclIndexPairVector; 68fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 69fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor /// \brief Contains either the solitary NamedDecl * or a vector 70fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor /// of (declaration, index) pairs. 71fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor llvm::PointerUnion<NamedDecl *, DeclIndexPairVector*> DeclOrVector; 72fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 73fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor /// \brief When the entry contains a single declaration, this is 74fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor /// the index associated with that entry. 75fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor unsigned SingleDeclIndex; 76fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 77fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor public: 78fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ShadowMapEntry() : DeclOrVector(), SingleDeclIndex(0) { } 79fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 80fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor void Add(NamedDecl *ND, unsigned Index) { 81fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (DeclOrVector.isNull()) { 82fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor // 0 - > 1 elements: just set the single element information. 83fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor DeclOrVector = ND; 84fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor SingleDeclIndex = Index; 85fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return; 86fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 87fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 88fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (NamedDecl *PrevND = DeclOrVector.dyn_cast<NamedDecl *>()) { 89fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor // 1 -> 2 elements: create the vector of results and push in the 90fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor // existing declaration. 91fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor DeclIndexPairVector *Vec = new DeclIndexPairVector; 92fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor Vec->push_back(DeclIndexPair(PrevND, SingleDeclIndex)); 93fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor DeclOrVector = Vec; 94fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 95fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 96fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor // Add the new element to the end of the vector. 97fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor DeclOrVector.get<DeclIndexPairVector*>()->push_back( 98fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor DeclIndexPair(ND, Index)); 99fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 100fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 101fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor void Destroy() { 102fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (DeclIndexPairVector *Vec 103fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor = DeclOrVector.dyn_cast<DeclIndexPairVector *>()) { 104fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor delete Vec; 105fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor DeclOrVector = ((NamedDecl *)0); 106fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 107fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 108fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 109fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor // Iteration. 110fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor class iterator; 111fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor iterator begin() const; 112fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor iterator end() const; 113fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor }; 114fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 11586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \brief A mapping from declaration names to the declarations that have 11686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// this name within a particular scope and their index within the list of 11786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// results. 118fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor typedef llvm::DenseMap<DeclarationName, ShadowMapEntry> ShadowMap; 11986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 12086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \brief The semantic analysis object for which results are being 12186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// produced. 12286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Sema &SemaRef; 123218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor 124218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor /// \brief The allocator used to allocate new code-completion strings. 125dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor CodeCompletionAllocator &Allocator; 12628a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis 12728a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionTUInfo &CCTUInfo; 12886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 12986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \brief If non-NULL, a filter function used to remove any code-completion 13086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// results that are not desirable. 13186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor LookupFilter Filter; 13245bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor 13345bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor /// \brief Whether we should allow declarations as 13445bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor /// nested-name-specifiers that would otherwise be filtered out. 13545bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor bool AllowNestedNameSpecifiers; 13645bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor 1375ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor /// \brief If set, the type that we would prefer our resulting value 1385ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor /// declarations to have. 1395ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor /// 1405ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor /// Closely matching the preferred type gives a boost to a result's 1415ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor /// priority. 1425ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor CanQualType PreferredType; 1435ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 14486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \brief A list of shadow maps, which is used to model name hiding at 14586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// different levels of, e.g., the inheritance hierarchy. 14686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor std::list<ShadowMap> ShadowMaps; 14786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 1483cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor /// \brief If we're potentially referring to a C++ member function, the set 1493cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor /// of qualifiers applied to the object type. 1503cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor Qualifiers ObjectTypeQualifiers; 1513cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor 1523cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor /// \brief Whether the \p ObjectTypeQualifiers field is active. 1533cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor bool HasObjectTypeQualifiers; 1543cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor 155265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor /// \brief The selector that we prefer. 156265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor Selector PreferredSelector; 157265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor 158ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor /// \brief The completion context in which we are gathering results. 159cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor CodeCompletionContext CompletionContext; 160cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor 161a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett /// \brief If we are in an instance method definition, the \@implementation 162ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor /// object. 163ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor ObjCImplementationDecl *ObjCImplementation; 164ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor 165cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor void AdjustResultPriorityForDecl(Result &R); 1661f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 1676f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor void MaybeAddConstructorResults(Result R); 1686f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 16986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor public: 170dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor explicit ResultBuilder(Sema &SemaRef, CodeCompletionAllocator &Allocator, 17128a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionTUInfo &CCTUInfo, 17252779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor const CodeCompletionContext &CompletionContext, 17352779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor LookupFilter Filter = 0) 17428a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis : SemaRef(SemaRef), Allocator(Allocator), CCTUInfo(CCTUInfo), 17528a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis Filter(Filter), 176218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor AllowNestedNameSpecifiers(false), HasObjectTypeQualifiers(false), 177ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor CompletionContext(CompletionContext), 178ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor ObjCImplementation(0) 179ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor { 180ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor // If this is an Objective-C instance method definition, dig out the 181ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor // corresponding implementation. 182ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor switch (CompletionContext.getKind()) { 183ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor case CodeCompletionContext::CCC_Expression: 184ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor case CodeCompletionContext::CCC_ObjCMessageReceiver: 185ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor case CodeCompletionContext::CCC_ParenthesizedExpression: 186ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor case CodeCompletionContext::CCC_Statement: 187ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor case CodeCompletionContext::CCC_Recovery: 188ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor if (ObjCMethodDecl *Method = SemaRef.getCurMethodDecl()) 189ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor if (Method->isInstanceMethod()) 190ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor if (ObjCInterfaceDecl *Interface = Method->getClassInterface()) 191ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor ObjCImplementation = Interface->getImplementation(); 192ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor break; 193ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor 194ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor default: 195ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor break; 196ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor } 197ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor } 19886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 199d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor /// \brief Whether we should include code patterns in the completion 200d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor /// results. 201d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor bool includeCodePatterns() const { 202d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor return SemaRef.CodeCompleter && 203f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor SemaRef.CodeCompleter->includeCodePatterns(); 204d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor } 205d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor 20686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \brief Set the filter used for code-completion results. 20786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor void setFilter(LookupFilter Filter) { 20886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor this->Filter = Filter; 20986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 21086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 21186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Result *data() { return Results.empty()? 0 : &Results.front(); } 21286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor unsigned size() const { return Results.size(); } 21386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool empty() const { return Results.empty(); } 21486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 2155ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor /// \brief Specify the preferred type. 2165ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor void setPreferredType(QualType T) { 2175ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor PreferredType = SemaRef.Context.getCanonicalType(T); 2185ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor } 2195ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 2203cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor /// \brief Set the cv-qualifiers on the object type, for us in filtering 2213cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor /// calls to member functions. 2223cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor /// 2233cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor /// When there are qualifiers in this set, they will be used to filter 2243cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor /// out member functions that aren't available (because there will be a 2253cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor /// cv-qualifier mismatch) or prefer functions with an exact qualifier 2263cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor /// match. 2273cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor void setObjectTypeQualifiers(Qualifiers Quals) { 2283cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor ObjectTypeQualifiers = Quals; 2293cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor HasObjectTypeQualifiers = true; 2303cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor } 2313cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor 232265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor /// \brief Set the preferred selector. 233265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor /// 234265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor /// When an Objective-C method declaration result is added, and that 235265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor /// method's selector matches this preferred selector, we give that method 236265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor /// a slight priority boost. 237265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor void setPreferredSelector(Selector Sel) { 238265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor PreferredSelector = Sel; 239265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor } 240ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor 241cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor /// \brief Retrieve the code-completion context for which results are 242cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor /// being collected. 243cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor const CodeCompletionContext &getCompletionContext() const { 244cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor return CompletionContext; 245cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor } 246cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor 24745bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor /// \brief Specify whether nested-name-specifiers are allowed. 24845bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor void allowNestedNameSpecifiers(bool Allow = true) { 24945bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor AllowNestedNameSpecifiers = Allow; 25045bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor } 25145bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor 252b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor /// \brief Return the semantic analysis object for which we are collecting 253b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor /// code completion results. 254b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor Sema &getSema() const { return SemaRef; } 255b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor 256218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor /// \brief Retrieve the allocator used to allocate code completion strings. 257dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor CodeCompletionAllocator &getAllocator() const { return Allocator; } 25828a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis 25928a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionTUInfo &getCodeCompletionTUInfo() const { return CCTUInfo; } 260218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor 261e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor /// \brief Determine whether the given declaration is at all interesting 262e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor /// as a code-completion result. 26345bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor /// 26445bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor /// \param ND the declaration that we are inspecting. 26545bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor /// 26645bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor /// \param AsNestedNameSpecifier will be set true if this declaration is 26745bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor /// only interesting when it is a nested-name-specifier. 26845bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor bool isInterestingDecl(NamedDecl *ND, bool &AsNestedNameSpecifier) const; 2696660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor 2706660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor /// \brief Check whether the result is hidden by the Hiding declaration. 2716660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor /// 2726660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor /// \returns true if the result is hidden and cannot be found, false if 2736660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor /// the hidden result could still be found. When false, \p R may be 2746660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor /// modified to describe how the result can be found (e.g., via extra 2756660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor /// qualification). 2766660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor bool CheckHiddenResult(Result &R, DeclContext *CurContext, 2776660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor NamedDecl *Hiding); 2786660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor 27986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \brief Add a new result to this result set (if it isn't already in one 28086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// of the shadow maps), or replace an existing result (for, e.g., a 28186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// redeclaration). 282456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor /// 28381f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor /// \param R the result to add (if it is unique). 284456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor /// 28581f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor /// \param CurContext the context in which this result will be named. 286456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor void MaybeAddResult(Result R, DeclContext *CurContext = 0); 28786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 2881ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// \brief Add a new result to this result set, where we already know 2891ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// the hiding declation (if any). 2901ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// 2911ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// \param R the result to add (if it is unique). 2921ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// 2931ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// \param CurContext the context in which this result will be named. 2941ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// 2951ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// \param Hiding the declaration that hides the result. 2960cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor /// 2970cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor /// \param InBaseClass whether the result was found in a base 2980cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor /// class of the searched context. 2990cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor void AddResult(Result R, DeclContext *CurContext, NamedDecl *Hiding, 3000cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor bool InBaseClass); 3011ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 302a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor /// \brief Add a new non-declaration result to this result set. 303a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor void AddResult(Result R); 304a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor 30586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \brief Enter into a new scope. 30686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor void EnterNewScope(); 30786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 30886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \brief Exit from the current scope. 30986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor void ExitScope(); 31086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 31155385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor /// \brief Ignore this declaration, if it is seen again. 31255385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor void Ignore(Decl *D) { AllDeclsFound.insert(D->getCanonicalDecl()); } 31355385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor 31486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \name Name lookup predicates 31586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// 31686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// These predicates can be passed to the name lookup functions to filter the 31786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// results of name lookup. All of the predicates have the same type, so that 31886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// 31986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor //@{ 320791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor bool IsOrdinaryName(NamedDecl *ND) const; 3214710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor bool IsOrdinaryNonTypeName(NamedDecl *ND) const; 322f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor bool IsIntegralConstantValue(NamedDecl *ND) const; 32301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor bool IsOrdinaryNonValueName(NamedDecl *ND) const; 32486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool IsNestedNameSpecifier(NamedDecl *ND) const; 32586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool IsEnum(NamedDecl *ND) const; 32686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool IsClassOrStruct(NamedDecl *ND) const; 32786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool IsUnion(NamedDecl *ND) const; 32886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool IsNamespace(NamedDecl *ND) const; 32986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool IsNamespaceOrAlias(NamedDecl *ND) const; 33086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool IsType(NamedDecl *ND) const; 331eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor bool IsMember(NamedDecl *ND) const; 33280f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor bool IsObjCIvar(NamedDecl *ND) const; 3338e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor bool IsObjCMessageReceiver(NamedDecl *ND) const; 33481f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor bool IsObjCMessageReceiverOrLambdaCapture(NamedDecl *ND) const; 335fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor bool IsObjCCollection(NamedDecl *ND) const; 33652779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor bool IsImpossibleToSatisfy(NamedDecl *ND) const; 33786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor //@} 33886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor }; 33986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 34086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 341fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregorclass ResultBuilder::ShadowMapEntry::iterator { 342fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor llvm::PointerUnion<NamedDecl*, const DeclIndexPair*> DeclOrIterator; 343fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor unsigned SingleDeclIndex; 344fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 345fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregorpublic: 346fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor typedef DeclIndexPair value_type; 347fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor typedef value_type reference; 348fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor typedef std::ptrdiff_t difference_type; 349fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor typedef std::input_iterator_tag iterator_category; 350fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 351fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor class pointer { 352fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor DeclIndexPair Value; 353fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 354fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor public: 355fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor pointer(const DeclIndexPair &Value) : Value(Value) { } 356fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 357fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor const DeclIndexPair *operator->() const { 358fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return &Value; 359fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 360fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor }; 361fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 362fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor iterator() : DeclOrIterator((NamedDecl *)0), SingleDeclIndex(0) { } 363fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 364fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor iterator(NamedDecl *SingleDecl, unsigned Index) 365fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor : DeclOrIterator(SingleDecl), SingleDeclIndex(Index) { } 366fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 367fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor iterator(const DeclIndexPair *Iterator) 368fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor : DeclOrIterator(Iterator), SingleDeclIndex(0) { } 369fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 370fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor iterator &operator++() { 371fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (DeclOrIterator.is<NamedDecl *>()) { 372fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor DeclOrIterator = (NamedDecl *)0; 373fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor SingleDeclIndex = 0; 374fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return *this; 375fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 376fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 377fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor const DeclIndexPair *I = DeclOrIterator.get<const DeclIndexPair*>(); 378fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ++I; 379fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor DeclOrIterator = I; 380fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return *this; 381fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 382fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 38366392d4260cdd1a98f9ce908d99e3cf9a31432e2Chris Lattner /*iterator operator++(int) { 384fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor iterator tmp(*this); 385fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ++(*this); 386fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return tmp; 38766392d4260cdd1a98f9ce908d99e3cf9a31432e2Chris Lattner }*/ 388fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 389fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor reference operator*() const { 390fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (NamedDecl *ND = DeclOrIterator.dyn_cast<NamedDecl *>()) 391fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return reference(ND, SingleDeclIndex); 392fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 393d490f953e812a9bb1729637cc70a6db7d997ced0Douglas Gregor return *DeclOrIterator.get<const DeclIndexPair*>(); 394fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 395fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 396fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor pointer operator->() const { 397fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return pointer(**this); 398fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 399fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 400fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor friend bool operator==(const iterator &X, const iterator &Y) { 401d490f953e812a9bb1729637cc70a6db7d997ced0Douglas Gregor return X.DeclOrIterator.getOpaqueValue() 402d490f953e812a9bb1729637cc70a6db7d997ced0Douglas Gregor == Y.DeclOrIterator.getOpaqueValue() && 403fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor X.SingleDeclIndex == Y.SingleDeclIndex; 404fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 405fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 406fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor friend bool operator!=(const iterator &X, const iterator &Y) { 407d490f953e812a9bb1729637cc70a6db7d997ced0Douglas Gregor return !(X == Y); 408fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 409fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor}; 410fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 411fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas GregorResultBuilder::ShadowMapEntry::iterator 412fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas GregorResultBuilder::ShadowMapEntry::begin() const { 413fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (DeclOrVector.isNull()) 414fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return iterator(); 415fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 416fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (NamedDecl *ND = DeclOrVector.dyn_cast<NamedDecl *>()) 417fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return iterator(ND, SingleDeclIndex); 418fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 419fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return iterator(DeclOrVector.get<DeclIndexPairVector *>()->begin()); 420fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor} 421fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 422fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas GregorResultBuilder::ShadowMapEntry::iterator 423fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas GregorResultBuilder::ShadowMapEntry::end() const { 424fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (DeclOrVector.is<NamedDecl *>() || DeclOrVector.isNull()) 425fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return iterator(); 426fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 427fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return iterator(DeclOrVector.get<DeclIndexPairVector *>()->end()); 428fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor} 429fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 430456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// \brief Compute the qualification required to get from the current context 431456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// (\p CurContext) to the target context (\p TargetContext). 432456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// 433456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// \param Context the AST context in which the qualification will be used. 434456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// 435456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// \param CurContext the context where an entity is being named, which is 436456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// typically based on the current scope. 437456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// 438456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// \param TargetContext the context in which the named entity actually 439456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// resides. 440456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// 441456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// \returns a nested name specifier that refers into the target context, or 442456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// NULL if no qualification is needed. 443456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregorstatic NestedNameSpecifier * 444456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas GregorgetRequiredQualification(ASTContext &Context, 445456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor DeclContext *CurContext, 446456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor DeclContext *TargetContext) { 4475f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<DeclContext *, 4> TargetParents; 448456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor 449456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor for (DeclContext *CommonAncestor = TargetContext; 450456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor CommonAncestor && !CommonAncestor->Encloses(CurContext); 451456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor CommonAncestor = CommonAncestor->getLookupParent()) { 452456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor if (CommonAncestor->isTransparentContext() || 453456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor CommonAncestor->isFunctionOrMethod()) 454456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor continue; 455456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor 456456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor TargetParents.push_back(CommonAncestor); 457456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor } 458456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor 459456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor NestedNameSpecifier *Result = 0; 460456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor while (!TargetParents.empty()) { 461456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor DeclContext *Parent = TargetParents.back(); 462456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor TargetParents.pop_back(); 463456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor 464fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor if (NamespaceDecl *Namespace = dyn_cast<NamespaceDecl>(Parent)) { 465fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor if (!Namespace->getIdentifier()) 466fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor continue; 467fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor 468456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor Result = NestedNameSpecifier::Create(Context, Result, Namespace); 469fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor } 470456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor else if (TagDecl *TD = dyn_cast<TagDecl>(Parent)) 471456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor Result = NestedNameSpecifier::Create(Context, Result, 472456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor false, 473456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor Context.getTypeDeclType(TD).getTypePtr()); 4740c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor } 475456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor return Result; 476456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor} 477456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor 47845bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregorbool ResultBuilder::isInterestingDecl(NamedDecl *ND, 47945bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor bool &AsNestedNameSpecifier) const { 48045bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor AsNestedNameSpecifier = false; 48145bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor 482e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor ND = ND->getUnderlyingDecl(); 483e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor unsigned IDNS = ND->getIdentifierNamespace(); 484f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor 485f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor // Skip unnamed entities. 486e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor if (!ND->getDeclName()) 487e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return false; 48886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 48986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Friend declarations and declarations introduced due to friends are never 49086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // added as results. 49192b7f70c924cbf4514e9e434cea7def51ab49860John McCall if (IDNS & (Decl::IDNS_OrdinaryFriend | Decl::IDNS_TagFriend)) 492e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return false; 493e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 4947628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor // Class template (partial) specializations are never added as results. 495e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor if (isa<ClassTemplateSpecializationDecl>(ND) || 496e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor isa<ClassTemplatePartialSpecializationDecl>(ND)) 497e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return false; 49886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 4997628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor // Using declarations themselves are never added as results. 500e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor if (isa<UsingDecl>(ND)) 501e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return false; 502e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 503e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor // Some declarations have reserved names that we don't want to ever show. 504e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor if (const IdentifierInfo *Id = ND->getIdentifier()) { 50586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // __va_list_tag is a freak of nature. Find it and skip it. 50686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (Id->isStr("__va_list_tag") || Id->isStr("__builtin_va_list")) 507e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return false; 50886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 509f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor // Filter out names reserved for the implementation (C99 7.1.3, 510797efb51ce0825eb4cce2864a5cea2b30e85f06cDouglas Gregor // C++ [lib.global.names]) if they come from a system header. 511e013d685c6689ac7ae103ee88acf573422d1ed6aDaniel Dunbar // 512e013d685c6689ac7ae103ee88acf573422d1ed6aDaniel Dunbar // FIXME: Add predicate for this. 513f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor if (Id->getLength() >= 2) { 514e013d685c6689ac7ae103ee88acf573422d1ed6aDaniel Dunbar const char *Name = Id->getNameStart(); 515f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor if (Name[0] == '_' && 516797efb51ce0825eb4cce2864a5cea2b30e85f06cDouglas Gregor (Name[1] == '_' || (Name[1] >= 'A' && Name[1] <= 'Z')) && 517797efb51ce0825eb4cce2864a5cea2b30e85f06cDouglas Gregor (ND->getLocation().isInvalid() || 518797efb51ce0825eb4cce2864a5cea2b30e85f06cDouglas Gregor SemaRef.SourceMgr.isInSystemHeader( 519797efb51ce0825eb4cce2864a5cea2b30e85f06cDouglas Gregor SemaRef.SourceMgr.getSpellingLoc(ND->getLocation())))) 520e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return false; 521f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor } 52286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 5239b0ba87a5ee4d872ae60dbfe4cbd500e57b8a775Douglas Gregor 524a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor if (Filter == &ResultBuilder::IsNestedNameSpecifier || 525a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor ((isa<NamespaceDecl>(ND) || isa<NamespaceAliasDecl>(ND)) && 526a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor Filter != &ResultBuilder::IsNamespace && 52752779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor Filter != &ResultBuilder::IsNamespaceOrAlias && 52852779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor Filter != 0)) 529a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor AsNestedNameSpecifier = true; 530a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor 53186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Filter out any unwanted results. 53245bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor if (Filter && !(this->*Filter)(ND)) { 53345bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor // Check whether it is interesting as a nested-name-specifier. 5344e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (AllowNestedNameSpecifiers && SemaRef.getLangOpts().CPlusPlus && 53545bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor IsNestedNameSpecifier(ND) && 53645bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor (Filter != &ResultBuilder::IsMember || 53745bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor (isa<CXXRecordDecl>(ND) && 53845bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor cast<CXXRecordDecl>(ND)->isInjectedClassName()))) { 53945bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor AsNestedNameSpecifier = true; 54045bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor return true; 54145bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor } 54245bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor 543e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return false; 544a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor } 545e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor // ... then it must be interesting! 546e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return true; 547e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor} 548e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 5496660d845af8edb99098a08cf2539233a3be650b3Douglas Gregorbool ResultBuilder::CheckHiddenResult(Result &R, DeclContext *CurContext, 5506660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor NamedDecl *Hiding) { 5516660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor // In C, there is no way to refer to a hidden name. 5526660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor // FIXME: This isn't true; we can find a tag name hidden by an ordinary 5536660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor // name if we introduce the tag type. 5544e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (!SemaRef.getLangOpts().CPlusPlus) 5556660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor return true; 5566660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor 5577a126a474fdde06382b315b4e3d8ef0a21d4dc31Sebastian Redl DeclContext *HiddenCtx = R.Declaration->getDeclContext()->getRedeclContext(); 5586660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor 5596660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor // There is no way to qualify a name declared in a function or method. 5606660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor if (HiddenCtx->isFunctionOrMethod()) 5616660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor return true; 5626660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor 5637a126a474fdde06382b315b4e3d8ef0a21d4dc31Sebastian Redl if (HiddenCtx == Hiding->getDeclContext()->getRedeclContext()) 5646660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor return true; 5656660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor 5666660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor // We can refer to the result with the appropriate qualification. Do it. 5676660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor R.Hidden = true; 5686660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor R.QualifierIsInformative = false; 5696660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor 5706660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor if (!R.Qualifier) 5716660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor R.Qualifier = getRequiredQualification(SemaRef.Context, 5726660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor CurContext, 5736660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor R.Declaration->getDeclContext()); 5746660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor return false; 5756660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor} 5766660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor 5771f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor/// \brief A simplified classification of types used to determine whether two 5781f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor/// types are "similar enough" when adjusting priorities. 5791827e10051638770ad9ccf3e285caf95f995afd1Douglas GregorSimplifiedTypeClass clang::getSimplifiedTypeClass(CanQualType T) { 5801f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor switch (T->getTypeClass()) { 5811f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::Builtin: 5821f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor switch (cast<BuiltinType>(T)->getKind()) { 5831f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case BuiltinType::Void: 5841f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Void; 5851f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 5861f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case BuiltinType::NullPtr: 5871f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Pointer; 5881f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 5891f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case BuiltinType::Overload: 5901f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case BuiltinType::Dependent: 5911f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Other; 5921f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 5931f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case BuiltinType::ObjCId: 5941f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case BuiltinType::ObjCClass: 5951f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case BuiltinType::ObjCSel: 5961f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_ObjectiveC; 5971f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 5981f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor default: 5991f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Arithmetic; 6001f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor } 6017530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie 6021f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::Complex: 6031f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Arithmetic; 6041f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 6051f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::Pointer: 6061f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Pointer; 6071f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 6081f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::BlockPointer: 6091f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Block; 6101f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 6111f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::LValueReference: 6121f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::RValueReference: 6131f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return getSimplifiedTypeClass(T->getAs<ReferenceType>()->getPointeeType()); 6141f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 6151f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::ConstantArray: 6161f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::IncompleteArray: 6171f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::VariableArray: 6181f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::DependentSizedArray: 6191f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Array; 6201f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 6211f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::DependentSizedExtVector: 6221f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::Vector: 6231f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::ExtVector: 6241f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Arithmetic; 6251f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 6261f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::FunctionProto: 6271f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::FunctionNoProto: 6281f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Function; 6291f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 6301f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::Record: 6311f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Record; 6321f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 6331f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::Enum: 6341f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Arithmetic; 6351f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 6361f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::ObjCObject: 6371f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::ObjCInterface: 6381f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::ObjCObjectPointer: 6391f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_ObjectiveC; 6401f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 6411f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor default: 6421f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Other; 6431f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor } 6441f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor} 6451f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 6461f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor/// \brief Get the type that a given expression will have if this declaration 6471f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor/// is used as an expression in its "typical" code-completion form. 6481827e10051638770ad9ccf3e285caf95f995afd1Douglas GregorQualType clang::getDeclUsageType(ASTContext &C, NamedDecl *ND) { 6491f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor ND = cast<NamedDecl>(ND->getUnderlyingDecl()); 6501f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 6511f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor if (TypeDecl *Type = dyn_cast<TypeDecl>(ND)) 6521f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return C.getTypeDeclType(Type); 6531f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor if (ObjCInterfaceDecl *Iface = dyn_cast<ObjCInterfaceDecl>(ND)) 6541f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return C.getObjCInterfaceType(Iface); 6551f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 6561f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor QualType T; 6571f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor if (FunctionDecl *Function = dyn_cast<FunctionDecl>(ND)) 6585291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor T = Function->getCallResultType(); 6591f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor else if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(ND)) 6605291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor T = Method->getSendResultType(); 6611f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor else if (FunctionTemplateDecl *FunTmpl = dyn_cast<FunctionTemplateDecl>(ND)) 6625291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor T = FunTmpl->getTemplatedDecl()->getCallResultType(); 6631f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor else if (EnumConstantDecl *Enumerator = dyn_cast<EnumConstantDecl>(ND)) 6641f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor T = C.getTypeDeclType(cast<EnumDecl>(Enumerator->getDeclContext())); 6651f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor else if (ObjCPropertyDecl *Property = dyn_cast<ObjCPropertyDecl>(ND)) 6661f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor T = Property->getType(); 6671f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor else if (ValueDecl *Value = dyn_cast<ValueDecl>(ND)) 6681f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor T = Value->getType(); 6691f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor else 6701f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return QualType(); 6713e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor 6723e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor // Dig through references, function pointers, and block pointers to 6733e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor // get down to the likely type of an expression when the entity is 6743e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor // used. 6753e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor do { 6763e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor if (const ReferenceType *Ref = T->getAs<ReferenceType>()) { 6773e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor T = Ref->getPointeeType(); 6783e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor continue; 6793e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor } 6803e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor 6813e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor if (const PointerType *Pointer = T->getAs<PointerType>()) { 6823e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor if (Pointer->getPointeeType()->isFunctionType()) { 6833e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor T = Pointer->getPointeeType(); 6843e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor continue; 6853e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor } 6863e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor 6873e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor break; 6883e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor } 6893e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor 6903e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor if (const BlockPointerType *Block = T->getAs<BlockPointerType>()) { 6913e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor T = Block->getPointeeType(); 6923e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor continue; 6933e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor } 6943e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor 6953e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor if (const FunctionType *Function = T->getAs<FunctionType>()) { 6963e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor T = Function->getResultType(); 6973e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor continue; 6983e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor } 6993e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor 7003e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor break; 7013e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor } while (true); 7023e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor 7033e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor return T; 7041f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor} 7051f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 706cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregorvoid ResultBuilder::AdjustResultPriorityForDecl(Result &R) { 707cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor // If this is an Objective-C method declaration whose selector matches our 708cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor // preferred selector, give it a priority boost. 709cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor if (!PreferredSelector.isNull()) 710cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(R.Declaration)) 711cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor if (PreferredSelector == Method->getSelector()) 712cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor R.Priority += CCD_SelectorMatch; 71308f43cd5d966fd31b32bd5c76c0645ebbf08b2f1Douglas Gregor 714cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor // If we have a preferred type, adjust the priority for results with exactly- 715cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor // matching or nearly-matching types. 716cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor if (!PreferredType.isNull()) { 717cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor QualType T = getDeclUsageType(SemaRef.Context, R.Declaration); 718cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor if (!T.isNull()) { 719cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor CanQualType TC = SemaRef.Context.getCanonicalType(T); 720cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor // Check for exactly-matching types (modulo qualifiers). 721cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor if (SemaRef.Context.hasSameUnqualifiedType(PreferredType, TC)) 722cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor R.Priority /= CCF_ExactTypeMatch; 723cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor // Check for nearly-matching types, based on classification of each. 724cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor else if ((getSimplifiedTypeClass(PreferredType) 7251f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor == getSimplifiedTypeClass(TC)) && 726cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor !(PreferredType->isEnumeralType() && TC->isEnumeralType())) 727cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor R.Priority /= CCF_SimilarTypeMatch; 728cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor } 729cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor } 7301f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor} 7311f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 7326f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregorvoid ResultBuilder::MaybeAddConstructorResults(Result R) { 7334e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (!SemaRef.getLangOpts().CPlusPlus || !R.Declaration || 7346f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor !CompletionContext.wantConstructorResults()) 7356f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor return; 7366f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 7376f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor ASTContext &Context = SemaRef.Context; 7386f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor NamedDecl *D = R.Declaration; 7396f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor CXXRecordDecl *Record = 0; 7406f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor if (ClassTemplateDecl *ClassTemplate = dyn_cast<ClassTemplateDecl>(D)) 7416f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor Record = ClassTemplate->getTemplatedDecl(); 7426f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor else if ((Record = dyn_cast<CXXRecordDecl>(D))) { 7436f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor // Skip specializations and partial specializations. 7446f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor if (isa<ClassTemplateSpecializationDecl>(Record)) 7456f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor return; 7466f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor } else { 7476f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor // There are no constructors here. 7486f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor return; 7496f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor } 7506f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 7516f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor Record = Record->getDefinition(); 7526f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor if (!Record) 7536f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor return; 7546f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 7556f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 7566f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor QualType RecordTy = Context.getTypeDeclType(Record); 7576f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor DeclarationName ConstructorName 7586f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor = Context.DeclarationNames.getCXXConstructorName( 7596f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor Context.getCanonicalType(RecordTy)); 7606f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor for (DeclContext::lookup_result Ctors = Record->lookup(ConstructorName); 7616f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor Ctors.first != Ctors.second; ++Ctors.first) { 7626f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor R.Declaration = *Ctors.first; 7636f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor R.CursorKind = getCursorKindForDecl(R.Declaration); 7646f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor Results.push_back(R); 7656f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor } 7666f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor} 7676f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 768e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregorvoid ResultBuilder::MaybeAddResult(Result R, DeclContext *CurContext) { 769e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor assert(!ShadowMaps.empty() && "Must enter into a results scope"); 770e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 771e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor if (R.Kind != Result::RK_Declaration) { 772e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor // For non-declaration results, just add the result. 773e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor Results.push_back(R); 774e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return; 775e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor } 776e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 777e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor // Look through using declarations. 778e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor if (UsingShadowDecl *Using = dyn_cast<UsingShadowDecl>(R.Declaration)) { 779e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor MaybeAddResult(Result(Using->getTargetDecl(), R.Qualifier), CurContext); 78086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return; 781e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor } 78286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 783e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor Decl *CanonDecl = R.Declaration->getCanonicalDecl(); 784e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor unsigned IDNS = CanonDecl->getIdentifierNamespace(); 785e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 78645bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor bool AsNestedNameSpecifier = false; 78745bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor if (!isInterestingDecl(R.Declaration, AsNestedNameSpecifier)) 788e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return; 789e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 7906f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor // C++ constructors are never found by name lookup. 7916f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor if (isa<CXXConstructorDecl>(R.Declaration)) 7926f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor return; 7936f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 79486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ShadowMap &SMap = ShadowMaps.back(); 795fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ShadowMapEntry::iterator I, IEnd; 796fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ShadowMap::iterator NamePos = SMap.find(R.Declaration->getDeclName()); 797fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (NamePos != SMap.end()) { 798fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor I = NamePos->second.begin(); 799fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor IEnd = NamePos->second.end(); 800fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 801fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 802fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor for (; I != IEnd; ++I) { 803fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor NamedDecl *ND = I->first; 804fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor unsigned Index = I->second; 80586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (ND->getCanonicalDecl() == CanonDecl) { 80686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // This is a redeclaration. Always pick the newer declaration. 80786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Results[Index].Declaration = R.Declaration; 80886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 80986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // We're done. 81086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return; 81186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 81286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 81386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 81486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // This is a new declaration in this scope. However, check whether this 81586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // declaration name is hidden by a similarly-named declaration in an outer 81686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // scope. 81786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor std::list<ShadowMap>::iterator SM, SMEnd = ShadowMaps.end(); 81886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor --SMEnd; 81986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor for (SM = ShadowMaps.begin(); SM != SMEnd; ++SM) { 820fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ShadowMapEntry::iterator I, IEnd; 821fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ShadowMap::iterator NamePos = SM->find(R.Declaration->getDeclName()); 822fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (NamePos != SM->end()) { 823fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor I = NamePos->second.begin(); 824fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor IEnd = NamePos->second.end(); 825fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 826fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor for (; I != IEnd; ++I) { 82786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // A tag declaration does not hide a non-tag declaration. 8280d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCall if (I->first->hasTagIdentifierNamespace() && 82986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor (IDNS & (Decl::IDNS_Member | Decl::IDNS_Ordinary | 83086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Decl::IDNS_ObjCProtocol))) 83186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor continue; 83286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 83386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Protocols are in distinct namespaces from everything else. 834fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (((I->first->getIdentifierNamespace() & Decl::IDNS_ObjCProtocol) 83586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor || (IDNS & Decl::IDNS_ObjCProtocol)) && 836fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor I->first->getIdentifierNamespace() != IDNS) 83786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor continue; 83886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 83986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // The newly-added result is hidden by an entry in the shadow map. 8406660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor if (CheckHiddenResult(R, CurContext, I->first)) 84186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return; 84286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 84386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor break; 84486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 84586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 84686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 84786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Make sure that any given declaration only shows up in the result set once. 84886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!AllDeclsFound.insert(CanonDecl)) 84986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return; 850265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor 851eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor // If the filter is for nested-name-specifiers, then this result starts a 852eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor // nested-name-specifier. 85312e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor if (AsNestedNameSpecifier) { 854eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor R.StartsNestedNameSpecifier = true; 85512e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor R.Priority = CCP_NestedNameSpecifier; 856cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor } else 857cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor AdjustResultPriorityForDecl(R); 858265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor 8590563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor // If this result is supposed to have an informative qualifier, add one. 860eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor if (R.QualifierIsInformative && !R.Qualifier && 861eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor !R.StartsNestedNameSpecifier) { 8620563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor DeclContext *Ctx = R.Declaration->getDeclContext(); 8630563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor if (NamespaceDecl *Namespace = dyn_cast<NamespaceDecl>(Ctx)) 8640563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor R.Qualifier = NestedNameSpecifier::Create(SemaRef.Context, 0, Namespace); 8650563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor else if (TagDecl *Tag = dyn_cast<TagDecl>(Ctx)) 8660563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor R.Qualifier = NestedNameSpecifier::Create(SemaRef.Context, 0, false, 8670563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor SemaRef.Context.getTypeDeclType(Tag).getTypePtr()); 8680563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor else 8690563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor R.QualifierIsInformative = false; 8700563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor } 871eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor 87286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Insert this result into the set of results and into the current shadow 87386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // map. 874fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor SMap[R.Declaration->getDeclName()].Add(R.Declaration, Results.size()); 87586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Results.push_back(R); 8766f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 8776f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor if (!AsNestedNameSpecifier) 8786f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor MaybeAddConstructorResults(R); 87986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 88086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 8811ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregorvoid ResultBuilder::AddResult(Result R, DeclContext *CurContext, 8820cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor NamedDecl *Hiding, bool InBaseClass = false) { 883a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor if (R.Kind != Result::RK_Declaration) { 884a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor // For non-declaration results, just add the result. 885a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.push_back(R); 886a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor return; 887a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor } 888a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor 8891ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor // Look through using declarations. 8901ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor if (UsingShadowDecl *Using = dyn_cast<UsingShadowDecl>(R.Declaration)) { 8911ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor AddResult(Result(Using->getTargetDecl(), R.Qualifier), CurContext, Hiding); 8921ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor return; 8931ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor } 8941ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 89545bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor bool AsNestedNameSpecifier = false; 89645bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor if (!isInterestingDecl(R.Declaration, AsNestedNameSpecifier)) 8971ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor return; 8981ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 8996f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor // C++ constructors are never found by name lookup. 9006f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor if (isa<CXXConstructorDecl>(R.Declaration)) 9016f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor return; 9026f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 9031ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor if (Hiding && CheckHiddenResult(R, CurContext, Hiding)) 9041ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor return; 905173a37a57b79bd8f94b85c2273039e760b159922Nick Lewycky 9061ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor // Make sure that any given declaration only shows up in the result set once. 9071ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor if (!AllDeclsFound.insert(R.Declaration->getCanonicalDecl())) 9081ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor return; 9091ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 9101ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor // If the filter is for nested-name-specifiers, then this result starts a 9111ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor // nested-name-specifier. 91212e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor if (AsNestedNameSpecifier) { 9131ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor R.StartsNestedNameSpecifier = true; 91412e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor R.Priority = CCP_NestedNameSpecifier; 91512e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor } 9160cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor else if (Filter == &ResultBuilder::IsMember && !R.Qualifier && InBaseClass && 9170cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor isa<CXXRecordDecl>(R.Declaration->getDeclContext() 9187a126a474fdde06382b315b4e3d8ef0a21d4dc31Sebastian Redl ->getRedeclContext())) 9190cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor R.QualifierIsInformative = true; 9200cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor 9211ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor // If this result is supposed to have an informative qualifier, add one. 9221ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor if (R.QualifierIsInformative && !R.Qualifier && 9231ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor !R.StartsNestedNameSpecifier) { 9241ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor DeclContext *Ctx = R.Declaration->getDeclContext(); 9251ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor if (NamespaceDecl *Namespace = dyn_cast<NamespaceDecl>(Ctx)) 9261ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor R.Qualifier = NestedNameSpecifier::Create(SemaRef.Context, 0, Namespace); 9271ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor else if (TagDecl *Tag = dyn_cast<TagDecl>(Ctx)) 9281ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor R.Qualifier = NestedNameSpecifier::Create(SemaRef.Context, 0, false, 92945bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor SemaRef.Context.getTypeDeclType(Tag).getTypePtr()); 9301ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor else 9311ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor R.QualifierIsInformative = false; 9321ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor } 9331ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 93412e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor // Adjust the priority if this result comes from a base class. 93512e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor if (InBaseClass) 93612e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor R.Priority += CCD_InBaseClass; 93712e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor 938cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor AdjustResultPriorityForDecl(R); 9395ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 9403cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor if (HasObjectTypeQualifiers) 9413cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(R.Declaration)) 9423cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor if (Method->isInstance()) { 9433cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor Qualifiers MethodQuals 9443cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor = Qualifiers::fromCVRMask(Method->getTypeQualifiers()); 9453cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor if (ObjectTypeQualifiers == MethodQuals) 9463cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor R.Priority += CCD_ObjectQualifierMatch; 9473cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor else if (ObjectTypeQualifiers - MethodQuals) { 9483cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor // The method cannot be invoked, because doing so would drop 9493cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor // qualifiers. 9503cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor return; 9513cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor } 9523cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor } 9533cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor 9541ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor // Insert this result into the set of results. 9551ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor Results.push_back(R); 9566f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 9576f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor if (!AsNestedNameSpecifier) 9586f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor MaybeAddConstructorResults(R); 9591ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor} 9601ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 961a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregorvoid ResultBuilder::AddResult(Result R) { 962a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor assert(R.Kind != Result::RK_Declaration && 963a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor "Declaration results need more context"); 964a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.push_back(R); 965a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor} 966a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor 96786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Enter into a new scope. 96886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorvoid ResultBuilder::EnterNewScope() { 96986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ShadowMaps.push_back(ShadowMap()); 97086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 97186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 97286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Exit from the current scope. 97386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorvoid ResultBuilder::ExitScope() { 974fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor for (ShadowMap::iterator E = ShadowMaps.back().begin(), 975fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor EEnd = ShadowMaps.back().end(); 976fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor E != EEnd; 977fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ++E) 978fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor E->second.Destroy(); 979fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 98086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ShadowMaps.pop_back(); 98186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 98286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 983791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor/// \brief Determines whether this given declaration will be found by 984791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor/// ordinary name lookup. 985791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregorbool ResultBuilder::IsOrdinaryName(NamedDecl *ND) const { 9864710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor ND = cast<NamedDecl>(ND->getUnderlyingDecl()); 9874710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor 988791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor unsigned IDNS = Decl::IDNS_Ordinary; 9894e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (SemaRef.getLangOpts().CPlusPlus) 9909b30b267e77d1778e1e9b7c44b6852489c2c5096Douglas Gregor IDNS |= Decl::IDNS_Tag | Decl::IDNS_Namespace | Decl::IDNS_Member; 9914e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie else if (SemaRef.getLangOpts().ObjC1) { 992ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor if (isa<ObjCIvarDecl>(ND)) 993ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor return true; 994ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor } 995ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor 996791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor return ND->getIdentifierNamespace() & IDNS; 997791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor} 998791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor 99901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor/// \brief Determines whether this given declaration will be found by 10004710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor/// ordinary name lookup but is not a type name. 10014710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregorbool ResultBuilder::IsOrdinaryNonTypeName(NamedDecl *ND) const { 10024710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor ND = cast<NamedDecl>(ND->getUnderlyingDecl()); 10034710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor if (isa<TypeDecl>(ND) || isa<ObjCInterfaceDecl>(ND)) 10044710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor return false; 10054710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor 10064710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor unsigned IDNS = Decl::IDNS_Ordinary; 10074e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (SemaRef.getLangOpts().CPlusPlus) 10089b30b267e77d1778e1e9b7c44b6852489c2c5096Douglas Gregor IDNS |= Decl::IDNS_Tag | Decl::IDNS_Namespace | Decl::IDNS_Member; 10094e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie else if (SemaRef.getLangOpts().ObjC1) { 1010ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor if (isa<ObjCIvarDecl>(ND)) 1011ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor return true; 1012ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor } 1013ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor 10144710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor return ND->getIdentifierNamespace() & IDNS; 10154710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor} 10164710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor 1017f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregorbool ResultBuilder::IsIntegralConstantValue(NamedDecl *ND) const { 1018f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor if (!IsOrdinaryNonTypeName(ND)) 1019f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor return 0; 1020f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor 1021f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor if (ValueDecl *VD = dyn_cast<ValueDecl>(ND->getUnderlyingDecl())) 1022f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor if (VD->getType()->isIntegralOrEnumerationType()) 1023f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor return true; 1024f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor 1025f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor return false; 1026f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor} 1027f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor 10284710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor/// \brief Determines whether this given declaration will be found by 102901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor/// ordinary name lookup. 103001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregorbool ResultBuilder::IsOrdinaryNonValueName(NamedDecl *ND) const { 10314710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor ND = cast<NamedDecl>(ND->getUnderlyingDecl()); 10324710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor 103301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor unsigned IDNS = Decl::IDNS_Ordinary; 10344e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (SemaRef.getLangOpts().CPlusPlus) 10350d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCall IDNS |= Decl::IDNS_Tag | Decl::IDNS_Namespace; 103601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 103701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor return (ND->getIdentifierNamespace() & IDNS) && 10384710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor !isa<ValueDecl>(ND) && !isa<FunctionTemplateDecl>(ND) && 10394710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor !isa<ObjCPropertyDecl>(ND); 104001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor} 104101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 104286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Determines whether the given declaration is suitable as the 104386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// start of a C++ nested-name-specifier, e.g., a class or namespace. 104486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsNestedNameSpecifier(NamedDecl *ND) const { 104586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Allow us to find class templates, too. 104686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (ClassTemplateDecl *ClassTemplate = dyn_cast<ClassTemplateDecl>(ND)) 104786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ND = ClassTemplate->getTemplatedDecl(); 104886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 104986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return SemaRef.isAcceptableNestedNameSpecifier(ND); 105086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 105186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 105286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Determines whether the given declaration is an enumeration. 105386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsEnum(NamedDecl *ND) const { 105486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return isa<EnumDecl>(ND); 105586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 105686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 105786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Determines whether the given declaration is a class or struct. 105886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsClassOrStruct(NamedDecl *ND) const { 105986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Allow us to find class templates, too. 106086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (ClassTemplateDecl *ClassTemplate = dyn_cast<ClassTemplateDecl>(ND)) 106186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ND = ClassTemplate->getTemplatedDecl(); 106286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 106386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (RecordDecl *RD = dyn_cast<RecordDecl>(ND)) 1064465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara return RD->getTagKind() == TTK_Class || 1065465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara RD->getTagKind() == TTK_Struct; 106686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 106786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return false; 106886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 106986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 107086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Determines whether the given declaration is a union. 107186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsUnion(NamedDecl *ND) const { 107286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Allow us to find class templates, too. 107386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (ClassTemplateDecl *ClassTemplate = dyn_cast<ClassTemplateDecl>(ND)) 107486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ND = ClassTemplate->getTemplatedDecl(); 107586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 107686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (RecordDecl *RD = dyn_cast<RecordDecl>(ND)) 1077465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara return RD->getTagKind() == TTK_Union; 107886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 107986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return false; 108086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 108186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 108286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Determines whether the given declaration is a namespace. 108386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsNamespace(NamedDecl *ND) const { 108486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return isa<NamespaceDecl>(ND); 108586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 108686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 108786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Determines whether the given declaration is a namespace or 108886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// namespace alias. 108986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsNamespaceOrAlias(NamedDecl *ND) const { 109086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return isa<NamespaceDecl>(ND) || isa<NamespaceAliasDecl>(ND); 109186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 109286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 10937628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor/// \brief Determines whether the given declaration is a type. 109486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsType(NamedDecl *ND) const { 1095d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor if (UsingShadowDecl *Using = dyn_cast<UsingShadowDecl>(ND)) 1096d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor ND = Using->getTargetDecl(); 1097d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor 1098d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor return isa<TypeDecl>(ND) || isa<ObjCInterfaceDecl>(ND); 109986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 110086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 11017628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor/// \brief Determines which members of a class should be visible via 11027628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor/// "." or "->". Only value declarations, nested name specifiers, and 11037628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor/// using declarations thereof should show up. 1104eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregorbool ResultBuilder::IsMember(NamedDecl *ND) const { 11057628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor if (UsingShadowDecl *Using = dyn_cast<UsingShadowDecl>(ND)) 11067628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor ND = Using->getTargetDecl(); 11077628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor 1108ce82196076cd15f5ecfa029fcda8b58dc0146cf1Douglas Gregor return isa<ValueDecl>(ND) || isa<FunctionTemplateDecl>(ND) || 1109ce82196076cd15f5ecfa029fcda8b58dc0146cf1Douglas Gregor isa<ObjCPropertyDecl>(ND); 1110eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor} 1111eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor 11128e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregorstatic bool isObjCReceiverType(ASTContext &C, QualType T) { 11138e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor T = C.getCanonicalType(T); 11148e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor switch (T->getTypeClass()) { 11158e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor case Type::ObjCObject: 11168e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor case Type::ObjCInterface: 11178e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor case Type::ObjCObjectPointer: 11188e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor return true; 11198e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 11208e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor case Type::Builtin: 11218e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor switch (cast<BuiltinType>(T)->getKind()) { 11228e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor case BuiltinType::ObjCId: 11238e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor case BuiltinType::ObjCClass: 11248e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor case BuiltinType::ObjCSel: 11258e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor return true; 11268e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 11278e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor default: 11288e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor break; 11298e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor } 11308e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor return false; 11318e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 11328e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor default: 11338e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor break; 11348e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor } 11358e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 11364e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (!C.getLangOpts().CPlusPlus) 11378e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor return false; 11388e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 11398e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor // FIXME: We could perform more analysis here to determine whether a 11408e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor // particular class type has any conversions to Objective-C types. For now, 11418e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor // just accept all class types. 11428e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor return T->isDependentType() || T->isRecordType(); 11438e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor} 11448e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 11458e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregorbool ResultBuilder::IsObjCMessageReceiver(NamedDecl *ND) const { 11468e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor QualType T = getDeclUsageType(SemaRef.Context, ND); 11478e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor if (T.isNull()) 11488e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor return false; 11498e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 11508e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor T = SemaRef.Context.getBaseElementType(T); 11518e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor return isObjCReceiverType(SemaRef.Context, T); 11528e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor} 11538e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 115481f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregorbool ResultBuilder::IsObjCMessageReceiverOrLambdaCapture(NamedDecl *ND) const { 115581f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor if (IsObjCMessageReceiver(ND)) 115681f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor return true; 115781f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor 115881f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor VarDecl *Var = dyn_cast<VarDecl>(ND); 115981f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor if (!Var) 116081f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor return false; 116181f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor 116281f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor return Var->hasLocalStorage() && !Var->hasAttr<BlocksAttr>(); 116381f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor} 116481f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor 1165fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregorbool ResultBuilder::IsObjCCollection(NamedDecl *ND) const { 11664e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if ((SemaRef.getLangOpts().CPlusPlus && !IsOrdinaryName(ND)) || 11674e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie (!SemaRef.getLangOpts().CPlusPlus && !IsOrdinaryNonTypeName(ND))) 1168fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor return false; 1169fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor 1170fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor QualType T = getDeclUsageType(SemaRef.Context, ND); 1171fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor if (T.isNull()) 1172fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor return false; 1173fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor 1174fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor T = SemaRef.Context.getBaseElementType(T); 1175fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor return T->isObjCObjectType() || T->isObjCObjectPointerType() || 1176fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor T->isObjCIdType() || 11774e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie (SemaRef.getLangOpts().CPlusPlus && T->isRecordType()); 1178fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor} 11798e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 118052779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregorbool ResultBuilder::IsImpossibleToSatisfy(NamedDecl *ND) const { 118152779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor return false; 118252779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor} 118352779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor 118480f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor/// \rief Determines whether the given declaration is an Objective-C 118580f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor/// instance variable. 118680f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregorbool ResultBuilder::IsObjCIvar(NamedDecl *ND) const { 118780f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor return isa<ObjCIvarDecl>(ND); 118880f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor} 118980f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor 11901ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregornamespace { 11911ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// \brief Visible declaration consumer that adds a code-completion result 11921ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// for each visible declaration. 11931ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor class CodeCompletionDeclConsumer : public VisibleDeclConsumer { 11941ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor ResultBuilder &Results; 11951ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor DeclContext *CurContext; 11961ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 11971ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor public: 11981ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor CodeCompletionDeclConsumer(ResultBuilder &Results, DeclContext *CurContext) 11991ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor : Results(Results), CurContext(CurContext) { } 12001ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 1201d12059673dcef32bc2b6bae5321654d33863afe6Erik Verbruggen virtual void FoundDecl(NamedDecl *ND, NamedDecl *Hiding, DeclContext *Ctx, 1202d12059673dcef32bc2b6bae5321654d33863afe6Erik Verbruggen bool InBaseClass) { 1203d12059673dcef32bc2b6bae5321654d33863afe6Erik Verbruggen bool Accessible = true; 120417015eff2b3166e445377b15913474b472775e7cDouglas Gregor if (Ctx) 120517015eff2b3166e445377b15913474b472775e7cDouglas Gregor Accessible = Results.getSema().IsSimplyAccessible(ND, Ctx); 120617015eff2b3166e445377b15913474b472775e7cDouglas Gregor 1207d12059673dcef32bc2b6bae5321654d33863afe6Erik Verbruggen ResultBuilder::Result Result(ND, 0, false, Accessible); 1208d12059673dcef32bc2b6bae5321654d33863afe6Erik Verbruggen Results.AddResult(Result, CurContext, Hiding, InBaseClass); 12091ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor } 12101ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor }; 12111ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor} 12121ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 121386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Add type specifiers for the current language as keyword results. 1214bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddTypeSpecifierResults(const LangOptions &LangOpts, 121586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ResultBuilder &Results) { 12160a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 121712e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("short", CCP_Type)); 121812e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("long", CCP_Type)); 121912e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("signed", CCP_Type)); 122012e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("unsigned", CCP_Type)); 122112e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("void", CCP_Type)); 122212e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("char", CCP_Type)); 122312e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("int", CCP_Type)); 122412e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("float", CCP_Type)); 122512e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("double", CCP_Type)); 122612e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("enum", CCP_Type)); 122712e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("struct", CCP_Type)); 122812e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("union", CCP_Type)); 122912e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("const", CCP_Type)); 123012e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("volatile", CCP_Type)); 123101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 123286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (LangOpts.C99) { 123386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // C99-specific 123412e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("_Complex", CCP_Type)); 123512e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("_Imaginary", CCP_Type)); 123612e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("_Bool", CCP_Type)); 123712e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("restrict", CCP_Type)); 123886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 123986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 124028a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Builder(Results.getAllocator(), 124128a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis Results.getCodeCompletionTUInfo()); 124286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (LangOpts.CPlusPlus) { 124386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // C++-specific 1244b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor Results.AddResult(Result("bool", CCP_Type + 1245b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor (LangOpts.ObjC1? CCD_bool_in_ObjC : 0))); 124612e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("class", CCP_Type)); 124712e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("wchar_t", CCP_Type)); 124886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 1249c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // typename qualified-id 1250218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("typename"); 1251218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1252218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("qualifier"); 1253218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("::"); 1254218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("name"); 1255218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1256d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor 125786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (LangOpts.CPlusPlus0x) { 125812e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("auto", CCP_Type)); 125912e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("char16_t", CCP_Type)); 126012e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("char32_t", CCP_Type)); 1261c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor 1262218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("decltype"); 1263218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1264218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1265218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1266218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 126786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 126886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 126986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 127086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // GNU extensions 127186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (LangOpts.GNUMode) { 127286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // FIXME: Enable when we actually support decimal floating point. 1273a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor // Results.AddResult(Result("_Decimal32")); 1274a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor // Results.AddResult(Result("_Decimal64")); 1275a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor // Results.AddResult(Result("_Decimal128")); 127601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1277218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("typeof"); 1278218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1279218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1280218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1281c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor 1282218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("typeof"); 1283218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1284218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("type"); 1285218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1286218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 128701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 128801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor} 128901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1290f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCallstatic void AddStorageSpecifiers(Sema::ParserCompletionContext CCC, 129101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor const LangOptions &LangOpts, 129201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor ResultBuilder &Results) { 12930a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 129401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Note: we don't suggest either "auto" or "register", because both 129501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // are pointless as storage specifiers. Elsewhere, we suggest "auto" 129601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // in C++0x as a type specifier. 1297a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("extern")); 1298a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("static")); 129901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor} 130001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1301f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCallstatic void AddFunctionSpecifiers(Sema::ParserCompletionContext CCC, 130201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor const LangOptions &LangOpts, 130301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor ResultBuilder &Results) { 13040a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 130501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor switch (CCC) { 1306f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Class: 1307f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_MemberTemplate: 130801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (LangOpts.CPlusPlus) { 1309a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("explicit")); 1310a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("friend")); 1311a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("mutable")); 1312a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("virtual")); 131301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 131401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Fall through 131501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1316f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ObjCInterface: 1317f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ObjCImplementation: 1318f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Namespace: 1319f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Template: 132001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (LangOpts.CPlusPlus || LangOpts.C99) 1321a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("inline")); 132201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 132301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1324f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ObjCInstanceVariableList: 1325f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Expression: 1326f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Statement: 1327f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ForInit: 1328f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Condition: 1329f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_RecoveryInFunction: 1330f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Type: 13310268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor case Sema::PCC_ParenthesizedExpression: 133268e3c2eef52701a178fbcc2bb424f31dd4b36931Douglas Gregor case Sema::PCC_LocalDeclarationSpecifiers: 133301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 133401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 133501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor} 133601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1337bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCExpressionResults(ResultBuilder &Results, bool NeedAt); 1338bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCStatementResults(ResultBuilder &Results, bool NeedAt); 1339bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCVisibilityResults(const LangOptions &LangOpts, 1340c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor ResultBuilder &Results, 1341c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor bool NeedAt); 1342bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCImplementationResults(const LangOptions &LangOpts, 1343b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor ResultBuilder &Results, 1344b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor bool NeedAt); 1345bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCInterfaceResults(const LangOptions &LangOpts, 1346b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor ResultBuilder &Results, 1347b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor bool NeedAt); 1348bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCTopLevelResults(ResultBuilder &Results, bool NeedAt); 1349b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 1350c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregorstatic void AddTypedefResult(ResultBuilder &Results) { 135128a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Builder(Results.getAllocator(), 135228a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis Results.getCodeCompletionTUInfo()); 1353218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("typedef"); 1354218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1355218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("type"); 1356218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1357218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("name"); 1358218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(CodeCompletionResult(Builder.TakeString())); 1359c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor} 1360c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor 1361f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCallstatic bool WantTypesInContext(Sema::ParserCompletionContext CCC, 13624710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor const LangOptions &LangOpts) { 13634710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor switch (CCC) { 1364f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Namespace: 1365f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Class: 1366f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ObjCInstanceVariableList: 1367f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Template: 1368f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_MemberTemplate: 1369f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Statement: 1370f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_RecoveryInFunction: 1371f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Type: 13720268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor case Sema::PCC_ParenthesizedExpression: 137368e3c2eef52701a178fbcc2bb424f31dd4b36931Douglas Gregor case Sema::PCC_LocalDeclarationSpecifiers: 13744710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor return true; 13754710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor 1376f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Expression: 1377f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Condition: 13780268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor return LangOpts.CPlusPlus; 13790268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor 13800268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor case Sema::PCC_ObjCInterface: 13810268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor case Sema::PCC_ObjCImplementation: 13824710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor return false; 13834710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor 1384f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ForInit: 13850268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor return LangOpts.CPlusPlus || LangOpts.ObjC1 || LangOpts.C99; 13864710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor } 13877530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie 13887530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie llvm_unreachable("Invalid ParserCompletionContext!"); 13894710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor} 13904710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor 1391ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidisstatic PrintingPolicy getCompletionPrintingPolicy(const ASTContext &Context, 1392ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis const Preprocessor &PP) { 1393ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis PrintingPolicy Policy = Sema::getPrintingPolicy(Context, PP); 13948ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Policy.AnonymousTagLocations = false; 13958ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Policy.SuppressStrongLifetime = true; 139625270b6e6a8416b7532cfe552b41794418ea19b1Douglas Gregor Policy.SuppressUnwrittenScope = true; 13978ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor return Policy; 13988ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor} 13998ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor 1400ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis/// \brief Retrieve a printing policy suitable for code completion. 1401ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidisstatic PrintingPolicy getCompletionPrintingPolicy(Sema &S) { 1402ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis return getCompletionPrintingPolicy(S.Context, S.PP); 1403ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis} 1404ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis 14058ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor/// \brief Retrieve the string representation of the given type as a string 14068ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor/// that has the appropriate lifetime for code completion. 14078ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor/// 14088ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor/// This routine provides a fast path where we provide constant strings for 14098ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor/// common type names. 14108ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregorstatic const char *GetCompletionTypeString(QualType T, 14118ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor ASTContext &Context, 14128ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor const PrintingPolicy &Policy, 14138ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor CodeCompletionAllocator &Allocator) { 14148ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor if (!T.getLocalQualifiers()) { 14158ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor // Built-in type names are constant strings. 14168ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor if (const BuiltinType *BT = dyn_cast<BuiltinType>(T)) 141727a00970bf4ababdc115e54383e6252cc3276dfaArgyrios Kyrtzidis return BT->getNameAsCString(Policy); 14188ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor 14198ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor // Anonymous tag types are constant strings. 14208ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor if (const TagType *TagT = dyn_cast<TagType>(T)) 14218ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor if (TagDecl *Tag = TagT->getDecl()) 14228ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor if (!Tag->getIdentifier() && !Tag->getTypedefNameForAnonDecl()) { 14238ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor switch (Tag->getTagKind()) { 14248ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor case TTK_Struct: return "struct <anonymous>"; 14258ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor case TTK_Class: return "class <anonymous>"; 14268ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor case TTK_Union: return "union <anonymous>"; 14278ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor case TTK_Enum: return "enum <anonymous>"; 14288ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor } 14298ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor } 14308ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor } 14318ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor 14328ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor // Slow path: format the type as a string. 14338ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor std::string Result; 14348ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor T.getAsStringInternal(Result, Policy); 14358ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor return Allocator.CopyString(Result); 14368ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor} 14378ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor 143881f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor/// \brief Add a completion for "this", if we're in a member function. 143981f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregorstatic void addThisCompletion(Sema &S, ResultBuilder &Results) { 144081f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor QualType ThisTy = S.getCurrentThisType(); 144181f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor if (ThisTy.isNull()) 144281f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor return; 144381f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor 144481f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor CodeCompletionAllocator &Allocator = Results.getAllocator(); 144528a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo()); 144681f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor PrintingPolicy Policy = getCompletionPrintingPolicy(S); 144781f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor Builder.AddResultTypeChunk(GetCompletionTypeString(ThisTy, 144881f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor S.Context, 144981f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor Policy, 145081f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor Allocator)); 145181f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor Builder.AddTypedTextChunk("this"); 145281f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor Results.AddResult(CodeCompletionResult(Builder.TakeString())); 145381f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor} 145481f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor 145501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor/// \brief Add language constructs that show up for "ordinary" names. 1456f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCallstatic void AddOrdinaryNameResults(Sema::ParserCompletionContext CCC, 145701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Scope *S, 145801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Sema &SemaRef, 145901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor ResultBuilder &Results) { 14608ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor CodeCompletionAllocator &Allocator = Results.getAllocator(); 146128a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo()); 14628ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor PrintingPolicy Policy = getCompletionPrintingPolicy(SemaRef); 1463218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor 14640a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 146501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor switch (CCC) { 1466f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Namespace: 14674e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (SemaRef.getLangOpts().CPlusPlus) { 1468c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor if (Results.includeCodePatterns()) { 1469c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // namespace <identifier> { declarations } 1470218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("namespace"); 1471218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1472218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("identifier"); 1473218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 1474218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("declarations"); 1475218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 1476218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 1477218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1478c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor } 1479c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor 148001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // namespace identifier = identifier ; 1481218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("namespace"); 1482218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1483218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("name"); 1484218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_Equal); 1485218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("namespace"); 1486218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 148701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 148801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Using directives 1489218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("using"); 1490218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1491218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("namespace"); 1492218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1493218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("identifier"); 1494218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 149501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 149601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // asm(string-literal) 1497218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("asm"); 1498218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1499218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("string-literal"); 1500218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1501218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 150201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1503c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor if (Results.includeCodePatterns()) { 1504c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // Explicit template instantiation 1505218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("template"); 1506218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1507218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("declaration"); 1508218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1509c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor } 151001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 1511b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 15124e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (SemaRef.getLangOpts().ObjC1) 1513bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCTopLevelResults(Results, true); 1514b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 1515c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor AddTypedefResult(Results); 151601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Fall through 151701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1518f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Class: 15194e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (SemaRef.getLangOpts().CPlusPlus) { 152001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Using declaration 1521218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("using"); 1522218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1523218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("qualifier"); 1524218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("::"); 1525218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("name"); 1526218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 152701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1528c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // using typename qualifier::name (only in a dependent context) 152901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (SemaRef.CurContext->isDependentContext()) { 1530218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("using"); 1531218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1532218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("typename"); 1533218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1534218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("qualifier"); 1535218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("::"); 1536218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("name"); 1537218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 153801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 153901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1540f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall if (CCC == Sema::PCC_Class) { 1541c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor AddTypedefResult(Results); 1542c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor 154301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // public: 1544218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("public"); 154510ccf12a06cc1ef5b778c20565945f313a9a2c26Douglas Gregor if (Results.includeCodePatterns()) 154610ccf12a06cc1ef5b778c20565945f313a9a2c26Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_Colon); 1547218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 154801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 154901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // protected: 1550218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("protected"); 155110ccf12a06cc1ef5b778c20565945f313a9a2c26Douglas Gregor if (Results.includeCodePatterns()) 155210ccf12a06cc1ef5b778c20565945f313a9a2c26Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_Colon); 1553218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 155401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 155501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // private: 1556218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("private"); 155710ccf12a06cc1ef5b778c20565945f313a9a2c26Douglas Gregor if (Results.includeCodePatterns()) 155810ccf12a06cc1ef5b778c20565945f313a9a2c26Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_Colon); 1559218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 156001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 156101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 156201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Fall through 156301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1564f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Template: 1565f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_MemberTemplate: 15664e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (SemaRef.getLangOpts().CPlusPlus && Results.includeCodePatterns()) { 156701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // template < parameters > 1568218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("template"); 1569218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftAngle); 1570218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("parameters"); 1571218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightAngle); 1572218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 157301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 157401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 15754e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie AddStorageSpecifiers(CCC, SemaRef.getLangOpts(), Results); 15764e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie AddFunctionSpecifiers(CCC, SemaRef.getLangOpts(), Results); 157701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 157801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1579f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ObjCInterface: 15804e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie AddObjCInterfaceResults(SemaRef.getLangOpts(), Results, true); 15814e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie AddStorageSpecifiers(CCC, SemaRef.getLangOpts(), Results); 15824e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie AddFunctionSpecifiers(CCC, SemaRef.getLangOpts(), Results); 1583b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor break; 1584b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 1585f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ObjCImplementation: 15864e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie AddObjCImplementationResults(SemaRef.getLangOpts(), Results, true); 15874e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie AddStorageSpecifiers(CCC, SemaRef.getLangOpts(), Results); 15884e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie AddFunctionSpecifiers(CCC, SemaRef.getLangOpts(), Results); 1589b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor break; 1590b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 1591f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ObjCInstanceVariableList: 15924e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie AddObjCVisibilityResults(SemaRef.getLangOpts(), Results, true); 1593c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor break; 1594c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor 1595f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_RecoveryInFunction: 1596f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Statement: { 1597c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor AddTypedefResult(Results); 159801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 15994e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (SemaRef.getLangOpts().CPlusPlus && Results.includeCodePatterns() && 16004e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie SemaRef.getLangOpts().CXXExceptions) { 1601218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("try"); 1602218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 1603218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("statements"); 1604218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 1605218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 1606218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("catch"); 1607218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1608218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("declaration"); 1609218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1610218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 1611218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("statements"); 1612218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 1613218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 1614218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 161501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 16164e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (SemaRef.getLangOpts().ObjC1) 1617bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCStatementResults(Results, true); 1618b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 1619d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor if (Results.includeCodePatterns()) { 1620d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor // if (condition) { statements } 1621218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("if"); 1622218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 16234e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (SemaRef.getLangOpts().CPlusPlus) 1624218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("condition"); 1625d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor else 1626218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1627218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1628218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 1629218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("statements"); 1630218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 1631218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 1632218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 163301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1634d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor // switch (condition) { } 1635218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("switch"); 1636218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 16374e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (SemaRef.getLangOpts().CPlusPlus) 1638218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("condition"); 1639d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor else 1640218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1641218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1642218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 1643218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 1644218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 1645218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1646d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor } 1647d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor 164801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Switch-specific statements. 1649781472fe99a120098c631b0cbe33c89f8cef5e70John McCall if (!SemaRef.getCurFunction()->SwitchStack.empty()) { 165001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // case expression: 1651218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("case"); 1652218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1653218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1654218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_Colon); 1655218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 165601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 165701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // default: 1658218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("default"); 1659218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_Colon); 1660218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 166101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 166201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1663d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor if (Results.includeCodePatterns()) { 1664d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor /// while (condition) { statements } 1665218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("while"); 1666218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 16674e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (SemaRef.getLangOpts().CPlusPlus) 1668218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("condition"); 1669d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor else 1670218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1671218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1672218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 1673218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("statements"); 1674218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 1675218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 1676218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 167701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1678d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor // do { statements } while ( expression ); 1679218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("do"); 1680218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 1681218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("statements"); 1682218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 1683218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 1684218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("while"); 1685218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1686218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1687218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1688218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 168901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1690d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor // for ( for-init-statement ; condition ; expression ) { statements } 1691218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("for"); 1692218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 16934e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (SemaRef.getLangOpts().CPlusPlus || SemaRef.getLangOpts().C99) 1694218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("init-statement"); 1695d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor else 1696218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("init-expression"); 1697218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_SemiColon); 1698218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("condition"); 1699218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_SemiColon); 1700218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("inc-expression"); 1701218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1702218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 1703218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 1704218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("statements"); 1705218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 1706218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 1707218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1708d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor } 170901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 171001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (S->getContinueParent()) { 171101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // continue ; 1712218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("continue"); 1713218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 171401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 171501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 171601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (S->getBreakParent()) { 171701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // break ; 1718218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("break"); 1719218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 172001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 172101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 172201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // "return expression ;" or "return ;", depending on whether we 172301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // know the function is void or not. 172401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor bool isVoid = false; 172501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (FunctionDecl *Function = dyn_cast<FunctionDecl>(SemaRef.CurContext)) 172601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor isVoid = Function->getResultType()->isVoidType(); 172701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor else if (ObjCMethodDecl *Method 172801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor = dyn_cast<ObjCMethodDecl>(SemaRef.CurContext)) 172901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor isVoid = Method->getResultType()->isVoidType(); 17309ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor else if (SemaRef.getCurBlock() && 17319ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor !SemaRef.getCurBlock()->ReturnType.isNull()) 17329ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor isVoid = SemaRef.getCurBlock()->ReturnType->isVoidType(); 1733218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("return"); 17349329800d6f4c4ea8778aabd64cde1b712b290b00Douglas Gregor if (!isVoid) { 1735218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1736218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 17379329800d6f4c4ea8778aabd64cde1b712b290b00Douglas Gregor } 1738218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 173901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1740c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // goto identifier ; 1741218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("goto"); 1742218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1743218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("label"); 1744218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 174501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1746c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // Using directives 1747218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("using"); 1748218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1749218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("namespace"); 1750218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1751218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("identifier"); 1752218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 175301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 175401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 175501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Fall through (for statement expressions). 1756f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ForInit: 1757f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Condition: 17584e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie AddStorageSpecifiers(CCC, SemaRef.getLangOpts(), Results); 175901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Fall through: conditions and statements can have expressions. 176001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 17610268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor case Sema::PCC_ParenthesizedExpression: 17624e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (SemaRef.getLangOpts().ObjCAutoRefCount && 1763f85e193739c953358c865005855253af4f68a497John McCall CCC == Sema::PCC_ParenthesizedExpression) { 1764f85e193739c953358c865005855253af4f68a497John McCall // (__bridge <type>)<expression> 1765f85e193739c953358c865005855253af4f68a497John McCall Builder.AddTypedTextChunk("__bridge"); 1766f85e193739c953358c865005855253af4f68a497John McCall Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1767f85e193739c953358c865005855253af4f68a497John McCall Builder.AddPlaceholderChunk("type"); 1768f85e193739c953358c865005855253af4f68a497John McCall Builder.AddChunk(CodeCompletionString::CK_RightParen); 1769f85e193739c953358c865005855253af4f68a497John McCall Builder.AddPlaceholderChunk("expression"); 1770f85e193739c953358c865005855253af4f68a497John McCall Results.AddResult(Result(Builder.TakeString())); 1771f85e193739c953358c865005855253af4f68a497John McCall 1772f85e193739c953358c865005855253af4f68a497John McCall // (__bridge_transfer <Objective-C type>)<expression> 1773f85e193739c953358c865005855253af4f68a497John McCall Builder.AddTypedTextChunk("__bridge_transfer"); 1774f85e193739c953358c865005855253af4f68a497John McCall Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1775f85e193739c953358c865005855253af4f68a497John McCall Builder.AddPlaceholderChunk("Objective-C type"); 1776f85e193739c953358c865005855253af4f68a497John McCall Builder.AddChunk(CodeCompletionString::CK_RightParen); 1777f85e193739c953358c865005855253af4f68a497John McCall Builder.AddPlaceholderChunk("expression"); 1778f85e193739c953358c865005855253af4f68a497John McCall Results.AddResult(Result(Builder.TakeString())); 1779f85e193739c953358c865005855253af4f68a497John McCall 1780f85e193739c953358c865005855253af4f68a497John McCall // (__bridge_retained <CF type>)<expression> 1781f85e193739c953358c865005855253af4f68a497John McCall Builder.AddTypedTextChunk("__bridge_retained"); 1782f85e193739c953358c865005855253af4f68a497John McCall Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1783f85e193739c953358c865005855253af4f68a497John McCall Builder.AddPlaceholderChunk("CF type"); 1784f85e193739c953358c865005855253af4f68a497John McCall Builder.AddChunk(CodeCompletionString::CK_RightParen); 1785f85e193739c953358c865005855253af4f68a497John McCall Builder.AddPlaceholderChunk("expression"); 1786f85e193739c953358c865005855253af4f68a497John McCall Results.AddResult(Result(Builder.TakeString())); 1787f85e193739c953358c865005855253af4f68a497John McCall } 1788f85e193739c953358c865005855253af4f68a497John McCall // Fall through 1789f85e193739c953358c865005855253af4f68a497John McCall 1790f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Expression: { 17914e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (SemaRef.getLangOpts().CPlusPlus) { 179201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // 'this', if we're in a non-static member function. 179381f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor addThisCompletion(SemaRef, Results); 17948ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor 17958ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor // true 17968ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("bool"); 17978ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddTypedTextChunk("true"); 17988ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 179901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 18008ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor // false 18018ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("bool"); 18028ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddTypedTextChunk("false"); 18038ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 180401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 18054e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (SemaRef.getLangOpts().RTTI) { 1806ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor // dynamic_cast < type-id > ( expression ) 1807ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddTypedTextChunk("dynamic_cast"); 1808ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftAngle); 1809ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddPlaceholderChunk("type"); 1810ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightAngle); 1811ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1812ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1813ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1814ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1815ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor } 1816c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor 1817c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // static_cast < type-id > ( expression ) 1818218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("static_cast"); 1819218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftAngle); 1820218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("type"); 1821218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightAngle); 1822218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1823218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1824218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1825218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1826d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor 1827c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // reinterpret_cast < type-id > ( expression ) 1828218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("reinterpret_cast"); 1829218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftAngle); 1830218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("type"); 1831218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightAngle); 1832218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1833218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1834218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1835218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1836d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor 1837c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // const_cast < type-id > ( expression ) 1838218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("const_cast"); 1839218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftAngle); 1840218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("type"); 1841218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightAngle); 1842218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1843218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1844218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1845218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1846d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor 18474e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (SemaRef.getLangOpts().RTTI) { 1848ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor // typeid ( expression-or-type ) 18498ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("std::type_info"); 1850ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddTypedTextChunk("typeid"); 1851ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1852ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddPlaceholderChunk("expression-or-type"); 1853ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1854ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1855ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor } 1856ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor 1857c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // new T ( ... ) 1858218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("new"); 1859218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1860218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("type"); 1861218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1862218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expressions"); 1863218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1864218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 186501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1866c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // new T [ ] ( ... ) 1867218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("new"); 1868218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1869218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("type"); 1870218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBracket); 1871218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("size"); 1872218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBracket); 1873218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1874218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expressions"); 1875218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1876218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 187701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1878c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // delete expression 18798ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("void"); 1880218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("delete"); 1881218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1882218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1883218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 188401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1885c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // delete [] expression 18868ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("void"); 1887218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("delete"); 1888218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1889218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBracket); 1890218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBracket); 1891218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1892218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1893218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1894c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor 18954e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (SemaRef.getLangOpts().CXXExceptions) { 1896ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor // throw expression 18978ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("void"); 1898ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddTypedTextChunk("throw"); 1899ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1900ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1901ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1902ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor } 1903a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor 190412e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor // FIXME: Rethrow? 1905a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor 19064e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (SemaRef.getLangOpts().CPlusPlus0x) { 1907a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor // nullptr 19088ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("std::nullptr_t"); 1909a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddTypedTextChunk("nullptr"); 1910a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1911a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor 1912a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor // alignof 19138ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("size_t"); 1914a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddTypedTextChunk("alignof"); 1915a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1916a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddPlaceholderChunk("type"); 1917a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1918a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1919a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor 1920a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor // noexcept 19218ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("bool"); 1922a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddTypedTextChunk("noexcept"); 1923a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1924a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1925a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1926a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1927a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor 1928a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor // sizeof... expression 19298ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("size_t"); 1930a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddTypedTextChunk("sizeof..."); 1931a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1932a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddPlaceholderChunk("parameter-pack"); 1933a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1934a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1935a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor } 193601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 193701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 19384e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (SemaRef.getLangOpts().ObjC1) { 193901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Add "super", if we're in an Objective-C class with a superclass. 1940681e256048cf9d3d226b9d0699f3df22c2500ef4Ted Kremenek if (ObjCMethodDecl *Method = SemaRef.getCurMethodDecl()) { 1941681e256048cf9d3d226b9d0699f3df22c2500ef4Ted Kremenek // The interface can be NULL. 1942681e256048cf9d3d226b9d0699f3df22c2500ef4Ted Kremenek if (ObjCInterfaceDecl *ID = Method->getClassInterface()) 19438ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor if (ID->getSuperClass()) { 19448ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor std::string SuperType; 19458ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor SuperType = ID->getSuperClass()->getNameAsString(); 19468ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor if (Method->isInstanceMethod()) 19478ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor SuperType += " *"; 19488ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor 19498ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk(Allocator.CopyString(SuperType)); 19508ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddTypedTextChunk("super"); 19518ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 19528ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor } 1953681e256048cf9d3d226b9d0699f3df22c2500ef4Ted Kremenek } 1954681e256048cf9d3d226b9d0699f3df22c2500ef4Ted Kremenek 1955bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCExpressionResults(Results, true); 195601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 195701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1958c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // sizeof expression 19598ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("size_t"); 1960218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("sizeof"); 1961218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1962218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression-or-type"); 1963218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1964218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 196501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 196686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 1967d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor 1968f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Type: 196968e3c2eef52701a178fbcc2bb424f31dd4b36931Douglas Gregor case Sema::PCC_LocalDeclarationSpecifiers: 1970d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor break; 197101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 197201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 19734e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (WantTypesInContext(CCC, SemaRef.getLangOpts())) 19744e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie AddTypeSpecifierResults(SemaRef.getLangOpts(), Results); 197501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 19764e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (SemaRef.getLangOpts().CPlusPlus && CCC != Sema::PCC_Type) 1977a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("operator")); 197886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 197986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 1980ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor/// \brief If the given declaration has an associated type, add it as a result 1981ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor/// type chunk. 1982ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregorstatic void AddResultTypeChunk(ASTContext &Context, 19838987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor const PrintingPolicy &Policy, 1984ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor NamedDecl *ND, 1985218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder &Result) { 1986ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor if (!ND) 1987ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor return; 19886f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 19896f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor // Skip constructors and conversion functions, which have their return types 19906f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor // built into their names. 19916f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor if (isa<CXXConstructorDecl>(ND) || isa<CXXConversionDecl>(ND)) 19926f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor return; 19936f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 1994ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor // Determine the type of the declaration (if it has a type). 19956f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor QualType T; 1996ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor if (FunctionDecl *Function = dyn_cast<FunctionDecl>(ND)) 1997ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor T = Function->getResultType(); 1998ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor else if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(ND)) 1999ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor T = Method->getResultType(); 2000ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor else if (FunctionTemplateDecl *FunTmpl = dyn_cast<FunctionTemplateDecl>(ND)) 2001ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor T = FunTmpl->getTemplatedDecl()->getResultType(); 2002ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor else if (EnumConstantDecl *Enumerator = dyn_cast<EnumConstantDecl>(ND)) 2003ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor T = Context.getTypeDeclType(cast<TypeDecl>(Enumerator->getDeclContext())); 2004ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor else if (isa<UnresolvedUsingValueDecl>(ND)) { 2005ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor /* Do nothing: ignore unresolved using declarations*/ 2006f85e193739c953358c865005855253af4f68a497John McCall } else if (ValueDecl *Value = dyn_cast<ValueDecl>(ND)) { 2007ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor T = Value->getType(); 2008f85e193739c953358c865005855253af4f68a497John McCall } else if (ObjCPropertyDecl *Property = dyn_cast<ObjCPropertyDecl>(ND)) 2009ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor T = Property->getType(); 2010ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor 2011ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor if (T.isNull() || Context.hasSameType(T, Context.DependentTy)) 2012ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor return; 2013ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor 20148987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor Result.AddResultTypeChunk(GetCompletionTypeString(T, Context, Policy, 2015a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor Result.getAllocator())); 2016ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor} 2017ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor 2018aaa107acc8f906203101af259e8d764b5027700aDouglas Gregorstatic void MaybeAddSentinel(ASTContext &Context, NamedDecl *FunctionOrMethod, 2019218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder &Result) { 2020aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor if (SentinelAttr *Sentinel = FunctionOrMethod->getAttr<SentinelAttr>()) 2021aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor if (Sentinel->getSentinel() == 0) { 20224e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (Context.getLangOpts().ObjC1 && 2023aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor Context.Idents.get("nil").hasMacroDefinition()) 2024218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddTextChunk(", nil"); 2025aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor else if (Context.Idents.get("NULL").hasMacroDefinition()) 2026218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddTextChunk(", NULL"); 2027aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor else 2028218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddTextChunk(", (void*)0"); 2029aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor } 2030aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor} 2031aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor 20326fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregorstatic std::string formatObjCParamQualifiers(unsigned ObjCQuals) { 20336fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor std::string Result; 20346fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor if (ObjCQuals & Decl::OBJC_TQ_In) 20356ef920976a86aa710ccfeeeb7e14e9b38aef5007Douglas Gregor Result += "in "; 20366fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor else if (ObjCQuals & Decl::OBJC_TQ_Inout) 20376ef920976a86aa710ccfeeeb7e14e9b38aef5007Douglas Gregor Result += "inout "; 20386fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor else if (ObjCQuals & Decl::OBJC_TQ_Out) 20396ef920976a86aa710ccfeeeb7e14e9b38aef5007Douglas Gregor Result += "out "; 20406fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor if (ObjCQuals & Decl::OBJC_TQ_Bycopy) 20416ef920976a86aa710ccfeeeb7e14e9b38aef5007Douglas Gregor Result += "bycopy "; 20426fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor else if (ObjCQuals & Decl::OBJC_TQ_Byref) 20436ef920976a86aa710ccfeeeb7e14e9b38aef5007Douglas Gregor Result += "byref "; 20446fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor if (ObjCQuals & Decl::OBJC_TQ_Oneway) 20456ef920976a86aa710ccfeeeb7e14e9b38aef5007Douglas Gregor Result += "oneway "; 20466fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor return Result; 20476fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor} 20486fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor 204983482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregorstatic std::string FormatFunctionParameter(ASTContext &Context, 20508987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor const PrintingPolicy &Policy, 2051aba480862485ea1140a81f25c23f43bb080edc90Douglas Gregor ParmVarDecl *Param, 2052ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor bool SuppressName = false, 2053ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor bool SuppressBlock = false) { 205483482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor bool ObjCMethodParam = isa<ObjCMethodDecl>(Param->getDeclContext()); 205583482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor if (Param->getType()->isDependentType() || 205683482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor !Param->getType()->isBlockPointerType()) { 205783482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor // The argument for a dependent or non-block parameter is a placeholder 205883482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor // containing that parameter's type. 205983482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor std::string Result; 206083482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor 2061aba480862485ea1140a81f25c23f43bb080edc90Douglas Gregor if (Param->getIdentifier() && !ObjCMethodParam && !SuppressName) 206283482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor Result = Param->getIdentifier()->getName(); 206383482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor 2064f85e193739c953358c865005855253af4f68a497John McCall Param->getType().getAsStringInternal(Result, Policy); 206583482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor 206683482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor if (ObjCMethodParam) { 20676fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor Result = "(" + formatObjCParamQualifiers(Param->getObjCDeclQualifier()) 20686fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor + Result + ")"; 2069aba480862485ea1140a81f25c23f43bb080edc90Douglas Gregor if (Param->getIdentifier() && !SuppressName) 207083482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor Result += Param->getIdentifier()->getName(); 207183482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor } 207283482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor return Result; 207383482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor } 207483482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor 207583482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor // The argument for a block pointer parameter is a block literal with 207683482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor // the appropriate type. 2077830072c2de881aadfe0f6efd3baccc9129a77e37Douglas Gregor FunctionTypeLoc *Block = 0; 2078830072c2de881aadfe0f6efd3baccc9129a77e37Douglas Gregor FunctionProtoTypeLoc *BlockProto = 0; 207983482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor TypeLoc TL; 208083482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor if (TypeSourceInfo *TSInfo = Param->getTypeSourceInfo()) { 208183482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor TL = TSInfo->getTypeLoc().getUnqualifiedLoc(); 208283482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor while (true) { 208383482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor // Look through typedefs. 2084ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor if (!SuppressBlock) { 2085ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor if (TypedefTypeLoc *TypedefTL = dyn_cast<TypedefTypeLoc>(&TL)) { 2086ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor if (TypeSourceInfo *InnerTSInfo 2087ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor = TypedefTL->getTypedefNameDecl()->getTypeSourceInfo()) { 2088ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor TL = InnerTSInfo->getTypeLoc().getUnqualifiedLoc(); 2089ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor continue; 2090ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor } 2091ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor } 2092ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor 2093ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor // Look through qualified types 2094ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor if (QualifiedTypeLoc *QualifiedTL = dyn_cast<QualifiedTypeLoc>(&TL)) { 2095ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor TL = QualifiedTL->getUnqualifiedLoc(); 209683482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor continue; 209783482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor } 209883482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor } 209983482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor 210083482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor // Try to get the function prototype behind the block pointer type, 210183482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor // then we're done. 210283482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor if (BlockPointerTypeLoc *BlockPtr 210383482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor = dyn_cast<BlockPointerTypeLoc>(&TL)) { 2104723df245307a530da5433dfb43accf187dc3e243Abramo Bagnara TL = BlockPtr->getPointeeLoc().IgnoreParens(); 2105830072c2de881aadfe0f6efd3baccc9129a77e37Douglas Gregor Block = dyn_cast<FunctionTypeLoc>(&TL); 2106830072c2de881aadfe0f6efd3baccc9129a77e37Douglas Gregor BlockProto = dyn_cast<FunctionProtoTypeLoc>(&TL); 210783482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor } 210883482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor break; 210983482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor } 211083482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor } 211183482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor 211283482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor if (!Block) { 211383482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor // We were unable to find a FunctionProtoTypeLoc with parameter names 211483482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor // for the block; just use the parameter type as a placeholder. 211583482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor std::string Result; 2116ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor if (!ObjCMethodParam && Param->getIdentifier()) 2117ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Result = Param->getIdentifier()->getName(); 2118ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor 2119f85e193739c953358c865005855253af4f68a497John McCall Param->getType().getUnqualifiedType().getAsStringInternal(Result, Policy); 212083482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor 212183482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor if (ObjCMethodParam) { 21226fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor Result = "(" + formatObjCParamQualifiers(Param->getObjCDeclQualifier()) 21236fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor + Result + ")"; 212483482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor if (Param->getIdentifier()) 212583482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor Result += Param->getIdentifier()->getName(); 212683482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor } 212783482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor 212883482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor return Result; 212983482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor } 2130ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor 213183482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor // We have the function prototype behind the block pointer type, as it was 213283482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor // written in the source. 2133382762582c8fcbc06b395a806fd57879381897a8Douglas Gregor std::string Result; 2134382762582c8fcbc06b395a806fd57879381897a8Douglas Gregor QualType ResultType = Block->getTypePtr()->getResultType(); 2135ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor if (!ResultType->isVoidType() || SuppressBlock) 2136f85e193739c953358c865005855253af4f68a497John McCall ResultType.getAsStringInternal(Result, Policy); 2137ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor 2138ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor // Format the parameter list. 2139ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor std::string Params; 2140830072c2de881aadfe0f6efd3baccc9129a77e37Douglas Gregor if (!BlockProto || Block->getNumArgs() == 0) { 2141830072c2de881aadfe0f6efd3baccc9129a77e37Douglas Gregor if (BlockProto && BlockProto->getTypePtr()->isVariadic()) 2142ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Params = "(...)"; 2143c2760bc8e99510c4b3848fcd21323afd711ee269Douglas Gregor else 2144ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Params = "(void)"; 2145382762582c8fcbc06b395a806fd57879381897a8Douglas Gregor } else { 2146ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Params += "("; 2147382762582c8fcbc06b395a806fd57879381897a8Douglas Gregor for (unsigned I = 0, N = Block->getNumArgs(); I != N; ++I) { 2148382762582c8fcbc06b395a806fd57879381897a8Douglas Gregor if (I) 2149ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Params += ", "; 2150ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Params += FormatFunctionParameter(Context, Policy, Block->getArg(I), 2151ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor /*SuppressName=*/false, 2152ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor /*SuppressBlock=*/true); 2153382762582c8fcbc06b395a806fd57879381897a8Douglas Gregor 2154830072c2de881aadfe0f6efd3baccc9129a77e37Douglas Gregor if (I == N - 1 && BlockProto->getTypePtr()->isVariadic()) 2155ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Params += ", ..."; 2156382762582c8fcbc06b395a806fd57879381897a8Douglas Gregor } 2157ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Params += ")"; 2158ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor } 2159ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor 2160ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor if (SuppressBlock) { 2161ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor // Format as a parameter. 2162ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Result = Result + " (^"; 2163ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor if (Param->getIdentifier()) 2164ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Result += Param->getIdentifier()->getName(); 2165382762582c8fcbc06b395a806fd57879381897a8Douglas Gregor Result += ")"; 2166ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Result += Params; 2167ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor } else { 2168ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor // Format as a block literal argument. 2169ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Result = '^' + Result; 2170ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Result += Params; 2171ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor 2172ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor if (Param->getIdentifier()) 2173ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Result += Param->getIdentifier()->getName(); 2174e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor } 2175382762582c8fcbc06b395a806fd57879381897a8Douglas Gregor 217683482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor return Result; 217783482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor} 217883482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor 217986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Add function parameter chunks to the given code completion string. 218086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorstatic void AddFunctionParameterChunks(ASTContext &Context, 21818987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor const PrintingPolicy &Policy, 218286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor FunctionDecl *Function, 2183218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder &Result, 2184218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor unsigned Start = 0, 2185218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor bool InOptional = false) { 2186218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor bool FirstParameter = true; 21870c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 2188218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor for (unsigned P = Start, N = Function->getNumParams(); P != N; ++P) { 218986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ParmVarDecl *Param = Function->getParamDecl(P); 219086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 2191218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor if (Param->hasDefaultArg() && !InOptional) { 219286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // When we see an optional default argument, put that argument and 219386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // the remaining default arguments into a new, optional string. 219428a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Opt(Result.getAllocator(), 219528a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis Result.getCodeCompletionTUInfo()); 2196218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor if (!FirstParameter) 21971eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Opt.AddChunk(CodeCompletionString::CK_Comma); 21988987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor AddFunctionParameterChunks(Context, Policy, Function, Opt, P, true); 2199218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddOptionalChunk(Opt.TakeString()); 2200218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor break; 220186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 220286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 2203218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor if (FirstParameter) 2204218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor FirstParameter = false; 2205218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor else 22061eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.AddChunk(CodeCompletionString::CK_Comma); 2207218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor 2208218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor InOptional = false; 220986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 221086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Format the placeholder string. 22118987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor std::string PlaceholderStr = FormatFunctionParameter(Context, Policy, 22128987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor Param); 221383482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor 2214e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor if (Function->isVariadic() && P == N - 1) 2215e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor PlaceholderStr += ", ..."; 2216e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor 221786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add the placeholder string. 2218dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddPlaceholderChunk( 2219dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.getAllocator().CopyString(PlaceholderStr)); 222086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 2221b3d4525c65cf456d3f1f4338afdcac83afc7be02Douglas Gregor 2222b3d4525c65cf456d3f1f4338afdcac83afc7be02Douglas Gregor if (const FunctionProtoType *Proto 2223b3d4525c65cf456d3f1f4338afdcac83afc7be02Douglas Gregor = Function->getType()->getAs<FunctionProtoType>()) 2224aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor if (Proto->isVariadic()) { 2225e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor if (Proto->getNumArgs() == 0) 2226218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddPlaceholderChunk("..."); 2227aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor 2228218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor MaybeAddSentinel(Context, Function, Result); 2229aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor } 223086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 223186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 223286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Add template parameter chunks to the given code completion string. 223386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorstatic void AddTemplateParameterChunks(ASTContext &Context, 22348987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor const PrintingPolicy &Policy, 223586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor TemplateDecl *Template, 2236218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder &Result, 2237218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor unsigned MaxParameters = 0, 2238218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor unsigned Start = 0, 2239218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor bool InDefaultArg = false) { 224086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool FirstParameter = true; 224186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 224286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor TemplateParameterList *Params = Template->getTemplateParameters(); 224386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor TemplateParameterList::iterator PEnd = Params->end(); 224486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (MaxParameters) 224586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PEnd = Params->begin() + MaxParameters; 2246218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor for (TemplateParameterList::iterator P = Params->begin() + Start; 2247218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor P != PEnd; ++P) { 224886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool HasDefaultArg = false; 224986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor std::string PlaceholderStr; 225086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(*P)) { 225186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (TTP->wasDeclaredWithTypename()) 225286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr = "typename"; 225386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor else 225486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr = "class"; 225586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 225686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (TTP->getIdentifier()) { 225786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr += ' '; 225886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr += TTP->getIdentifier()->getName(); 225986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 226086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 226186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor HasDefaultArg = TTP->hasDefaultArgument(); 226286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } else if (NonTypeTemplateParmDecl *NTTP 2263218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor = dyn_cast<NonTypeTemplateParmDecl>(*P)) { 226486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (NTTP->getIdentifier()) 226586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr = NTTP->getIdentifier()->getName(); 2266f85e193739c953358c865005855253af4f68a497John McCall NTTP->getType().getAsStringInternal(PlaceholderStr, Policy); 226786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor HasDefaultArg = NTTP->hasDefaultArgument(); 226886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } else { 226986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor assert(isa<TemplateTemplateParmDecl>(*P)); 227086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor TemplateTemplateParmDecl *TTP = cast<TemplateTemplateParmDecl>(*P); 227186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 227286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Since putting the template argument list into the placeholder would 227386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // be very, very long, we just use an abbreviation. 227486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr = "template<...> class"; 227586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (TTP->getIdentifier()) { 227686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr += ' '; 227786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr += TTP->getIdentifier()->getName(); 227886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 227986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 228086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor HasDefaultArg = TTP->hasDefaultArgument(); 228186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 228286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 2283218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor if (HasDefaultArg && !InDefaultArg) { 228486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // When we see an optional default argument, put that argument and 228586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // the remaining default arguments into a new, optional string. 228628a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Opt(Result.getAllocator(), 228728a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis Result.getCodeCompletionTUInfo()); 2288218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor if (!FirstParameter) 22891eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Opt.AddChunk(CodeCompletionString::CK_Comma); 22908987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor AddTemplateParameterChunks(Context, Policy, Template, Opt, MaxParameters, 2291218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor P - Params->begin(), true); 2292218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddOptionalChunk(Opt.TakeString()); 2293218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor break; 229486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 229586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 2296218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor InDefaultArg = false; 2297218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor 229886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (FirstParameter) 229986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor FirstParameter = false; 230086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor else 23011eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.AddChunk(CodeCompletionString::CK_Comma); 230286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 230386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add the placeholder string. 2304dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddPlaceholderChunk( 2305dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.getAllocator().CopyString(PlaceholderStr)); 230686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 230786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 230886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 2309b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor/// \brief Add a qualifier to the given code-completion string, if the 2310b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor/// provided nested-name-specifier is non-NULL. 2311a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregorstatic void 2312218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas GregorAddQualifierToCompletionString(CodeCompletionBuilder &Result, 2313a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor NestedNameSpecifier *Qualifier, 2314a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor bool QualifierIsInformative, 23158987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor ASTContext &Context, 23168987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor const PrintingPolicy &Policy) { 2317b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor if (!Qualifier) 2318b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor return; 2319b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor 2320b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor std::string PrintedNNS; 2321b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor { 2322b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor llvm::raw_string_ostream OS(PrintedNNS); 23238987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor Qualifier->print(OS, Policy); 2324b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor } 23250563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor if (QualifierIsInformative) 2326dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddInformativeChunk(Result.getAllocator().CopyString(PrintedNNS)); 23270563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor else 2328dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTextChunk(Result.getAllocator().CopyString(PrintedNNS)); 2329b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor} 2330b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor 2331218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregorstatic void 2332218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas GregorAddFunctionTypeQualsToCompletionString(CodeCompletionBuilder &Result, 2333218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor FunctionDecl *Function) { 2334a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor const FunctionProtoType *Proto 2335a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor = Function->getType()->getAs<FunctionProtoType>(); 2336a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor if (!Proto || !Proto->getTypeQuals()) 2337a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor return; 2338a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor 2339a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor // FIXME: Add ref-qualifier! 2340a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor 2341a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor // Handle single qualifiers without copying 2342a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor if (Proto->getTypeQuals() == Qualifiers::Const) { 2343a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor Result.AddInformativeChunk(" const"); 2344a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor return; 2345a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor } 2346a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor 2347a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor if (Proto->getTypeQuals() == Qualifiers::Volatile) { 2348a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor Result.AddInformativeChunk(" volatile"); 2349a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor return; 2350a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor } 2351a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor 2352a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor if (Proto->getTypeQuals() == Qualifiers::Restrict) { 2353a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor Result.AddInformativeChunk(" restrict"); 2354a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor return; 2355a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor } 2356a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor 2357a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor // Handle multiple qualifiers. 2358a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor std::string QualsStr; 2359a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor if (Proto->getTypeQuals() & Qualifiers::Const) 2360a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor QualsStr += " const"; 2361a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor if (Proto->getTypeQuals() & Qualifiers::Volatile) 2362a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor QualsStr += " volatile"; 2363a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor if (Proto->getTypeQuals() & Qualifiers::Restrict) 2364a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor QualsStr += " restrict"; 2365dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddInformativeChunk(Result.getAllocator().CopyString(QualsStr)); 2366a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor} 2367a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor 23686f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor/// \brief Add the name of the given declaration 23698987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregorstatic void AddTypedNameChunk(ASTContext &Context, const PrintingPolicy &Policy, 23708987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor NamedDecl *ND, CodeCompletionBuilder &Result) { 23716f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor DeclarationName Name = ND->getDeclName(); 23726f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor if (!Name) 23736f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor return; 23746f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 23756f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor switch (Name.getNameKind()) { 2376a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor case DeclarationName::CXXOperatorName: { 2377a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor const char *OperatorName = 0; 2378a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor switch (Name.getCXXOverloadedOperator()) { 2379a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor case OO_None: 2380a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor case OO_Conditional: 2381a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor case NUM_OVERLOADED_OPERATORS: 2382a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor OperatorName = "operator"; 2383a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor break; 2384a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor 2385a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 2386a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor case OO_##Name: OperatorName = "operator" Spelling; break; 2387a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor#define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly) 2388a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor#include "clang/Basic/OperatorKinds.def" 2389a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor 2390a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor case OO_New: OperatorName = "operator new"; break; 2391a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor case OO_Delete: OperatorName = "operator delete"; break; 2392a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor case OO_Array_New: OperatorName = "operator new[]"; break; 2393a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor case OO_Array_Delete: OperatorName = "operator delete[]"; break; 2394a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor case OO_Call: OperatorName = "operator()"; break; 2395a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor case OO_Subscript: OperatorName = "operator[]"; break; 2396a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor } 2397a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor Result.AddTypedTextChunk(OperatorName); 2398a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor break; 2399a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor } 2400a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor 24016f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case DeclarationName::Identifier: 24026f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case DeclarationName::CXXConversionFunctionName: 24036f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case DeclarationName::CXXDestructorName: 24046f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case DeclarationName::CXXLiteralOperatorName: 2405dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTypedTextChunk( 2406dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.getAllocator().CopyString(ND->getNameAsString())); 24076f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor break; 24086f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 24096f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case DeclarationName::CXXUsingDirective: 24106f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case DeclarationName::ObjCZeroArgSelector: 24116f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case DeclarationName::ObjCOneArgSelector: 24126f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case DeclarationName::ObjCMultiArgSelector: 24136f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor break; 24146f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 24156f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case DeclarationName::CXXConstructorName: { 24166f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor CXXRecordDecl *Record = 0; 24176f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor QualType Ty = Name.getCXXNameType(); 24186f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor if (const RecordType *RecordTy = Ty->getAs<RecordType>()) 24196f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor Record = cast<CXXRecordDecl>(RecordTy->getDecl()); 24206f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor else if (const InjectedClassNameType *InjectedTy 24216f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor = Ty->getAs<InjectedClassNameType>()) 24226f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor Record = InjectedTy->getDecl(); 24236f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor else { 2424dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTypedTextChunk( 2425dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.getAllocator().CopyString(ND->getNameAsString())); 24266f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor break; 24276f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor } 24286f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 2429dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTypedTextChunk( 2430dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.getAllocator().CopyString(Record->getNameAsString())); 24316f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor if (ClassTemplateDecl *Template = Record->getDescribedClassTemplate()) { 24321eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.AddChunk(CodeCompletionString::CK_LeftAngle); 24338987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor AddTemplateParameterChunks(Context, Policy, Template, Result); 24341eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.AddChunk(CodeCompletionString::CK_RightAngle); 24356f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor } 24366f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor break; 24376f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor } 24386f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor } 24396f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor} 24406f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 2441ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios KyrtzidisCodeCompletionString *CodeCompletionResult::CreateCodeCompletionString(Sema &S, 244228a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionAllocator &Allocator, 244328a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionTUInfo &CCTUInfo) { 244428a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis return CreateCodeCompletionString(S.Context, S.PP, Allocator, CCTUInfo); 2445ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis} 2446ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis 244786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief If possible, create a new code completion string for the given 244886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// result. 244986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// 245086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \returns Either a new, heap-allocated code completion string describing 245186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// how to use this result, or NULL to indicate that the string or name of the 245286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// result is all that is needed. 245386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas GregorCodeCompletionString * 2454ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios KyrtzidisCodeCompletionResult::CreateCodeCompletionString(ASTContext &Ctx, 2455ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis Preprocessor &PP, 245628a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionAllocator &Allocator, 245728a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionTUInfo &CCTUInfo) { 245828a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Result(Allocator, CCTUInfo, Priority, Availability); 24590c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 2460ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis PrintingPolicy Policy = getCompletionPrintingPolicy(Ctx, PP); 2461218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor if (Kind == RK_Pattern) { 2462218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Pattern->Priority = Priority; 2463218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Pattern->Availability = Availability; 2464ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor 2465ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor if (Declaration) { 2466ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor Result.addParentContext(Declaration->getDeclContext()); 2467ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor Pattern->ParentKind = Result.getParentKind(); 2468ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor Pattern->ParentName = Result.getParentName(); 2469ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor } 2470ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor 2471218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Pattern; 2472218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor } 24732b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 24742b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor if (Kind == RK_Keyword) { 2475218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddTypedTextChunk(Keyword); 2476218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Result.TakeString(); 24772b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor } 247886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 24793f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor if (Kind == RK_Macro) { 2480ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis MacroInfo *MI = PP.getMacroInfo(Macro); 24812b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor assert(MI && "Not a macro?"); 24822b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 2483dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTypedTextChunk( 2484dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.getAllocator().CopyString(Macro->getName())); 24852b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 24862b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor if (!MI->isFunctionLike()) 2487218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Result.TakeString(); 24883f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor 24893f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor // Format a function-like macro with placeholders for the arguments. 24901eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.AddChunk(CodeCompletionString::CK_LeftParen); 2491e42447021239015db97202fb04c304d82e84135fDouglas Gregor MacroInfo::arg_iterator A = MI->arg_begin(), AEnd = MI->arg_end(); 2492c8dc1352071575c36401158094a865ad682fb886Douglas Gregor 2493c8dc1352071575c36401158094a865ad682fb886Douglas Gregor // C99 variadic macros add __VA_ARGS__ at the end. Skip it. 2494c8dc1352071575c36401158094a865ad682fb886Douglas Gregor if (MI->isC99Varargs()) { 2495c8dc1352071575c36401158094a865ad682fb886Douglas Gregor --AEnd; 2496c8dc1352071575c36401158094a865ad682fb886Douglas Gregor 2497c8dc1352071575c36401158094a865ad682fb886Douglas Gregor if (A == AEnd) { 2498c8dc1352071575c36401158094a865ad682fb886Douglas Gregor Result.AddPlaceholderChunk("..."); 2499c8dc1352071575c36401158094a865ad682fb886Douglas Gregor } 2500e42447021239015db97202fb04c304d82e84135fDouglas Gregor } 2501c8dc1352071575c36401158094a865ad682fb886Douglas Gregor 2502e42447021239015db97202fb04c304d82e84135fDouglas Gregor for (MacroInfo::arg_iterator A = MI->arg_begin(); A != AEnd; ++A) { 25033f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor if (A != MI->arg_begin()) 25041eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.AddChunk(CodeCompletionString::CK_Comma); 2505c8dc1352071575c36401158094a865ad682fb886Douglas Gregor 2506c8dc1352071575c36401158094a865ad682fb886Douglas Gregor if (MI->isVariadic() && (A+1) == AEnd) { 2507f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith SmallString<32> Arg = (*A)->getName(); 2508c8dc1352071575c36401158094a865ad682fb886Douglas Gregor if (MI->isC99Varargs()) 2509c8dc1352071575c36401158094a865ad682fb886Douglas Gregor Arg += ", ..."; 2510c8dc1352071575c36401158094a865ad682fb886Douglas Gregor else 2511c8dc1352071575c36401158094a865ad682fb886Douglas Gregor Arg += "..."; 2512dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddPlaceholderChunk(Result.getAllocator().CopyString(Arg)); 2513c8dc1352071575c36401158094a865ad682fb886Douglas Gregor break; 25143f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor } 2515c8dc1352071575c36401158094a865ad682fb886Douglas Gregor 2516c8dc1352071575c36401158094a865ad682fb886Douglas Gregor // Non-variadic macros are simple. 2517c8dc1352071575c36401158094a865ad682fb886Douglas Gregor Result.AddPlaceholderChunk( 2518c8dc1352071575c36401158094a865ad682fb886Douglas Gregor Result.getAllocator().CopyString((*A)->getName())); 2519e42447021239015db97202fb04c304d82e84135fDouglas Gregor } 25201eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.AddChunk(CodeCompletionString::CK_RightParen); 2521218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Result.TakeString(); 25223f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor } 25233f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor 2524d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor assert(Kind == RK_Declaration && "Missed a result kind?"); 252586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NamedDecl *ND = Declaration; 2526ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor Result.addParentContext(ND->getDeclContext()); 2527ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor 25280c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor if (StartsNestedNameSpecifier) { 2529dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTypedTextChunk( 2530dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.getAllocator().CopyString(ND->getNameAsString())); 2531218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddTextChunk("::"); 2532218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Result.TakeString(); 25330c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor } 25346164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen 25356164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen for (Decl::attr_iterator i = ND->attr_begin(); i != ND->attr_end(); ++i) { 25366164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen if (AnnotateAttr *Attr = dyn_cast_or_null<AnnotateAttr>(*i)) { 25376164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen Result.AddAnnotation(Result.getAllocator().CopyString(Attr->getAnnotation())); 25386164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen } 25396164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen } 25400c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 2541ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis AddResultTypeChunk(Ctx, Policy, ND, Result); 2542ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor 254386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (FunctionDecl *Function = dyn_cast<FunctionDecl>(ND)) { 25440563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative, 2545ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis Ctx, Policy); 2546ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis AddTypedNameChunk(Ctx, Policy, ND, Result); 25471eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.AddChunk(CodeCompletionString::CK_LeftParen); 2548ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis AddFunctionParameterChunks(Ctx, Policy, Function, Result); 25491eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.AddChunk(CodeCompletionString::CK_RightParen); 2550a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor AddFunctionTypeQualsToCompletionString(Result, Function); 2551218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Result.TakeString(); 255286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 255386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 255486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (FunctionTemplateDecl *FunTmpl = dyn_cast<FunctionTemplateDecl>(ND)) { 25550563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative, 2556ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis Ctx, Policy); 255786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor FunctionDecl *Function = FunTmpl->getTemplatedDecl(); 2558ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis AddTypedNameChunk(Ctx, Policy, Function, Result); 25596f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 256086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Figure out which template parameters are deduced (or have default 256186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // arguments). 2562013b3668b67c8cb3ad2ee516c5607a3eba11829fBenjamin Kramer llvm::SmallBitVector Deduced; 2563ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis Sema::MarkDeducedTemplateParameters(Ctx, FunTmpl, Deduced); 256486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor unsigned LastDeducibleArgument; 256586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor for (LastDeducibleArgument = Deduced.size(); LastDeducibleArgument > 0; 256686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor --LastDeducibleArgument) { 256786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!Deduced[LastDeducibleArgument - 1]) { 256886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // C++0x: Figure out if the template argument has a default. If so, 256986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // the user doesn't need to type this argument. 257086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // FIXME: We need to abstract template parameters better! 257186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool HasDefaultArg = false; 257286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NamedDecl *Param = FunTmpl->getTemplateParameters()->getParam( 2573218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor LastDeducibleArgument - 1); 257486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(Param)) 257586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor HasDefaultArg = TTP->hasDefaultArgument(); 257686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor else if (NonTypeTemplateParmDecl *NTTP 257786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor = dyn_cast<NonTypeTemplateParmDecl>(Param)) 257886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor HasDefaultArg = NTTP->hasDefaultArgument(); 257986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor else { 258086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor assert(isa<TemplateTemplateParmDecl>(Param)); 258186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor HasDefaultArg 25820c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor = cast<TemplateTemplateParmDecl>(Param)->hasDefaultArgument(); 258386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 258486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 258586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!HasDefaultArg) 258686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor break; 258786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 258886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 258986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 259086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (LastDeducibleArgument) { 259186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Some of the function template arguments cannot be deduced from a 259286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // function call, so we introduce an explicit template argument list 259386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // containing all of the arguments up to the first deducible argument. 25941eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.AddChunk(CodeCompletionString::CK_LeftAngle); 2595ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis AddTemplateParameterChunks(Ctx, Policy, FunTmpl, Result, 259686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor LastDeducibleArgument); 25971eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.AddChunk(CodeCompletionString::CK_RightAngle); 259886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 259986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 260086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add the function parameters 26011eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.AddChunk(CodeCompletionString::CK_LeftParen); 2602ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis AddFunctionParameterChunks(Ctx, Policy, Function, Result); 26031eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.AddChunk(CodeCompletionString::CK_RightParen); 2604a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor AddFunctionTypeQualsToCompletionString(Result, Function); 2605218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Result.TakeString(); 260686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 260786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 260886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (TemplateDecl *Template = dyn_cast<TemplateDecl>(ND)) { 26090563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative, 2610ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis Ctx, Policy); 2611dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTypedTextChunk( 2612dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.getAllocator().CopyString(Template->getNameAsString())); 26131eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.AddChunk(CodeCompletionString::CK_LeftAngle); 2614ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis AddTemplateParameterChunks(Ctx, Policy, Template, Result); 26151eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.AddChunk(CodeCompletionString::CK_RightAngle); 2616218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Result.TakeString(); 261786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 261886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 26199630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(ND)) { 26209630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor Selector Sel = Method->getSelector(); 26219630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor if (Sel.isUnarySelector()) { 2622dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTypedTextChunk(Result.getAllocator().CopyString( 2623813d8346529bf094eb2b249648906ba7fd226688Douglas Gregor Sel.getNameForSlot(0))); 2624218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Result.TakeString(); 26259630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor } 26269630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor 2627813d8346529bf094eb2b249648906ba7fd226688Douglas Gregor std::string SelName = Sel.getNameForSlot(0).str(); 2628d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor SelName += ':'; 2629d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor if (StartParameter == 0) 2630dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTypedTextChunk(Result.getAllocator().CopyString(SelName)); 2631d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor else { 2632dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddInformativeChunk(Result.getAllocator().CopyString(SelName)); 2633d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor 2634d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor // If there is only one parameter, and we're past it, add an empty 2635d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor // typed-text chunk since there is nothing to type. 2636d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor if (Method->param_size() == 1) 2637218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddTypedTextChunk(""); 2638d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor } 26399630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor unsigned Idx = 0; 26409630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor for (ObjCMethodDecl::param_iterator P = Method->param_begin(), 26419630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor PEnd = Method->param_end(); 26429630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor P != PEnd; (void)++P, ++Idx) { 26439630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor if (Idx > 0) { 2644d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor std::string Keyword; 2645d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor if (Idx > StartParameter) 2646218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(CodeCompletionString::CK_HorizontalSpace); 26479630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor if (IdentifierInfo *II = Sel.getIdentifierInfoForSlot(Idx)) 2648a0651c5f5d1c8928d3ae062435ed9cf0aa0d04baBenjamin Kramer Keyword += II->getName(); 26499630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor Keyword += ":"; 26501f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor if (Idx < StartParameter || AllParametersAreInformative) 2651dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddInformativeChunk(Result.getAllocator().CopyString(Keyword)); 2652c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor else 2653dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTypedTextChunk(Result.getAllocator().CopyString(Keyword)); 26549630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor } 2655d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor 2656d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor // If we're before the starting parameter, skip the placeholder. 2657d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor if (Idx < StartParameter) 2658d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor continue; 26599630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor 26609630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor std::string Arg; 266183482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor 266283482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor if ((*P)->getType()->isBlockPointerType() && !DeclaringEntity) 2663ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis Arg = FormatFunctionParameter(Ctx, Policy, *P, true); 266483482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor else { 2665f85e193739c953358c865005855253af4f68a497John McCall (*P)->getType().getAsStringInternal(Arg, Policy); 26666fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor Arg = "(" + formatObjCParamQualifiers((*P)->getObjCDeclQualifier()) 26676fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor + Arg + ")"; 266883482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor if (IdentifierInfo *II = (*P)->getIdentifier()) 2669aba480862485ea1140a81f25c23f43bb080edc90Douglas Gregor if (DeclaringEntity || AllParametersAreInformative) 2670a0651c5f5d1c8928d3ae062435ed9cf0aa0d04baBenjamin Kramer Arg += II->getName(); 267183482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor } 267283482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor 2673e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor if (Method->isVariadic() && (P + 1) == PEnd) 2674e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor Arg += ", ..."; 2675e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor 26761f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor if (DeclaringEntity) 2677dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTextChunk(Result.getAllocator().CopyString(Arg)); 26781f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor else if (AllParametersAreInformative) 2679dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddInformativeChunk(Result.getAllocator().CopyString(Arg)); 26804ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor else 2681dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddPlaceholderChunk(Result.getAllocator().CopyString(Arg)); 26829630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor } 26839630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor 26842a17af0c7e05500e25d4cc71341f1f232085ebeaDouglas Gregor if (Method->isVariadic()) { 2685e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor if (Method->param_size() == 0) { 2686e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor if (DeclaringEntity) 2687218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddTextChunk(", ..."); 2688e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor else if (AllParametersAreInformative) 2689218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddInformativeChunk(", ..."); 2690e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor else 2691218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddPlaceholderChunk(", ..."); 2692e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor } 2693aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor 2694ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis MaybeAddSentinel(Ctx, Method, Result); 26952a17af0c7e05500e25d4cc71341f1f232085ebeaDouglas Gregor } 26962a17af0c7e05500e25d4cc71341f1f232085ebeaDouglas Gregor 2697218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Result.TakeString(); 26989630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor } 26999630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor 27002b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor if (Qualifier) 27010563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative, 2702ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis Ctx, Policy); 27032b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 2704dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTypedTextChunk( 2705dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.getAllocator().CopyString(ND->getNameAsString())); 2706218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Result.TakeString(); 270786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 270886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 270986d802e03a267af79663990c39865c67e0645238Douglas GregorCodeCompletionString * 271086d802e03a267af79663990c39865c67e0645238Douglas GregorCodeCompleteConsumer::OverloadCandidate::CreateSignatureString( 271186d802e03a267af79663990c39865c67e0645238Douglas Gregor unsigned CurrentArg, 271232be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor Sema &S, 271328a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionAllocator &Allocator, 271428a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionTUInfo &CCTUInfo) const { 27158987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor PrintingPolicy Policy = getCompletionPrintingPolicy(S); 2716f85e193739c953358c865005855253af4f68a497John McCall 2717218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor // FIXME: Set priority, availability appropriately. 271828a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Result(Allocator,CCTUInfo, 1, CXAvailability_Available); 271986d802e03a267af79663990c39865c67e0645238Douglas Gregor FunctionDecl *FDecl = getFunction(); 27208987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor AddResultTypeChunk(S.Context, Policy, FDecl, Result); 272186d802e03a267af79663990c39865c67e0645238Douglas Gregor const FunctionProtoType *Proto 272286d802e03a267af79663990c39865c67e0645238Douglas Gregor = dyn_cast<FunctionProtoType>(getFunctionType()); 272386d802e03a267af79663990c39865c67e0645238Douglas Gregor if (!FDecl && !Proto) { 272486d802e03a267af79663990c39865c67e0645238Douglas Gregor // Function without a prototype. Just give the return type and a 272586d802e03a267af79663990c39865c67e0645238Douglas Gregor // highlighted ellipsis. 272686d802e03a267af79663990c39865c67e0645238Douglas Gregor const FunctionType *FT = getFunctionType(); 2727a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor Result.AddTextChunk(GetCompletionTypeString(FT->getResultType(), 27288987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor S.Context, Policy, 2729a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor Result.getAllocator())); 27301eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.AddChunk(CodeCompletionString::CK_LeftParen); 27311eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.AddChunk(CodeCompletionString::CK_CurrentParameter, "..."); 27321eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.AddChunk(CodeCompletionString::CK_RightParen); 2733218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Result.TakeString(); 273486d802e03a267af79663990c39865c67e0645238Douglas Gregor } 273586d802e03a267af79663990c39865c67e0645238Douglas Gregor 273686d802e03a267af79663990c39865c67e0645238Douglas Gregor if (FDecl) 2737dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTextChunk( 2738dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.getAllocator().CopyString(FDecl->getNameAsString())); 273986d802e03a267af79663990c39865c67e0645238Douglas Gregor else 2740218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddTextChunk( 2741dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.getAllocator().CopyString( 2742f85e193739c953358c865005855253af4f68a497John McCall Proto->getResultType().getAsString(Policy))); 274386d802e03a267af79663990c39865c67e0645238Douglas Gregor 27441eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.AddChunk(CodeCompletionString::CK_LeftParen); 274586d802e03a267af79663990c39865c67e0645238Douglas Gregor unsigned NumParams = FDecl? FDecl->getNumParams() : Proto->getNumArgs(); 274686d802e03a267af79663990c39865c67e0645238Douglas Gregor for (unsigned I = 0; I != NumParams; ++I) { 274786d802e03a267af79663990c39865c67e0645238Douglas Gregor if (I) 27481eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.AddChunk(CodeCompletionString::CK_Comma); 274986d802e03a267af79663990c39865c67e0645238Douglas Gregor 275086d802e03a267af79663990c39865c67e0645238Douglas Gregor std::string ArgString; 275186d802e03a267af79663990c39865c67e0645238Douglas Gregor QualType ArgType; 275286d802e03a267af79663990c39865c67e0645238Douglas Gregor 275386d802e03a267af79663990c39865c67e0645238Douglas Gregor if (FDecl) { 275486d802e03a267af79663990c39865c67e0645238Douglas Gregor ArgString = FDecl->getParamDecl(I)->getNameAsString(); 275586d802e03a267af79663990c39865c67e0645238Douglas Gregor ArgType = FDecl->getParamDecl(I)->getOriginalType(); 275686d802e03a267af79663990c39865c67e0645238Douglas Gregor } else { 275786d802e03a267af79663990c39865c67e0645238Douglas Gregor ArgType = Proto->getArgType(I); 275886d802e03a267af79663990c39865c67e0645238Douglas Gregor } 275986d802e03a267af79663990c39865c67e0645238Douglas Gregor 2760f85e193739c953358c865005855253af4f68a497John McCall ArgType.getAsStringInternal(ArgString, Policy); 276186d802e03a267af79663990c39865c67e0645238Douglas Gregor 276286d802e03a267af79663990c39865c67e0645238Douglas Gregor if (I == CurrentArg) 27631eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.AddChunk(CodeCompletionString::CK_CurrentParameter, 27641eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.getAllocator().CopyString(ArgString)); 276586d802e03a267af79663990c39865c67e0645238Douglas Gregor else 2766dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTextChunk(Result.getAllocator().CopyString(ArgString)); 276786d802e03a267af79663990c39865c67e0645238Douglas Gregor } 276886d802e03a267af79663990c39865c67e0645238Douglas Gregor 276986d802e03a267af79663990c39865c67e0645238Douglas Gregor if (Proto && Proto->isVariadic()) { 27701eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.AddChunk(CodeCompletionString::CK_Comma); 277186d802e03a267af79663990c39865c67e0645238Douglas Gregor if (CurrentArg < NumParams) 2772218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddTextChunk("..."); 277386d802e03a267af79663990c39865c67e0645238Douglas Gregor else 27741eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.AddChunk(CodeCompletionString::CK_CurrentParameter, "..."); 277586d802e03a267af79663990c39865c67e0645238Douglas Gregor } 27761eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Result.AddChunk(CodeCompletionString::CK_RightParen); 277786d802e03a267af79663990c39865c67e0645238Douglas Gregor 2778218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Result.TakeString(); 277986d802e03a267af79663990c39865c67e0645238Douglas Gregor} 278086d802e03a267af79663990c39865c67e0645238Douglas Gregor 27815f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerunsigned clang::getMacroUsagePriority(StringRef MacroName, 2782b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor const LangOptions &LangOpts, 27831827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor bool PreferredTypeIsPointer) { 27841827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor unsigned Priority = CCP_Macro; 27851827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor 2786b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor // Treat the "nil", "Nil" and "NULL" macros as null pointer constants. 2787b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor if (MacroName.equals("nil") || MacroName.equals("NULL") || 2788b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor MacroName.equals("Nil")) { 27891827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor Priority = CCP_Constant; 27901827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor if (PreferredTypeIsPointer) 27911827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor Priority = Priority / CCF_SimilarTypeMatch; 2792b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor } 2793b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor // Treat "YES", "NO", "true", and "false" as constants. 2794b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor else if (MacroName.equals("YES") || MacroName.equals("NO") || 2795b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor MacroName.equals("true") || MacroName.equals("false")) 2796b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor Priority = CCP_Constant; 2797b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor // Treat "bool" as a type. 2798b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor else if (MacroName.equals("bool")) 2799b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor Priority = CCP_Type + (LangOpts.ObjC1? CCD_bool_in_ObjC : 0); 2800b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor 28011827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor 28021827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor return Priority; 28031827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor} 28041827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor 2805e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas GregorCXCursorKind clang::getCursorKindForDecl(Decl *D) { 2806e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor if (!D) 2807e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor return CXCursor_UnexposedDecl; 2808e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor 2809e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor switch (D->getKind()) { 2810e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::Enum: return CXCursor_EnumDecl; 2811e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::EnumConstant: return CXCursor_EnumConstantDecl; 2812e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::Field: return CXCursor_FieldDecl; 2813e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::Function: 2814e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor return CXCursor_FunctionDecl; 2815e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::ObjCCategory: return CXCursor_ObjCCategoryDecl; 2816e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::ObjCCategoryImpl: return CXCursor_ObjCCategoryImplDecl; 2817e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::ObjCImplementation: return CXCursor_ObjCImplementationDecl; 2818375bb1413c041055262c8a416f20d10474a5eda9Douglas Gregor 2819c15707d8da08df2eb22f6ed047743fa3f7c9831bArgyrios Kyrtzidis case Decl::ObjCInterface: return CXCursor_ObjCInterfaceDecl; 2820e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::ObjCIvar: return CXCursor_ObjCIvarDecl; 2821e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::ObjCMethod: 2822e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor return cast<ObjCMethodDecl>(D)->isInstanceMethod() 2823e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor ? CXCursor_ObjCInstanceMethodDecl : CXCursor_ObjCClassMethodDecl; 2824e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::CXXMethod: return CXCursor_CXXMethod; 2825e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::CXXConstructor: return CXCursor_Constructor; 2826e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::CXXDestructor: return CXCursor_Destructor; 2827e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::CXXConversion: return CXCursor_ConversionFunction; 2828e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::ObjCProperty: return CXCursor_ObjCPropertyDecl; 2829c15707d8da08df2eb22f6ed047743fa3f7c9831bArgyrios Kyrtzidis case Decl::ObjCProtocol: return CXCursor_ObjCProtocolDecl; 2830e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::ParmVar: return CXCursor_ParmDecl; 2831e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::Typedef: return CXCursor_TypedefDecl; 2832162e1c1b487352434552147967c3dd296ebee2f7Richard Smith case Decl::TypeAlias: return CXCursor_TypeAliasDecl; 2833e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::Var: return CXCursor_VarDecl; 2834e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::Namespace: return CXCursor_Namespace; 2835e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::NamespaceAlias: return CXCursor_NamespaceAlias; 2836e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::TemplateTypeParm: return CXCursor_TemplateTypeParameter; 2837e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::NonTypeTemplateParm:return CXCursor_NonTypeTemplateParameter; 2838e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::TemplateTemplateParm:return CXCursor_TemplateTemplateParameter; 2839e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::FunctionTemplate: return CXCursor_FunctionTemplate; 2840e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::ClassTemplate: return CXCursor_ClassTemplate; 28412dfdb948bef51a601e763191e4becfe59880d382Argyrios Kyrtzidis case Decl::AccessSpec: return CXCursor_CXXAccessSpecifier; 2842e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::ClassTemplatePartialSpecialization: 2843e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor return CXCursor_ClassTemplatePartialSpecialization; 2844e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::UsingDirective: return CXCursor_UsingDirective; 28458e5900c8e9bd32bcc385124f564f3d38a11d0e28Douglas Gregor case Decl::TranslationUnit: return CXCursor_TranslationUnit; 2846e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor 2847e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::Using: 2848e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::UnresolvedUsingValue: 2849e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::UnresolvedUsingTypename: 2850e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor return CXCursor_UsingDeclaration; 2851e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor 2852352697a87bca664356f21a838b162084013625eaDouglas Gregor case Decl::ObjCPropertyImpl: 2853352697a87bca664356f21a838b162084013625eaDouglas Gregor switch (cast<ObjCPropertyImplDecl>(D)->getPropertyImplementation()) { 2854352697a87bca664356f21a838b162084013625eaDouglas Gregor case ObjCPropertyImplDecl::Dynamic: 2855352697a87bca664356f21a838b162084013625eaDouglas Gregor return CXCursor_ObjCDynamicDecl; 2856352697a87bca664356f21a838b162084013625eaDouglas Gregor 2857352697a87bca664356f21a838b162084013625eaDouglas Gregor case ObjCPropertyImplDecl::Synthesize: 2858352697a87bca664356f21a838b162084013625eaDouglas Gregor return CXCursor_ObjCSynthesizeDecl; 2859352697a87bca664356f21a838b162084013625eaDouglas Gregor } 2860352697a87bca664356f21a838b162084013625eaDouglas Gregor 2861e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor default: 2862e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor if (TagDecl *TD = dyn_cast<TagDecl>(D)) { 2863e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor switch (TD->getTagKind()) { 2864e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case TTK_Struct: return CXCursor_StructDecl; 2865e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case TTK_Class: return CXCursor_ClassDecl; 2866e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case TTK_Union: return CXCursor_UnionDecl; 2867e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case TTK_Enum: return CXCursor_EnumDecl; 2868e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor } 2869e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor } 2870e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor } 2871e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor 2872e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor return CXCursor_UnexposedDecl; 2873e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor} 2874e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor 2875590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregorstatic void AddMacroResults(Preprocessor &PP, ResultBuilder &Results, 2876590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregor bool TargetTypeIsPointer = false) { 28770a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 2878590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregor 28793f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor Results.EnterNewScope(); 2880c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor 28810c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor for (Preprocessor::macro_iterator M = PP.macro_begin(), 28820c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor MEnd = PP.macro_end(); 2883590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregor M != MEnd; ++M) { 28841827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor Results.AddResult(Result(M->first, 28851827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor getMacroUsagePriority(M->first->getName(), 28864e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie PP.getLangOpts(), 28871827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor TargetTypeIsPointer))); 2888590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregor } 2889c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor 28903f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor Results.ExitScope(); 2891c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor 28923f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor} 28933f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor 2894aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregorstatic void AddPrettyFunctionResults(const LangOptions &LangOpts, 2895aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor ResultBuilder &Results) { 28960a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 2897aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor 2898aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor Results.EnterNewScope(); 2899c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor 2900aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor Results.AddResult(Result("__PRETTY_FUNCTION__", CCP_Constant)); 2901aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor Results.AddResult(Result("__FUNCTION__", CCP_Constant)); 2902aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor if (LangOpts.C99 || LangOpts.CPlusPlus0x) 2903aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor Results.AddResult(Result("__func__", CCP_Constant)); 2904aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor Results.ExitScope(); 2905aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor} 2906aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor 29073a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbarstatic void HandleCodeCompleteResults(Sema *S, 29083a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar CodeCompleteConsumer *CodeCompleter, 2909e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext Context, 29100a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall CodeCompletionResult *Results, 2911e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor unsigned NumResults) { 291286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (CodeCompleter) 2913e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompleter->ProcessCodeCompleteResults(*S, Context, Results, NumResults); 291486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 291586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 2916e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregorstatic enum CodeCompletionContext::Kind mapCodeCompletionContext(Sema &S, 2917e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Sema::ParserCompletionContext PCC) { 2918e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor switch (PCC) { 2919f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Namespace: 2920e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor return CodeCompletionContext::CCC_TopLevel; 2921e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor 2922f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Class: 2923e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor return CodeCompletionContext::CCC_ClassStructUnion; 2924e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor 2925f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ObjCInterface: 2926e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor return CodeCompletionContext::CCC_ObjCInterface; 2927e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor 2928f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ObjCImplementation: 2929e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor return CodeCompletionContext::CCC_ObjCImplementation; 2930e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor 2931f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ObjCInstanceVariableList: 2932e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor return CodeCompletionContext::CCC_ObjCIvarList; 2933e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor 2934f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Template: 2935f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_MemberTemplate: 293652779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor if (S.CurContext->isFileContext()) 293752779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor return CodeCompletionContext::CCC_TopLevel; 29387530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie if (S.CurContext->isRecord()) 293952779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor return CodeCompletionContext::CCC_ClassStructUnion; 29407530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie return CodeCompletionContext::CCC_Other; 294152779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor 2942f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_RecoveryInFunction: 294352779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor return CodeCompletionContext::CCC_Recovery; 2944a5450a097e83072c0e545ccd8df8b07e172f1b09Douglas Gregor 2945f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ForInit: 29464e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (S.getLangOpts().CPlusPlus || S.getLangOpts().C99 || 29474e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie S.getLangOpts().ObjC1) 2948a5450a097e83072c0e545ccd8df8b07e172f1b09Douglas Gregor return CodeCompletionContext::CCC_ParenthesizedExpression; 2949a5450a097e83072c0e545ccd8df8b07e172f1b09Douglas Gregor else 2950a5450a097e83072c0e545ccd8df8b07e172f1b09Douglas Gregor return CodeCompletionContext::CCC_Expression; 2951a5450a097e83072c0e545ccd8df8b07e172f1b09Douglas Gregor 2952a5450a097e83072c0e545ccd8df8b07e172f1b09Douglas Gregor case Sema::PCC_Expression: 2953f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Condition: 2954e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor return CodeCompletionContext::CCC_Expression; 2955e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor 2956f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Statement: 2957e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor return CodeCompletionContext::CCC_Statement; 295872db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor 2959f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Type: 296072db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor return CodeCompletionContext::CCC_Type; 29610268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor 29620268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor case Sema::PCC_ParenthesizedExpression: 29630268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor return CodeCompletionContext::CCC_ParenthesizedExpression; 296468e3c2eef52701a178fbcc2bb424f31dd4b36931Douglas Gregor 296568e3c2eef52701a178fbcc2bb424f31dd4b36931Douglas Gregor case Sema::PCC_LocalDeclarationSpecifiers: 296668e3c2eef52701a178fbcc2bb424f31dd4b36931Douglas Gregor return CodeCompletionContext::CCC_Type; 2967e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor } 29687530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie 29697530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie llvm_unreachable("Invalid ParserCompletionContext!"); 2970e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor} 2971e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor 2972f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor/// \brief If we're in a C++ virtual member function, add completion results 2973f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor/// that invoke the functions we override, since it's common to invoke the 2974f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor/// overridden function as well as adding new functionality. 2975f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor/// 2976f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor/// \param S The semantic analysis object for which we are generating results. 2977f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor/// 2978f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor/// \param InContext This context in which the nested-name-specifier preceding 2979f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor/// the code-completion point 2980f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregorstatic void MaybeAddOverrideCalls(Sema &S, DeclContext *InContext, 2981f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor ResultBuilder &Results) { 2982f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor // Look through blocks. 2983f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor DeclContext *CurContext = S.CurContext; 2984f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor while (isa<BlockDecl>(CurContext)) 2985f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor CurContext = CurContext->getParent(); 2986f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor 2987f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor 2988f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(CurContext); 2989f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor if (!Method || !Method->isVirtual()) 2990f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor return; 2991f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor 2992f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor // We need to have names for all of the parameters, if we're going to 2993f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor // generate a forwarding call. 2994f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor for (CXXMethodDecl::param_iterator P = Method->param_begin(), 2995f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor PEnd = Method->param_end(); 2996f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor P != PEnd; 2997f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor ++P) { 2998f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor if (!(*P)->getDeclName()) 2999f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor return; 3000f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor } 3001f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor 30028987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor PrintingPolicy Policy = getCompletionPrintingPolicy(S); 3003f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor for (CXXMethodDecl::method_iterator M = Method->begin_overridden_methods(), 3004f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor MEnd = Method->end_overridden_methods(); 3005f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor M != MEnd; ++M) { 300628a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Builder(Results.getAllocator(), 300728a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis Results.getCodeCompletionTUInfo()); 3008f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor CXXMethodDecl *Overridden = const_cast<CXXMethodDecl *>(*M); 3009f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor if (Overridden->getCanonicalDecl() == Method->getCanonicalDecl()) 3010f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor continue; 3011f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor 3012f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor // If we need a nested-name-specifier, add one now. 3013f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor if (!InContext) { 3014f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor NestedNameSpecifier *NNS 3015f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor = getRequiredQualification(S.Context, CurContext, 3016f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor Overridden->getDeclContext()); 3017f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor if (NNS) { 3018f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor std::string Str; 3019f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor llvm::raw_string_ostream OS(Str); 30208987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor NNS->print(OS, Policy); 3021dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddTextChunk(Results.getAllocator().CopyString(OS.str())); 3022f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor } 3023f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor } else if (!InContext->Equals(Overridden->getDeclContext())) 3024f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor continue; 3025f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor 3026dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddTypedTextChunk(Results.getAllocator().CopyString( 3027218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Overridden->getNameAsString())); 3028218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 3029f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor bool FirstParam = true; 3030f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor for (CXXMethodDecl::param_iterator P = Method->param_begin(), 3031f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor PEnd = Method->param_end(); 3032f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor P != PEnd; ++P) { 3033f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor if (FirstParam) 3034f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor FirstParam = false; 3035f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor else 3036218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_Comma); 3037f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor 3038dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddPlaceholderChunk(Results.getAllocator().CopyString( 3039218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor (*P)->getIdentifier()->getName())); 3040f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor } 3041218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 3042218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(CodeCompletionResult(Builder.TakeString(), 3043f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor CCP_SuperCompletion, 3044ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor CXCursor_CXXMethod, 3045ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor CXAvailability_Available, 3046ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor Overridden)); 3047f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor Results.Ignore(Overridden); 3048f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor } 3049f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor} 3050f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor 3051c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregorvoid Sema::CodeCompleteModuleImport(SourceLocation ImportLoc, 3052c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor ModuleIdPath Path) { 3053c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor typedef CodeCompletionResult Result; 3054c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 305528a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 3056c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor CodeCompletionContext::CCC_Other); 3057c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor Results.EnterNewScope(); 3058c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor 3059c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor CodeCompletionAllocator &Allocator = Results.getAllocator(); 306028a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo()); 3061c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor typedef CodeCompletionResult Result; 3062c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor if (Path.empty()) { 3063c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor // Enumerate all top-level modules. 3064c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor llvm::SmallVector<Module *, 8> Modules; 3065c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor PP.getHeaderSearchInfo().collectAllModules(Modules); 3066c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor for (unsigned I = 0, N = Modules.size(); I != N; ++I) { 3067c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor Builder.AddTypedTextChunk( 3068c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor Builder.getAllocator().CopyString(Modules[I]->Name)); 3069c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor Results.AddResult(Result(Builder.TakeString(), 3070c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor CCP_Declaration, 3071c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor CXCursor_NotImplemented, 3072c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor Modules[I]->isAvailable() 3073c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor ? CXAvailability_Available 3074c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor : CXAvailability_NotAvailable)); 3075c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor } 3076c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor } else { 3077c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor // Load the named module. 3078c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor Module *Mod = PP.getModuleLoader().loadModule(ImportLoc, Path, 3079c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor Module::AllVisible, 3080c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor /*IsInclusionDirective=*/false); 3081c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor // Enumerate submodules. 3082c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor if (Mod) { 3083c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor for (Module::submodule_iterator Sub = Mod->submodule_begin(), 3084c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor SubEnd = Mod->submodule_end(); 3085c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor Sub != SubEnd; ++Sub) { 3086c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor 3087c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor Builder.AddTypedTextChunk( 3088c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor Builder.getAllocator().CopyString((*Sub)->Name)); 3089c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor Results.AddResult(Result(Builder.TakeString(), 3090c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor CCP_Declaration, 3091c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor CXCursor_NotImplemented, 3092c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor (*Sub)->isAvailable() 3093c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor ? CXAvailability_Available 3094c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor : CXAvailability_NotAvailable)); 3095c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor } 3096c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor } 3097c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor } 3098c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor Results.ExitScope(); 3099c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 3100c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor Results.data(),Results.size()); 3101c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor} 3102c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor 310301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregorvoid Sema::CodeCompleteOrdinaryName(Scope *S, 3104e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor ParserCompletionContext CompletionContext) { 31050a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 3106218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 310728a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 310852779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor mapCodeCompletionContext(*this, CompletionContext)); 3109f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor Results.EnterNewScope(); 3110cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor 311101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Determine how to filter results, e.g., so that the names of 311201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // values (functions, enumerators, function templates, etc.) are 311301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // only allowed where we can have an expression. 311401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor switch (CompletionContext) { 3115e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_Namespace: 3116e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_Class: 3117e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_ObjCInterface: 3118e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_ObjCImplementation: 3119e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_ObjCInstanceVariableList: 3120e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_Template: 3121e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_MemberTemplate: 312272db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_Type: 312368e3c2eef52701a178fbcc2bb424f31dd4b36931Douglas Gregor case PCC_LocalDeclarationSpecifiers: 312401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Results.setFilter(&ResultBuilder::IsOrdinaryNonValueName); 312501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 312601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 3127e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_Statement: 31280268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor case PCC_ParenthesizedExpression: 3129eb0d0145910f3024d9bdefe279a1e9b95495f2fdDouglas Gregor case PCC_Expression: 3130e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_ForInit: 3131e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_Condition: 31324e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (WantTypesInContext(CompletionContext, getLangOpts())) 31334710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor Results.setFilter(&ResultBuilder::IsOrdinaryName); 31344710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor else 31354710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor Results.setFilter(&ResultBuilder::IsOrdinaryNonTypeName); 3136f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor 31374e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (getLangOpts().CPlusPlus) 3138f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor MaybeAddOverrideCalls(*this, /*InContext=*/0, Results); 313901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 3140dc8453422bec3bbf70c03920e01498d75783d122Douglas Gregor 3141e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_RecoveryInFunction: 3142dc8453422bec3bbf70c03920e01498d75783d122Douglas Gregor // Unfiltered 3143dc8453422bec3bbf70c03920e01498d75783d122Douglas Gregor break; 314401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 314501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 31463cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor // If we are in a C++ non-static member function, check the qualifiers on 31473cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor // the member function to filter/prioritize the results list. 31483cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor if (CXXMethodDecl *CurMethod = dyn_cast<CXXMethodDecl>(CurContext)) 31493cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor if (CurMethod->isInstance()) 31503cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor Results.setObjectTypeQualifiers( 31513cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor Qualifiers::fromCVRMask(CurMethod->getTypeQualifiers())); 31523cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor 31531ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 31548071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 31558071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompleter->includeGlobals()); 31562a7925c4abe45650f3ab27be09468e3a3a98084aDouglas Gregor 3157bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddOrdinaryNameResults(CompletionContext, S, *this, Results); 31582a7925c4abe45650f3ab27be09468e3a3a98084aDouglas Gregor Results.ExitScope(); 31592a7925c4abe45650f3ab27be09468e3a3a98084aDouglas Gregor 3160aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor switch (CompletionContext) { 31610268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor case PCC_ParenthesizedExpression: 316272db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_Expression: 316372db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_Statement: 316472db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_RecoveryInFunction: 316572db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor if (S->getFnParent()) 31664e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie AddPrettyFunctionResults(PP.getLangOpts(), Results); 316772db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor break; 316872db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor 316972db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_Namespace: 317072db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_Class: 317172db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_ObjCInterface: 317272db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_ObjCImplementation: 317372db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_ObjCInstanceVariableList: 317472db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_Template: 317572db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_MemberTemplate: 317672db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_ForInit: 317772db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_Condition: 317872db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_Type: 317968e3c2eef52701a178fbcc2bb424f31dd4b36931Douglas Gregor case PCC_LocalDeclarationSpecifiers: 318072db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor break; 3181aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor } 3182aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor 31830c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor if (CodeCompleter->includeMacros()) 3184bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddMacroResults(PP, Results); 3185aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor 3186cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 3187e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 3188791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor} 3189791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor 3190c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregorstatic void AddClassMessageCompletions(Sema &SemaRef, Scope *S, 3191c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor ParsedType Receiver, 3192c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor IdentifierInfo **SelIdents, 3193c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor unsigned NumSelIdents, 319470c5ac70ace21b011dc2d4001bae26cdcf62ff8dDouglas Gregor bool AtArgumentExpression, 3195c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor bool IsSuper, 3196c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor ResultBuilder &Results); 3197c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor 3198c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregorvoid Sema::CodeCompleteDeclSpec(Scope *S, DeclSpec &DS, 3199c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor bool AllowNonIdentifiers, 3200c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor bool AllowNestedNameSpecifiers) { 32010a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 3202218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 320328a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 320452779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor AllowNestedNameSpecifiers 320552779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor ? CodeCompletionContext::CCC_PotentiallyQualifiedName 320652779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor : CodeCompletionContext::CCC_Name); 32072ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor Results.EnterNewScope(); 32082ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor 32092ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor // Type qualifiers can come after names. 32102ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor Results.AddResult(Result("const")); 32112ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor Results.AddResult(Result("volatile")); 32124e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (getLangOpts().C99) 32132ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor Results.AddResult(Result("restrict")); 32142ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor 32154e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (getLangOpts().CPlusPlus) { 32162ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor if (AllowNonIdentifiers) { 32172ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor Results.AddResult(Result("operator")); 32182ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor } 32192ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor 32202ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor // Add nested-name-specifiers. 32212ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor if (AllowNestedNameSpecifiers) { 32222ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor Results.allowNestedNameSpecifiers(); 322352779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor Results.setFilter(&ResultBuilder::IsImpossibleToSatisfy); 32242ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 32252ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor LookupVisibleDecls(S, LookupNestedNameSpecifierName, Consumer, 32262ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor CodeCompleter->includeGlobals()); 322752779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor Results.setFilter(0); 32282ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor } 32292ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor } 32302ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor Results.ExitScope(); 32312ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor 3232c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor // If we're in a context where we might have an expression (rather than a 3233c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor // declaration), and what we've seen so far is an Objective-C type that could 3234c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor // be a receiver of a class message, this may be a class message send with 3235c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor // the initial opening bracket '[' missing. Add appropriate completions. 3236c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor if (AllowNonIdentifiers && !AllowNestedNameSpecifiers && 3237c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor DS.getTypeSpecType() == DeclSpec::TST_typename && 3238c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor DS.getStorageClassSpecAsWritten() == DeclSpec::SCS_unspecified && 3239c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor !DS.isThreadSpecified() && !DS.isExternInLinkageSpec() && 3240c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor DS.getTypeSpecComplex() == DeclSpec::TSC_unspecified && 3241c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor DS.getTypeSpecSign() == DeclSpec::TSS_unspecified && 3242c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor DS.getTypeQualifiers() == 0 && 3243c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor S && 3244c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor (S->getFlags() & Scope::DeclScope) != 0 && 3245c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor (S->getFlags() & (Scope::ClassScope | Scope::TemplateParamScope | 3246c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor Scope::FunctionPrototypeScope | 3247c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor Scope::AtCatchScope)) == 0) { 3248c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor ParsedType T = DS.getRepAsType(); 3249c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor if (!T.get().isNull() && T.get()->isObjCObjectOrInterfaceType()) 325070c5ac70ace21b011dc2d4001bae26cdcf62ff8dDouglas Gregor AddClassMessageCompletions(*this, S, T, 0, 0, false, false, Results); 3251c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor } 3252c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor 32534497dd49f78eb5e1a7c3f19d1a13564f79e12341Douglas Gregor // Note that we intentionally suppress macro results here, since we do not 32544497dd49f78eb5e1a7c3f19d1a13564f79e12341Douglas Gregor // encourage using macros to produce the names of entities. 32554497dd49f78eb5e1a7c3f19d1a13564f79e12341Douglas Gregor 325652779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 325752779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor Results.getCompletionContext(), 32582ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor Results.data(), Results.size()); 32592ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor} 32602ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor 3261fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregorstruct Sema::CodeCompleteExpressionData { 3262fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor CodeCompleteExpressionData(QualType PreferredType = QualType()) 3263fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor : PreferredType(PreferredType), IntegralConstantExpression(false), 3264fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor ObjCCollection(false) { } 3265fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor 3266fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor QualType PreferredType; 3267fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor bool IntegralConstantExpression; 3268fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor bool ObjCCollection; 32695f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<Decl *, 4> IgnoreDecls; 3270fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor}; 3271fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor 32725ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor/// \brief Perform code-completion in an expression context when we know what 32735ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor/// type we're looking for. 3274f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor/// 3275f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor/// \param IntegralConstantExpression Only permit integral constant 3276f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor/// expressions. 3277fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregorvoid Sema::CodeCompleteExpression(Scope *S, 3278fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor const CodeCompleteExpressionData &Data) { 32790a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 3280218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 328128a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 3282218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Expression); 3283fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor if (Data.ObjCCollection) 3284fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor Results.setFilter(&ResultBuilder::IsObjCCollection); 3285fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor else if (Data.IntegralConstantExpression) 3286f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor Results.setFilter(&ResultBuilder::IsIntegralConstantValue); 32874e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie else if (WantTypesInContext(PCC_Expression, getLangOpts())) 32885ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor Results.setFilter(&ResultBuilder::IsOrdinaryName); 32895ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor else 32905ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor Results.setFilter(&ResultBuilder::IsOrdinaryNonTypeName); 3291fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor 3292fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor if (!Data.PreferredType.isNull()) 3293fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor Results.setPreferredType(Data.PreferredType.getNonReferenceType()); 3294fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor 3295fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor // Ignore any declarations that we were told that we don't care about. 3296fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor for (unsigned I = 0, N = Data.IgnoreDecls.size(); I != N; ++I) 3297fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor Results.Ignore(Data.IgnoreDecls[I]); 32985ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 32995ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 33008071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 33018071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompleter->includeGlobals()); 33025ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 33035ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor Results.EnterNewScope(); 3304e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor AddOrdinaryNameResults(PCC_Expression, S, *this, Results); 33055ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor Results.ExitScope(); 33065ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 3307590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregor bool PreferredTypeIsPointer = false; 3308fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor if (!Data.PreferredType.isNull()) 3309fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor PreferredTypeIsPointer = Data.PreferredType->isAnyPointerType() 3310fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor || Data.PreferredType->isMemberPointerType() 3311fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor || Data.PreferredType->isBlockPointerType(); 3312590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregor 3313aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor if (S->getFnParent() && 3314aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor !Data.ObjCCollection && 3315aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor !Data.IntegralConstantExpression) 33164e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie AddPrettyFunctionResults(PP.getLangOpts(), Results); 3317aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor 33185ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (CodeCompleter->includeMacros()) 3319590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregor AddMacroResults(PP, Results, PreferredTypeIsPointer); 3320e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 3321fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor CodeCompletionContext(CodeCompletionContext::CCC_Expression, 3322fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor Data.PreferredType), 3323e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 33245ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor} 33255ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 3326ac5fd8404fa8ecfae28be76f98fd0d926350354cDouglas Gregorvoid Sema::CodeCompletePostfixExpression(Scope *S, ExprResult E) { 3327ac5fd8404fa8ecfae28be76f98fd0d926350354cDouglas Gregor if (E.isInvalid()) 3328ac5fd8404fa8ecfae28be76f98fd0d926350354cDouglas Gregor CodeCompleteOrdinaryName(S, PCC_RecoveryInFunction); 33294e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie else if (getLangOpts().ObjC1) 3330ac5fd8404fa8ecfae28be76f98fd0d926350354cDouglas Gregor CodeCompleteObjCInstanceMessage(S, E.take(), 0, 0, false); 333178edf515544f0b9dddf69d6c1678fd83e94d8352Douglas Gregor} 33325ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 33337344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor/// \brief The set of properties that have already been added, referenced by 33347344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor/// property name. 33357344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregortypedef llvm::SmallPtrSet<IdentifierInfo*, 16> AddedPropertiesSet; 33367344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor 3337b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor/// \brief Retrieve the container definition, if any? 3338b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregorstatic ObjCContainerDecl *getContainerDef(ObjCContainerDecl *Container) { 3339b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor if (ObjCInterfaceDecl *Interface = dyn_cast<ObjCInterfaceDecl>(Container)) { 3340b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor if (Interface->hasDefinition()) 3341b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor return Interface->getDefinition(); 3342b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor 3343b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor return Interface; 3344b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor } 3345b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor 3346b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) { 3347b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor if (Protocol->hasDefinition()) 3348b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor return Protocol->getDefinition(); 3349b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor 3350b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor return Protocol; 3351b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor } 3352b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor return Container; 3353b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor} 3354b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor 3355b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregorstatic void AddObjCProperties(ObjCContainerDecl *Container, 3356322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor bool AllowCategories, 33574b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor bool AllowNullaryMethods, 335895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor DeclContext *CurContext, 33597344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor AddedPropertiesSet &AddedProperties, 336095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor ResultBuilder &Results) { 33610a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 336295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 3363b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor // Retrieve the definition. 3364b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor Container = getContainerDef(Container); 3365b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor 336695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Add properties in this container. 336795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor for (ObjCContainerDecl::prop_iterator P = Container->prop_begin(), 336895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor PEnd = Container->prop_end(); 336995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor P != PEnd; 33707344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor ++P) { 33717344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor if (AddedProperties.insert(P->getIdentifier())) 3372581deb3da481053c4993c7600f97acf7768caac5David Blaikie Results.MaybeAddResult(Result(*P, 0), CurContext); 33737344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor } 337495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 33754b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor // Add nullary methods 33764b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor if (AllowNullaryMethods) { 33774b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor ASTContext &Context = Container->getASTContext(); 33788987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor PrintingPolicy Policy = getCompletionPrintingPolicy(Results.getSema()); 33794b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor for (ObjCContainerDecl::method_iterator M = Container->meth_begin(), 33804b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor MEnd = Container->meth_end(); 33814b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor M != MEnd; ++M) { 33824b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor if (M->getSelector().isUnarySelector()) 33834b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor if (IdentifierInfo *Name = M->getSelector().getIdentifierInfoForSlot(0)) 33844b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor if (AddedProperties.insert(Name)) { 338528a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Builder(Results.getAllocator(), 338628a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis Results.getCodeCompletionTUInfo()); 3387581deb3da481053c4993c7600f97acf7768caac5David Blaikie AddResultTypeChunk(Context, Policy, *M, Builder); 33884b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor Builder.AddTypedTextChunk( 33894b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor Results.getAllocator().CopyString(Name->getName())); 33904b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor 3391581deb3da481053c4993c7600f97acf7768caac5David Blaikie Results.MaybeAddResult(Result(Builder.TakeString(), *M, 3392ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor CCP_MemberDeclaration + CCD_MethodAsProperty), 33934b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor CurContext); 33944b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor } 33954b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor } 33964b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor } 33974b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor 33984b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor 339995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Add properties in referenced protocols. 340095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) { 340195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor for (ObjCProtocolDecl::protocol_iterator P = Protocol->protocol_begin(), 340295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor PEnd = Protocol->protocol_end(); 340395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor P != PEnd; ++P) 34044b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddObjCProperties(*P, AllowCategories, AllowNullaryMethods, CurContext, 34054b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddedProperties, Results); 340695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } else if (ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container)){ 3407322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor if (AllowCategories) { 3408322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Look through categories. 3409322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor for (ObjCCategoryDecl *Category = IFace->getCategoryList(); 3410322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Category; Category = Category->getNextClassCategory()) 34114b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddObjCProperties(Category, AllowCategories, AllowNullaryMethods, 34124b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor CurContext, AddedProperties, Results); 3413322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor } 341495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 341595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Look through protocols. 341653b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek for (ObjCInterfaceDecl::all_protocol_iterator 341753b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek I = IFace->all_referenced_protocol_begin(), 341853b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek E = IFace->all_referenced_protocol_end(); I != E; ++I) 34194b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddObjCProperties(*I, AllowCategories, AllowNullaryMethods, CurContext, 34204b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddedProperties, Results); 342195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 342295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Look in the superclass. 342395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (IFace->getSuperClass()) 34244b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddObjCProperties(IFace->getSuperClass(), AllowCategories, 34254b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AllowNullaryMethods, CurContext, 34267344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor AddedProperties, Results); 342795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } else if (const ObjCCategoryDecl *Category 342895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor = dyn_cast<ObjCCategoryDecl>(Container)) { 342995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Look through protocols. 343053b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek for (ObjCCategoryDecl::protocol_iterator P = Category->protocol_begin(), 343153b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek PEnd = Category->protocol_end(); 343295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor P != PEnd; ++P) 34334b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddObjCProperties(*P, AllowCategories, AllowNullaryMethods, CurContext, 34344b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddedProperties, Results); 343595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } 343695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor} 343795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 3438f5cd27d7eef3fd4021545dd76a1faf7152fda344Douglas Gregorvoid Sema::CodeCompleteMemberReferenceExpr(Scope *S, Expr *Base, 343981b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor SourceLocation OpLoc, 344081b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor bool IsArrow) { 3441f5cd27d7eef3fd4021545dd76a1faf7152fda344Douglas Gregor if (!Base || !CodeCompleter) 344281b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor return; 344381b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor 3444f5cd27d7eef3fd4021545dd76a1faf7152fda344Douglas Gregor ExprResult ConvertedBase = PerformMemberExprBaseConversion(Base, IsArrow); 3445f5cd27d7eef3fd4021545dd76a1faf7152fda344Douglas Gregor if (ConvertedBase.isInvalid()) 3446f5cd27d7eef3fd4021545dd76a1faf7152fda344Douglas Gregor return; 3447f5cd27d7eef3fd4021545dd76a1faf7152fda344Douglas Gregor Base = ConvertedBase.get(); 3448f5cd27d7eef3fd4021545dd76a1faf7152fda344Douglas Gregor 34490a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 345086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 345181b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor QualType BaseType = Base->getType(); 345286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 345386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (IsArrow) { 345486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (const PointerType *Ptr = BaseType->getAs<PointerType>()) 345586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor BaseType = Ptr->getPointeeType(); 345686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor else if (BaseType->isObjCObjectPointerType()) 34573cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor /*Do nothing*/ ; 345886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor else 345986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return; 346086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 346186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 34623da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor enum CodeCompletionContext::Kind contextKind; 34633da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor 34643da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor if (IsArrow) { 34653da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contextKind = CodeCompletionContext::CCC_ArrowMemberAccess; 34663da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 34673da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor else { 34683da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor if (BaseType->isObjCObjectPointerType() || 34693da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor BaseType->isObjCObjectOrInterfaceType()) { 34703da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contextKind = CodeCompletionContext::CCC_ObjCPropertyAccess; 34713da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 34723da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor else { 34733da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contextKind = CodeCompletionContext::CCC_DotMemberAccess; 34743da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 34753da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 34763da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor 3477218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 347828a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 34793da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CodeCompletionContext(contextKind, 348052779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor BaseType), 348152779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor &ResultBuilder::IsMember); 348295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor Results.EnterNewScope(); 348395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (const RecordType *Record = BaseType->getAs<RecordType>()) { 34843cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor // Indicate that we are performing a member access, and the cv-qualifiers 34853cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor // for the base object type. 34863cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor Results.setObjectTypeQualifiers(BaseType.getQualifiers()); 34873cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor 348895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Access to a C/C++ class, struct, or union. 348945bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor Results.allowNestedNameSpecifiers(); 34900cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 34918071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(Record->getDecl(), LookupMemberName, Consumer, 34928071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompleter->includeGlobals()); 34933a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar 34944e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (getLangOpts().CPlusPlus) { 349595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (!Results.empty()) { 349695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // The "template" keyword can follow "->" or "." in the grammar. 349795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // However, we only want to suggest the template keyword if something 349895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // is dependent. 349995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor bool IsDependent = BaseType->isDependentType(); 350095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (!IsDependent) { 350195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor for (Scope *DepScope = S; DepScope; DepScope = DepScope->getParent()) 350295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (DeclContext *Ctx = (DeclContext *)DepScope->getEntity()) { 350395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor IsDependent = Ctx->isDependentContext(); 350495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor break; 350595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } 350695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } 35073a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar 350895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (IsDependent) 3509a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("template")); 351086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 351195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } 351295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } else if (!IsArrow && BaseType->getAsObjCInterfacePointerType()) { 351395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Objective-C property reference. 35147344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor AddedPropertiesSet AddedProperties; 351595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 351695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Add property results based on our interface. 351795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor const ObjCObjectPointerType *ObjCPtr 351895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor = BaseType->getAsObjCInterfacePointerType(); 351995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor assert(ObjCPtr && "Non-NULL pointer guaranteed above!"); 35204b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddObjCProperties(ObjCPtr->getInterfaceDecl(), true, 35214b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor /*AllowNullaryMethods=*/true, CurContext, 35227344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor AddedProperties, Results); 352395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 352495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Add properties from the protocols in a qualified interface. 352595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor for (ObjCObjectPointerType::qual_iterator I = ObjCPtr->qual_begin(), 352695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor E = ObjCPtr->qual_end(); 352795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor I != E; ++I) 35284b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddObjCProperties(*I, true, /*AllowNullaryMethods=*/true, CurContext, 35294b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddedProperties, Results); 353095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } else if ((IsArrow && BaseType->isObjCObjectPointerType()) || 3531c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall (!IsArrow && BaseType->isObjCObjectType())) { 353295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Objective-C instance variable access. 353395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor ObjCInterfaceDecl *Class = 0; 353495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (const ObjCObjectPointerType *ObjCPtr 353595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor = BaseType->getAs<ObjCObjectPointerType>()) 353695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor Class = ObjCPtr->getInterfaceDecl(); 353795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor else 3538c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall Class = BaseType->getAs<ObjCObjectType>()->getInterface(); 353995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 354095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Add all ivars from this class and its superclasses. 354180f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor if (Class) { 354280f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 354380f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor Results.setFilter(&ResultBuilder::IsObjCIvar); 35448071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(Class, LookupMemberName, Consumer, 35458071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompleter->includeGlobals()); 354686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 354786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 354895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 354995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // FIXME: How do we cope with isa? 355095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 355195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor Results.ExitScope(); 35523a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar 35533a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar // Hand off the results found for code completion. 3554e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 355552779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor Results.getCompletionContext(), 3556e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 355781b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor} 355881b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor 3559374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregorvoid Sema::CodeCompleteTag(Scope *S, unsigned TagSpec) { 3560374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor if (!CodeCompleter) 3561374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor return; 3562374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor 35630a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 356486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ResultBuilder::LookupFilter Filter = 0; 3565e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor enum CodeCompletionContext::Kind ContextKind 3566e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor = CodeCompletionContext::CCC_Other; 3567374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor switch ((DeclSpec::TST)TagSpec) { 3568374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor case DeclSpec::TST_enum: 356986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Filter = &ResultBuilder::IsEnum; 3570e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor ContextKind = CodeCompletionContext::CCC_EnumTag; 3571374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor break; 3572374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor 3573374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor case DeclSpec::TST_union: 357486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Filter = &ResultBuilder::IsUnion; 3575e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor ContextKind = CodeCompletionContext::CCC_UnionTag; 3576374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor break; 3577374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor 3578374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor case DeclSpec::TST_struct: 3579374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor case DeclSpec::TST_class: 358086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Filter = &ResultBuilder::IsClassOrStruct; 3581e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor ContextKind = CodeCompletionContext::CCC_ClassOrStructTag; 3582374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor break; 3583374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor 3584374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor default: 3585b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("Unknown type specifier kind in CodeCompleteTag"); 3586374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor } 358786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 358828a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis ResultBuilder Results(*this, CodeCompleter->getAllocator(), 358928a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), ContextKind); 35905d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 35910d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCall 35920d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCall // First pass: look for tags. 35930d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCall Results.setFilter(Filter); 35948071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(S, LookupTagName, Consumer, 35958071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompleter->includeGlobals()); 35960d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCall 35978071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor if (CodeCompleter->includeGlobals()) { 35988071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor // Second pass: look for nested name specifiers. 35998071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor Results.setFilter(&ResultBuilder::IsNestedNameSpecifier); 36008071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(S, LookupNestedNameSpecifierName, Consumer); 36018071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor } 360286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 360352779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 3604e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 3605374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor} 3606374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor 36071a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregorvoid Sema::CodeCompleteTypeQualifiers(DeclSpec &DS) { 3608218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 360928a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 3610218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_TypeQualifiers); 36111a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor Results.EnterNewScope(); 36121a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor if (!(DS.getTypeQualifiers() & DeclSpec::TQ_const)) 36131a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor Results.AddResult("const"); 36141a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor if (!(DS.getTypeQualifiers() & DeclSpec::TQ_volatile)) 36151a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor Results.AddResult("volatile"); 36164e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (getLangOpts().C99 && 36171a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor !(DS.getTypeQualifiers() & DeclSpec::TQ_restrict)) 36181a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor Results.AddResult("restrict"); 36191a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor Results.ExitScope(); 36201a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 362152779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor Results.getCompletionContext(), 36221a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor Results.data(), Results.size()); 36231a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor} 36241a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor 36253e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregorvoid Sema::CodeCompleteCase(Scope *S) { 3626781472fe99a120098c631b0cbe33c89f8cef5e70John McCall if (getCurFunction()->SwitchStack.empty() || !CodeCompleter) 36273e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor return; 3628a8e0cd8cdecc7e0ba1792e46773b884c6eed4829John McCall 3629781472fe99a120098c631b0cbe33c89f8cef5e70John McCall SwitchStmt *Switch = getCurFunction()->SwitchStack.back(); 3630a8e0cd8cdecc7e0ba1792e46773b884c6eed4829John McCall QualType type = Switch->getCond()->IgnoreImplicit()->getType(); 3631a8e0cd8cdecc7e0ba1792e46773b884c6eed4829John McCall if (!type->isEnumeralType()) { 3632a8e0cd8cdecc7e0ba1792e46773b884c6eed4829John McCall CodeCompleteExpressionData Data(type); 3633fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor Data.IntegralConstantExpression = true; 3634fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor CodeCompleteExpression(S, Data); 36353e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor return; 3636f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor } 36373e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 36383e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // Code-complete the cases of a switch statement over an enumeration type 36393e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // by providing the list of 3640a8e0cd8cdecc7e0ba1792e46773b884c6eed4829John McCall EnumDecl *Enum = type->castAs<EnumType>()->getDecl(); 3641b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor if (EnumDecl *Def = Enum->getDefinition()) 3642b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor Enum = Def; 36433e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 36443e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // Determine which enumerators we have already seen in the switch statement. 36453e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // FIXME: Ideally, we would also be able to look *past* the code-completion 36463e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // token, in case we are code-completing in the middle of the switch and not 36473e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // at the end. However, we aren't able to do so at the moment. 36483e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor llvm::SmallPtrSet<EnumConstantDecl *, 8> EnumeratorsSeen; 3649b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor NestedNameSpecifier *Qualifier = 0; 36503e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor for (SwitchCase *SC = Switch->getSwitchCaseList(); SC; 36513e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor SC = SC->getNextSwitchCase()) { 36523e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor CaseStmt *Case = dyn_cast<CaseStmt>(SC); 36533e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor if (!Case) 36543e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor continue; 36553e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 36563e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor Expr *CaseVal = Case->getLHS()->IgnoreParenCasts(); 36573e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(CaseVal)) 36583e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor if (EnumConstantDecl *Enumerator 36593e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor = dyn_cast<EnumConstantDecl>(DRE->getDecl())) { 36603e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // We look into the AST of the case statement to determine which 36613e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // enumerator was named. Alternatively, we could compute the value of 36623e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // the integral constant expression, then compare it against the 36633e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // values of each enumerator. However, value-based approach would not 36643e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // work as well with C++ templates where enumerators declared within a 36653e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // template are type- and value-dependent. 36663e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor EnumeratorsSeen.insert(Enumerator); 36673e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 3668b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // If this is a qualified-id, keep track of the nested-name-specifier 3669b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // so that we can reproduce it as part of code completion, e.g., 36703e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // 36713e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // switch (TagD.getKind()) { 36723e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // case TagDecl::TK_enum: 36733e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // break; 36743e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // case XXX 36753e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // 3676b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // At the XXX, our completions are TagDecl::TK_union, 36773e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // TagDecl::TK_struct, and TagDecl::TK_class, rather than TK_union, 36783e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // TK_struct, and TK_class. 3679a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor Qualifier = DRE->getQualifier(); 36803e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor } 36813e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor } 36823e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 36834e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (getLangOpts().CPlusPlus && !Qualifier && EnumeratorsSeen.empty()) { 3684b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // If there are no prior enumerators in C++, check whether we have to 3685b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // qualify the names of the enumerators that we suggest, because they 3686b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // may not be visible in this scope. 3687b223d8c4266655fe7a9491a0aff0263597672823Douglas Gregor Qualifier = getRequiredQualification(Context, CurContext, Enum); 3688b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor } 3689b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor 36903e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // Add any enumerators that have not yet been mentioned. 3691218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 369228a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 3693218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Expression); 36943e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor Results.EnterNewScope(); 36953e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor for (EnumDecl::enumerator_iterator E = Enum->enumerator_begin(), 36963e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor EEnd = Enum->enumerator_end(); 36973e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor E != EEnd; ++E) { 3698581deb3da481053c4993c7600f97acf7768caac5David Blaikie if (EnumeratorsSeen.count(*E)) 36993e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor continue; 37003e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 3701581deb3da481053c4993c7600f97acf7768caac5David Blaikie CodeCompletionResult R(*E, Qualifier); 37025c722c7020b33da57090422b854072258a50b3f0Douglas Gregor R.Priority = CCP_EnumInCase; 37035c722c7020b33da57090422b854072258a50b3f0Douglas Gregor Results.AddResult(R, CurContext, 0, false); 37043e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor } 37053e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor Results.ExitScope(); 37062f880e47ca32d007d7e9e5ff5efa05f5c3432744Douglas Gregor 37073da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor //We need to make sure we're setting the right context, 37083da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor //so only say we include macros if the code completer says we do 37093da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor enum CodeCompletionContext::Kind kind = CodeCompletionContext::CCC_Other; 37103da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor if (CodeCompleter->includeMacros()) { 3711bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddMacroResults(PP, Results); 37123da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor kind = CodeCompletionContext::CCC_OtherWithMacros; 37133da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 37143da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor 3715e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 37163da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor kind, 3717e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 37183e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor} 37193e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 37209c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregornamespace { 37219c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor struct IsBetterOverloadCandidate { 37229c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor Sema &S; 37235769d6195087229770d7ac90449443e026c47103John McCall SourceLocation Loc; 37249c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 37259c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor public: 37265769d6195087229770d7ac90449443e026c47103John McCall explicit IsBetterOverloadCandidate(Sema &S, SourceLocation Loc) 37275769d6195087229770d7ac90449443e026c47103John McCall : S(S), Loc(Loc) { } 37289c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 37299c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor bool 37309c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor operator()(const OverloadCandidate &X, const OverloadCandidate &Y) const { 3731120d63cd4465230c2cd56508c7cd8e0ad00848e7John McCall return isBetterOverloadCandidate(S, X, Y, Loc); 37329c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor } 37339c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor }; 37349c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor} 37359c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 373613a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charlesstatic bool anyNullArguments(llvm::ArrayRef<Expr*> Args) { 373713a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles if (Args.size() && !Args.data()) 3738d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor return true; 373913a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles 374013a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles for (unsigned I = 0; I != Args.size(); ++I) 3741d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor if (!Args[I]) 3742d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor return true; 374313a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles 3744d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor return false; 3745d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor} 3746d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor 3747f81e5a9e3f3ff80c56e4afb4fe6311a8735f36e8Richard Trieuvoid Sema::CodeCompleteCall(Scope *S, Expr *FnIn, 374813a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles llvm::ArrayRef<Expr *> Args) { 37499c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor if (!CodeCompleter) 37509c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor return; 3751ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor 3752ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor // When we're code-completing for a call, we fall back to ordinary 3753ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor // name code-completion whenever we can't produce specific 3754ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor // results. We may want to revisit this strategy in the future, 3755ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor // e.g., by merging the two kinds of results. 3756ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor 37579c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor Expr *Fn = (Expr *)FnIn; 3758ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor 37599c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor // Ignore type-dependent call expressions entirely. 376013a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles if (!Fn || Fn->isTypeDependent() || anyNullArguments(Args) || 376113a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles Expr::hasAnyTypeDependentArguments(Args)) { 3762e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompleteOrdinaryName(S, PCC_Expression); 37639c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor return; 3764ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor } 37659c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 37663b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall // Build an overload candidate set based on the functions we find. 37675769d6195087229770d7ac90449443e026c47103John McCall SourceLocation Loc = Fn->getExprLoc(); 37685769d6195087229770d7ac90449443e026c47103John McCall OverloadCandidateSet CandidateSet(Loc); 37693b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall 37709c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor // FIXME: What if we're calling something that isn't a function declaration? 37719c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor // FIXME: What if we're calling a pseudo-destructor? 37729c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor // FIXME: What if we're calling a member function? 37739c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 3774c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor typedef CodeCompleteConsumer::OverloadCandidate ResultCandidate; 37755f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<ResultCandidate, 8> Results; 3776c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor 37773b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall Expr *NakedFn = Fn->IgnoreParenCasts(); 37783b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(NakedFn)) 377913a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles AddOverloadedCallCandidates(ULE, Args, CandidateSet, 37803b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall /*PartialOverloading=*/ true); 37813b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall else if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(NakedFn)) { 37823b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall FunctionDecl *FDecl = dyn_cast<FunctionDecl>(DRE->getDecl()); 3783c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor if (FDecl) { 37844e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (!getLangOpts().CPlusPlus || 3785d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor !FDecl->getType()->getAs<FunctionProtoType>()) 3786c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor Results.push_back(ResultCandidate(FDecl)); 3787c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor else 378886820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall // FIXME: access? 378913a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles AddOverloadCandidate(FDecl, DeclAccessPair::make(FDecl, AS_none), Args, 379013a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles CandidateSet, false, /*PartialOverloading*/true); 3791c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor } 37923b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall } 37939c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 37945ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor QualType ParamType; 37955ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 3796c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor if (!CandidateSet.empty()) { 3797c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor // Sort the overload candidate set by placing the best overloads first. 3798c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor std::stable_sort(CandidateSet.begin(), CandidateSet.end(), 37995769d6195087229770d7ac90449443e026c47103John McCall IsBetterOverloadCandidate(*this, Loc)); 3800c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor 3801c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor // Add the remaining viable overload candidates as code-completion reslults. 3802c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor for (OverloadCandidateSet::iterator Cand = CandidateSet.begin(), 3803c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor CandEnd = CandidateSet.end(); 3804c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor Cand != CandEnd; ++Cand) { 3805c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor if (Cand->Viable) 3806c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor Results.push_back(ResultCandidate(Cand->Function)); 3807c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor } 38085ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 38095ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor // From the viable candidates, try to determine the type of this parameter. 38105ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor for (unsigned I = 0, N = Results.size(); I != N; ++I) { 38115ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (const FunctionType *FType = Results[I].getFunctionType()) 38125ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (const FunctionProtoType *Proto = dyn_cast<FunctionProtoType>(FType)) 381313a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles if (Args.size() < Proto->getNumArgs()) { 38145ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (ParamType.isNull()) 381513a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles ParamType = Proto->getArgType(Args.size()); 38165ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor else if (!Context.hasSameUnqualifiedType( 38175ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor ParamType.getNonReferenceType(), 381813a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles Proto->getArgType(Args.size()).getNonReferenceType())) { 38195ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor ParamType = QualType(); 38205ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor break; 38215ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor } 38225ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor } 38235ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor } 38245ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor } else { 38255ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor // Try to determine the parameter type from the type of the expression 38265ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor // being called. 38275ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor QualType FunctionType = Fn->getType(); 38285ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (const PointerType *Ptr = FunctionType->getAs<PointerType>()) 38295ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor FunctionType = Ptr->getPointeeType(); 38305ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor else if (const BlockPointerType *BlockPtr 38315ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor = FunctionType->getAs<BlockPointerType>()) 38325ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor FunctionType = BlockPtr->getPointeeType(); 38335ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor else if (const MemberPointerType *MemPtr 38345ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor = FunctionType->getAs<MemberPointerType>()) 38355ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor FunctionType = MemPtr->getPointeeType(); 38365ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 38375ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (const FunctionProtoType *Proto 38385ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor = FunctionType->getAs<FunctionProtoType>()) { 383913a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles if (Args.size() < Proto->getNumArgs()) 384013a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles ParamType = Proto->getArgType(Args.size()); 38415ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor } 38429c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor } 3843ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor 38445ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (ParamType.isNull()) 3845e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompleteOrdinaryName(S, PCC_Expression); 38465ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor else 38475ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor CodeCompleteExpression(S, ParamType); 38485ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 38492e4c7a5865739709a310d847da34096aa402d183Douglas Gregor if (!Results.empty()) 385013a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles CodeCompleter->ProcessOverloadCandidates(*this, Args.size(), Results.data(), 3851ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor Results.size()); 38529c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor} 38539c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 3854d226f65006733ed7f709c3174f22ce33391cb58fJohn McCallvoid Sema::CodeCompleteInitializer(Scope *S, Decl *D) { 3855d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall ValueDecl *VD = dyn_cast_or_null<ValueDecl>(D); 38565ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (!VD) { 3857e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompleteOrdinaryName(S, PCC_Expression); 38585ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor return; 38595ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor } 38605ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 38615ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor CodeCompleteExpression(S, VD->getType()); 38625ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor} 38635ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 38645ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregorvoid Sema::CodeCompleteReturn(Scope *S) { 38655ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor QualType ResultType; 38665ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (isa<BlockDecl>(CurContext)) { 38675ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (BlockScopeInfo *BSI = getCurBlock()) 38685ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor ResultType = BSI->ReturnType; 38695ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor } else if (FunctionDecl *Function = dyn_cast<FunctionDecl>(CurContext)) 38705ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor ResultType = Function->getResultType(); 38715ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor else if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(CurContext)) 38725ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor ResultType = Method->getResultType(); 38735ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 38745ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (ResultType.isNull()) 3875e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompleteOrdinaryName(S, PCC_Expression); 38765ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor else 38775ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor CodeCompleteExpression(S, ResultType); 38785ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor} 38795ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 3880d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregorvoid Sema::CodeCompleteAfterIf(Scope *S) { 3881d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor typedef CodeCompletionResult Result; 3882d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 388328a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 3884d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor mapCodeCompletionContext(*this, PCC_Statement)); 3885d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Results.setFilter(&ResultBuilder::IsOrdinaryName); 3886d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Results.EnterNewScope(); 3887d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor 3888d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 3889d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 3890d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor CodeCompleter->includeGlobals()); 3891d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor 3892d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor AddOrdinaryNameResults(PCC_Statement, S, *this, Results); 3893d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor 3894d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor // "else" block 389528a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Builder(Results.getAllocator(), 389628a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis Results.getCodeCompletionTUInfo()); 3897d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddTypedTextChunk("else"); 3898f11641a2c651e4e9733c5f5011993554d7c635e5Douglas Gregor if (Results.includeCodePatterns()) { 3899f11641a2c651e4e9733c5f5011993554d7c635e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 3900f11641a2c651e4e9733c5f5011993554d7c635e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 3901f11641a2c651e4e9733c5f5011993554d7c635e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 3902f11641a2c651e4e9733c5f5011993554d7c635e5Douglas Gregor Builder.AddPlaceholderChunk("statements"); 3903f11641a2c651e4e9733c5f5011993554d7c635e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 3904f11641a2c651e4e9733c5f5011993554d7c635e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 3905f11641a2c651e4e9733c5f5011993554d7c635e5Douglas Gregor } 3906d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Results.AddResult(Builder.TakeString()); 3907d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor 3908d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor // "else if" block 3909d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddTypedTextChunk("else"); 3910d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 3911d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddTextChunk("if"); 3912d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 3913d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 39144e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (getLangOpts().CPlusPlus) 3915d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddPlaceholderChunk("condition"); 3916d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor else 3917d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddPlaceholderChunk("expression"); 3918d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 3919f11641a2c651e4e9733c5f5011993554d7c635e5Douglas Gregor if (Results.includeCodePatterns()) { 3920f11641a2c651e4e9733c5f5011993554d7c635e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 3921f11641a2c651e4e9733c5f5011993554d7c635e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 3922f11641a2c651e4e9733c5f5011993554d7c635e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 3923f11641a2c651e4e9733c5f5011993554d7c635e5Douglas Gregor Builder.AddPlaceholderChunk("statements"); 3924f11641a2c651e4e9733c5f5011993554d7c635e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 3925f11641a2c651e4e9733c5f5011993554d7c635e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 3926f11641a2c651e4e9733c5f5011993554d7c635e5Douglas Gregor } 3927d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Results.AddResult(Builder.TakeString()); 3928d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor 3929d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Results.ExitScope(); 3930d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor 3931d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor if (S->getFnParent()) 39324e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie AddPrettyFunctionResults(PP.getLangOpts(), Results); 3933d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor 3934d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor if (CodeCompleter->includeMacros()) 3935d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor AddMacroResults(PP, Results); 3936d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor 3937d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 3938d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Results.data(),Results.size()); 3939d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor} 3940d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor 3941f81e5a9e3f3ff80c56e4afb4fe6311a8735f36e8Richard Trieuvoid Sema::CodeCompleteAssignmentRHS(Scope *S, Expr *LHS) { 39425ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (LHS) 39435ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor CodeCompleteExpression(S, static_cast<Expr *>(LHS)->getType()); 39445ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor else 3945e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompleteOrdinaryName(S, PCC_Expression); 39465ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor} 39475ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 39489ab14541716928894821cf5d53d6b4c95ffdf3a3Jeffrey Yasskinvoid Sema::CodeCompleteQualifiedId(Scope *S, CXXScopeSpec &SS, 394981b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor bool EnteringContext) { 395081b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor if (!SS.getScopeRep() || !CodeCompleter) 395181b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor return; 395281b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor 395386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor DeclContext *Ctx = computeDeclContext(SS, EnteringContext); 395486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!Ctx) 395586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return; 3956d1cd31aeb806077340be94e32429f3192cf139b0Douglas Gregor 3957d1cd31aeb806077340be94e32429f3192cf139b0Douglas Gregor // Try to instantiate any non-dependent declaration contexts before 3958d1cd31aeb806077340be94e32429f3192cf139b0Douglas Gregor // we look in them. 395977bb1aa78bcd26e42c0382043e65a2b03242be4dJohn McCall if (!isDependentScopeSpecifier(SS) && RequireCompleteDeclContext(SS, Ctx)) 3960d1cd31aeb806077340be94e32429f3192cf139b0Douglas Gregor return; 3961d1cd31aeb806077340be94e32429f3192cf139b0Douglas Gregor 3962218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 396328a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 3964218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Name); 3965f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor Results.EnterNewScope(); 396652779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor 396786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // The "template" keyword can follow "::" in the grammar, but only 396886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // put it into the grammar if the nested-name-specifier is dependent. 396986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NestedNameSpecifier *NNS = (NestedNameSpecifier *)SS.getScopeRep(); 397086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!Results.empty() && NNS->isDependent()) 3971a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult("template"); 3972f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor 3973f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor // Add calls to overridden virtual functions, if there are any. 3974f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor // 3975f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor // FIXME: This isn't wonderful, because we don't know whether we're actually 3976f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor // in a context that permits expressions. This is a general issue with 3977f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor // qualified-id completions. 3978f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor if (!EnteringContext) 3979f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor MaybeAddOverrideCalls(*this, Ctx, Results); 3980f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor Results.ExitScope(); 398186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 3982f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 3983f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor LookupVisibleDecls(Ctx, LookupOrdinaryName, Consumer); 3984f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor 3985e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 3986430d7a1a621a126a9ffe442ad8987ba02b46dae9Douglas Gregor Results.getCompletionContext(), 3987e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 398881b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor} 398949f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 399049f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregorvoid Sema::CodeCompleteUsing(Scope *S) { 399149f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor if (!CodeCompleter) 399249f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor return; 399349f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 3994218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 399528a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 399652779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor CodeCompletionContext::CCC_PotentiallyQualifiedName, 399752779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor &ResultBuilder::IsNestedNameSpecifier); 39988e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.EnterNewScope(); 399986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 400086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // If we aren't in class scope, we could see the "namespace" keyword. 400186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!S->isClassScope()) 40020a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall Results.AddResult(CodeCompletionResult("namespace")); 400386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 400486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // After "using", we can see anything that would start a 400586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // nested-name-specifier. 40065d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 40078071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 40088071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompleter->includeGlobals()); 40098e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.ExitScope(); 401086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 4011e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 401252779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor CodeCompletionContext::CCC_PotentiallyQualifiedName, 4013e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 401449f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor} 401549f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 401649f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregorvoid Sema::CodeCompleteUsingDirective(Scope *S) { 401749f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor if (!CodeCompleter) 401849f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor return; 401949f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 402086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // After "using namespace", we expect to see a namespace name or namespace 402186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // alias. 4022218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 402328a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 4024218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Namespace, 402552779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor &ResultBuilder::IsNamespaceOrAlias); 40268e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.EnterNewScope(); 40275d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 40288071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 40298071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompleter->includeGlobals()); 40308e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.ExitScope(); 4031e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 40328071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompletionContext::CCC_Namespace, 4033e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 403449f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor} 403549f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 403649f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregorvoid Sema::CodeCompleteNamespaceDecl(Scope *S) { 403749f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor if (!CodeCompleter) 403849f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor return; 403949f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 404086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor DeclContext *Ctx = (DeclContext *)S->getEntity(); 404186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!S->getParent()) 404286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Ctx = Context.getTranslationUnitDecl(); 404386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 404452779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor bool SuppressedGlobalResults 404552779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor = Ctx && !CodeCompleter->includeGlobals() && isa<TranslationUnitDecl>(Ctx); 404652779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor 4047218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 404828a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 404952779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor SuppressedGlobalResults 405052779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor ? CodeCompletionContext::CCC_Namespace 405152779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor : CodeCompletionContext::CCC_Other, 405252779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor &ResultBuilder::IsNamespace); 405352779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor 405452779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor if (Ctx && Ctx->isFileContext() && !SuppressedGlobalResults) { 405586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // We only want to see those namespaces that have already been defined 405686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // within this scope, because its likely that the user is creating an 405786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // extended namespace declaration. Keep track of the most recent 405886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // definition of each namespace. 405986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor std::map<NamespaceDecl *, NamespaceDecl *> OrigToLatest; 406086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor for (DeclContext::specific_decl_iterator<NamespaceDecl> 406186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NS(Ctx->decls_begin()), NSEnd(Ctx->decls_end()); 406286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NS != NSEnd; ++NS) 4063581deb3da481053c4993c7600f97acf7768caac5David Blaikie OrigToLatest[NS->getOriginalNamespace()] = *NS; 406486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 406586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add the most recent definition (or extended definition) of each 406686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // namespace to the list of results. 40678e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.EnterNewScope(); 406886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor for (std::map<NamespaceDecl *, NamespaceDecl *>::iterator 4069ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor NS = OrigToLatest.begin(), 4070ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor NSEnd = OrigToLatest.end(); 407186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NS != NSEnd; ++NS) 40720a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall Results.AddResult(CodeCompletionResult(NS->second, 0), 4073608300be1972c43fe99154d25d62d697e7c0a0c2Douglas Gregor CurContext, 0, false); 40748e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.ExitScope(); 407586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 407686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 4077e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 407852779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor Results.getCompletionContext(), 4079e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 408049f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor} 408149f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 408249f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregorvoid Sema::CodeCompleteNamespaceAliasDecl(Scope *S) { 408349f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor if (!CodeCompleter) 408449f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor return; 408549f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 408686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // After "namespace", we expect to see a namespace or alias. 4087218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 408828a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 4089218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Namespace, 409052779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor &ResultBuilder::IsNamespaceOrAlias); 40915d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 40928071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 40938071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompleter->includeGlobals()); 4094e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 409552779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor Results.getCompletionContext(), 4096e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 409749f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor} 409849f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 4099ed8d322b4086b8b1e1f78b21389cabb23457dcb3Douglas Gregorvoid Sema::CodeCompleteOperatorName(Scope *S) { 4100ed8d322b4086b8b1e1f78b21389cabb23457dcb3Douglas Gregor if (!CodeCompleter) 4101ed8d322b4086b8b1e1f78b21389cabb23457dcb3Douglas Gregor return; 410286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 41030a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 4104218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 410528a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 4106218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Type, 410752779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor &ResultBuilder::IsType); 41088e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.EnterNewScope(); 410986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 411086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add the names of overloadable operators. 411186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 411286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (std::strcmp(Spelling, "?")) \ 4113a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Spelling)); 411486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor#include "clang/Basic/OperatorKinds.def" 411586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 411686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add any type names visible from the current scope 411745bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor Results.allowNestedNameSpecifiers(); 41185d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 41198071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 41208071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompleter->includeGlobals()); 412186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 412286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add any type specifiers 41234e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie AddTypeSpecifierResults(getLangOpts(), Results); 41248e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.ExitScope(); 4125ed8d322b4086b8b1e1f78b21389cabb23457dcb3Douglas Gregor 4126e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 41278071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompletionContext::CCC_Type, 4128e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 4129c464ae8444edb6d07ea49b7a0eae1674c0fa1bb8Douglas Gregor} 4130c464ae8444edb6d07ea49b7a0eae1674c0fa1bb8Douglas Gregor 41310133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregorvoid Sema::CodeCompleteConstructorInitializer(Decl *ConstructorD, 4132cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt CXXCtorInitializer** Initializers, 41330133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor unsigned NumInitializers) { 41348987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor PrintingPolicy Policy = getCompletionPrintingPolicy(*this); 41350133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor CXXConstructorDecl *Constructor 41360133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor = static_cast<CXXConstructorDecl *>(ConstructorD); 41370133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor if (!Constructor) 41380133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor return; 41390133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor 4140218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 414128a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 414252779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor CodeCompletionContext::CCC_PotentiallyQualifiedName); 41430133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor Results.EnterNewScope(); 41440133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor 41450133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor // Fill in any already-initialized fields or base classes. 41460133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor llvm::SmallPtrSet<FieldDecl *, 4> InitializedFields; 41470133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor llvm::SmallPtrSet<CanQualType, 4> InitializedBases; 41480133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor for (unsigned I = 0; I != NumInitializers; ++I) { 41490133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor if (Initializers[I]->isBaseInitializer()) 41500133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor InitializedBases.insert( 41510133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor Context.getCanonicalType(QualType(Initializers[I]->getBaseClass(), 0))); 41520133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor else 415300eb3f9c5b33e3d99aee1f8b75dd9c9678fdd66bFrancois Pichet InitializedFields.insert(cast<FieldDecl>( 415400eb3f9c5b33e3d99aee1f8b75dd9c9678fdd66bFrancois Pichet Initializers[I]->getAnyMember())); 41550133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor } 41560133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor 41570133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor // Add completions for base classes. 415828a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Builder(Results.getAllocator(), 415928a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis Results.getCodeCompletionTUInfo()); 41600c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor bool SawLastInitializer = (NumInitializers == 0); 41610133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor CXXRecordDecl *ClassDecl = Constructor->getParent(); 41620133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor for (CXXRecordDecl::base_class_iterator Base = ClassDecl->bases_begin(), 41630133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor BaseEnd = ClassDecl->bases_end(); 41640133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor Base != BaseEnd; ++Base) { 41650c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor if (!InitializedBases.insert(Context.getCanonicalType(Base->getType()))) { 41660c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor SawLastInitializer 41670c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor = NumInitializers > 0 && 41680c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor Initializers[NumInitializers - 1]->isBaseInitializer() && 41690c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor Context.hasSameUnqualifiedType(Base->getType(), 41700c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor QualType(Initializers[NumInitializers - 1]->getBaseClass(), 0)); 41710133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor continue; 41720c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor } 41730133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor 4174218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk( 4175dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Results.getAllocator().CopyString( 4176f85e193739c953358c865005855253af4f68a497John McCall Base->getType().getAsString(Policy))); 4177218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4178218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("args"); 4179218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 4180218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(CodeCompletionResult(Builder.TakeString(), 41810c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor SawLastInitializer? CCP_NextInitializer 41820c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor : CCP_MemberDeclaration)); 41830c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor SawLastInitializer = false; 41840133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor } 41850133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor 41860133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor // Add completions for virtual base classes. 41870133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor for (CXXRecordDecl::base_class_iterator Base = ClassDecl->vbases_begin(), 41880133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor BaseEnd = ClassDecl->vbases_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 Builder.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 members. 42120133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor for (CXXRecordDecl::field_iterator Field = ClassDecl->field_begin(), 42130133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor FieldEnd = ClassDecl->field_end(); 42140133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor Field != FieldEnd; ++Field) { 42150c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor if (!InitializedFields.insert(cast<FieldDecl>(Field->getCanonicalDecl()))) { 42160c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor SawLastInitializer 42170c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor = NumInitializers > 0 && 421800eb3f9c5b33e3d99aee1f8b75dd9c9678fdd66bFrancois Pichet Initializers[NumInitializers - 1]->isAnyMemberInitializer() && 4219581deb3da481053c4993c7600f97acf7768caac5David Blaikie Initializers[NumInitializers - 1]->getAnyMember() == *Field; 42200133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor continue; 42210c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor } 42220133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor 42230133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor if (!Field->getDeclName()) 42240133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor continue; 42250133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor 4226dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddTypedTextChunk(Builder.getAllocator().CopyString( 4227218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Field->getIdentifier()->getName())); 4228218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4229218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("args"); 4230218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 4231218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(CodeCompletionResult(Builder.TakeString(), 42320c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor SawLastInitializer? CCP_NextInitializer 4233a67e03fdf1ae8a1f92463a307d0b6281f1161f40Douglas Gregor : CCP_MemberDeclaration, 4234ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor CXCursor_MemberRef, 4235ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor CXAvailability_Available, 4236581deb3da481053c4993c7600f97acf7768caac5David Blaikie *Field)); 42370c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor SawLastInitializer = false; 42380133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor } 42390133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor Results.ExitScope(); 42400133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor 424152779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 42420133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor Results.data(), Results.size()); 42430133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor} 42440133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor 424581f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor/// \brief Determine whether this scope denotes a namespace. 424681f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregorstatic bool isNamespaceScope(Scope *S) { 424781f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor DeclContext *DC = static_cast<DeclContext *>(S->getEntity()); 424881f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor if (!DC) 424981f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor return false; 425081f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor 425181f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor return DC->isFileContext(); 425281f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor} 425381f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor 425481f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregorvoid Sema::CodeCompleteLambdaIntroducer(Scope *S, LambdaIntroducer &Intro, 425581f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor bool AfterAmpersand) { 425681f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 425728a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 425881f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor CodeCompletionContext::CCC_Other); 425981f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor Results.EnterNewScope(); 426081f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor 426181f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor // Note what has already been captured. 426281f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor llvm::SmallPtrSet<IdentifierInfo *, 4> Known; 426381f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor bool IncludedThis = false; 426481f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor for (SmallVectorImpl<LambdaCapture>::iterator C = Intro.Captures.begin(), 426581f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor CEnd = Intro.Captures.end(); 426681f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor C != CEnd; ++C) { 426781f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor if (C->Kind == LCK_This) { 426881f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor IncludedThis = true; 426981f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor continue; 427081f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor } 427181f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor 427281f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor Known.insert(C->Id); 427381f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor } 427481f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor 427581f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor // Look for other capturable variables. 427681f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor for (; S && !isNamespaceScope(S); S = S->getParent()) { 427781f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor for (Scope::decl_iterator D = S->decl_begin(), DEnd = S->decl_end(); 427881f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor D != DEnd; ++D) { 427981f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor VarDecl *Var = dyn_cast<VarDecl>(*D); 428081f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor if (!Var || 428181f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor !Var->hasLocalStorage() || 428281f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor Var->hasAttr<BlocksAttr>()) 428381f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor continue; 428481f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor 428581f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor if (Known.insert(Var->getIdentifier())) 428681f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor Results.AddResult(CodeCompletionResult(Var), CurContext, 0, false); 428781f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor } 428881f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor } 428981f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor 429081f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor // Add 'this', if it would be valid. 429181f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor if (!IncludedThis && !AfterAmpersand && Intro.Default != LCD_ByCopy) 429281f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor addThisCompletion(*this, Results); 429381f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor 429481f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor Results.ExitScope(); 429581f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor 429681f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 429781f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor Results.data(), Results.size()); 429881f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor} 429981f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor 4300a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett/// Macro that optionally prepends an "@" to the string literal passed in via 4301a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett/// Keyword, depending on whether NeedAt is true or false. 4302a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett#define OBJC_AT_KEYWORD_NAME(NeedAt,Keyword) ((NeedAt)? "@" Keyword : Keyword) 4303a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett 4304bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCImplementationResults(const LangOptions &LangOpts, 4305b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor ResultBuilder &Results, 4306b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor bool NeedAt) { 43070a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 4308b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // Since we have an implementation, we can end it. 4309a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,"end"))); 4310b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 431128a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Builder(Results.getAllocator(), 431228a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis Results.getCodeCompletionTUInfo()); 4313b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor if (LangOpts.ObjC2) { 4314b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @dynamic 4315a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"dynamic")); 4316218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4317218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("property"); 4318218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 4319b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 4320b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @synthesize 4321a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"synthesize")); 4322218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4323218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("property"); 4324218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 4325b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor } 4326b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor} 4327c464ae8444edb6d07ea49b7a0eae1674c0fa1bb8Douglas Gregor 4328bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCInterfaceResults(const LangOptions &LangOpts, 4329b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor ResultBuilder &Results, 4330b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor bool NeedAt) { 43310a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 4332b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 4333b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // Since we have an interface or protocol, we can end it. 4334a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,"end"))); 4335b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 4336b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor if (LangOpts.ObjC2) { 4337b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @property 4338a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,"property"))); 4339b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 4340b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @required 4341a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,"required"))); 4342b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 4343b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @optional 4344a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,"optional"))); 4345b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor } 4346b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor} 4347834389b87451b24618513b907b4dfb5b00d211f3Douglas Gregor 4348bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCTopLevelResults(ResultBuilder &Results, bool NeedAt) { 43490a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 435028a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Builder(Results.getAllocator(), 435128a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis Results.getCodeCompletionTUInfo()); 4352b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 4353b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @class name ; 4354a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"class")); 4355218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4356218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("name"); 4357218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 4358b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 4359c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor if (Results.includeCodePatterns()) { 4360c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // @interface name 4361c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // FIXME: Could introduce the whole pattern, including superclasses and 4362c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // such. 4363a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"interface")); 4364218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4365218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("class"); 4366218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 4367b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 4368c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // @protocol name 4369a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"protocol")); 4370218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4371218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("protocol"); 4372218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 4373c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor 4374c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // @implementation name 4375a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"implementation")); 4376218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4377218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("class"); 4378218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 4379c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor } 4380b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 4381b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @compatibility_alias name 4382a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"compatibility_alias")); 4383218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4384218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("alias"); 4385218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4386218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("class"); 4387218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 4388b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor} 4389834389b87451b24618513b907b4dfb5b00d211f3Douglas Gregor 4390a28948f34817476d02412fa204cae038e228c827Fariborz Jahanianvoid Sema::CodeCompleteObjCAtDirective(Scope *S) { 43910a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 4392218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 439328a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 4394218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 4395b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Results.EnterNewScope(); 4396a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian if (isa<ObjCImplDecl>(CurContext)) 43974e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie AddObjCImplementationResults(getLangOpts(), Results, false); 4398a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian else if (CurContext->isObjCContainer()) 43994e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie AddObjCInterfaceResults(getLangOpts(), Results, false); 4400b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor else 4401bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCTopLevelResults(Results, false); 4402c464ae8444edb6d07ea49b7a0eae1674c0fa1bb8Douglas Gregor Results.ExitScope(); 4403e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 4404e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 4405e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 44069a0c85e640a08174569a303db22981612f05d385Douglas Gregor} 44079a0c85e640a08174569a303db22981612f05d385Douglas Gregor 4408bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCExpressionResults(ResultBuilder &Results, bool NeedAt) { 44090a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 441028a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Builder(Results.getAllocator(), 441128a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis Results.getCodeCompletionTUInfo()); 44129a0c85e640a08174569a303db22981612f05d385Douglas Gregor 44139a0c85e640a08174569a303db22981612f05d385Douglas Gregor // @encode ( type-name ) 44148ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor const char *EncodeType = "char[]"; 44154e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (Results.getSema().getLangOpts().CPlusPlus || 44164e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie Results.getSema().getLangOpts().ConstStrings) 44178ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor EncodeType = " const char[]"; 44188ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk(EncodeType); 4419a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"encode")); 4420218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4421218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("type-name"); 4422218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 4423218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 44249a0c85e640a08174569a303db22981612f05d385Douglas Gregor 44259a0c85e640a08174569a303db22981612f05d385Douglas Gregor // @protocol ( protocol-name ) 44268ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("Protocol *"); 4427a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"protocol")); 4428218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4429218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("protocol-name"); 4430218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 4431218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 44329a0c85e640a08174569a303db22981612f05d385Douglas Gregor 44339a0c85e640a08174569a303db22981612f05d385Douglas Gregor // @selector ( selector ) 44348ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("SEL"); 4435a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"selector")); 4436218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4437218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("selector"); 4438218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 4439218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 4440ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek 4441ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek // @[ objects, ... ] 4442a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"[")); 4443ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4444ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek Builder.AddPlaceholderChunk("objects, ..."); 4445ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4446ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek Builder.AddChunk(CodeCompletionString::CK_RightBracket); 4447ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek Results.AddResult(Result(Builder.TakeString())); 4448ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek 4449ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek // @{ key : object, ... } 4450a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"{")); 4451ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4452ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek Builder.AddPlaceholderChunk("key"); 4453ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4454ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek Builder.AddChunk(CodeCompletionString::CK_Colon); 4455ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4456ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek Builder.AddPlaceholderChunk("object, ..."); 4457ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4458ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek Builder.AddChunk(CodeCompletionString::CK_RightBrace); 4459ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek Results.AddResult(Result(Builder.TakeString())); 44609a0c85e640a08174569a303db22981612f05d385Douglas Gregor} 44619a0c85e640a08174569a303db22981612f05d385Douglas Gregor 4462bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCStatementResults(ResultBuilder &Results, bool NeedAt) { 44630a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 446428a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Builder(Results.getAllocator(), 446528a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis Results.getCodeCompletionTUInfo()); 4466b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 4467c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor if (Results.includeCodePatterns()) { 4468c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // @try { statements } @catch ( declaration ) { statements } @finally 4469c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // { statements } 4470a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"try")); 4471218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 4472218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("statements"); 4473218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 4474218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("@catch"); 4475218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4476218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("parameter"); 4477218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 4478218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 4479218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("statements"); 4480218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 4481218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("@finally"); 4482218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 4483218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("statements"); 4484218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 4485218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 4486c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor } 4487b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 44889a0c85e640a08174569a303db22981612f05d385Douglas Gregor // @throw 4489a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"throw")); 4490218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4491218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 4492218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 4493b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 4494c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor if (Results.includeCodePatterns()) { 4495c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // @synchronized ( expression ) { statements } 4496a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"synchronized")); 4497218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4498218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4499218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 4500218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 4501218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 4502218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("statements"); 4503218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 4504218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 4505c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor } 4506b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor} 45079a0c85e640a08174569a303db22981612f05d385Douglas Gregor 4508bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCVisibilityResults(const LangOptions &LangOpts, 4509c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor ResultBuilder &Results, 4510c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor bool NeedAt) { 45110a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 4512a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,"private"))); 4513a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,"protected"))); 4514a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,"public"))); 4515c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor if (LangOpts.ObjC2) 4516a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,"package"))); 4517c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor} 4518c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor 4519c38c3e1e726630458154534227d74eda833d26a0Douglas Gregorvoid Sema::CodeCompleteObjCAtVisibility(Scope *S) { 4520218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 452128a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 4522218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 4523c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor Results.EnterNewScope(); 45244e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie AddObjCVisibilityResults(getLangOpts(), Results, false); 4525c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor Results.ExitScope(); 4526e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 4527e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 4528e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 4529c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor} 4530c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor 4531c38c3e1e726630458154534227d74eda833d26a0Douglas Gregorvoid Sema::CodeCompleteObjCAtStatement(Scope *S) { 4532218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 453328a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 4534218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 4535b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Results.EnterNewScope(); 4536bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCStatementResults(Results, false); 4537bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCExpressionResults(Results, false); 45389a0c85e640a08174569a303db22981612f05d385Douglas Gregor Results.ExitScope(); 4539e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 4540e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 4541e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 45429a0c85e640a08174569a303db22981612f05d385Douglas Gregor} 45439a0c85e640a08174569a303db22981612f05d385Douglas Gregor 45449a0c85e640a08174569a303db22981612f05d385Douglas Gregorvoid Sema::CodeCompleteObjCAtExpression(Scope *S) { 4545218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 454628a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 4547218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 45489a0c85e640a08174569a303db22981612f05d385Douglas Gregor Results.EnterNewScope(); 4549bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCExpressionResults(Results, false); 45509a0c85e640a08174569a303db22981612f05d385Douglas Gregor Results.ExitScope(); 4551e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 4552e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 4553e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 4554ed8d322b4086b8b1e1f78b21389cabb23457dcb3Douglas Gregor} 455549f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 4556988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor/// \brief Determine whether the addition of the given flag to an Objective-C 4557988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor/// property's attributes will cause a conflict. 4558988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregorstatic bool ObjCPropertyFlagConflicts(unsigned Attributes, unsigned NewFlag) { 4559988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor // Check if we've already added this flag. 4560988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (Attributes & NewFlag) 4561988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor return true; 4562988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor 4563988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor Attributes |= NewFlag; 4564988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor 4565988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor // Check for collisions with "readonly". 4566988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if ((Attributes & ObjCDeclSpec::DQ_PR_readonly) && 4567988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor (Attributes & (ObjCDeclSpec::DQ_PR_readwrite | 4568988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor ObjCDeclSpec::DQ_PR_assign | 4569f85e193739c953358c865005855253af4f68a497John McCall ObjCDeclSpec::DQ_PR_unsafe_unretained | 4570988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor ObjCDeclSpec::DQ_PR_copy | 4571f85e193739c953358c865005855253af4f68a497John McCall ObjCDeclSpec::DQ_PR_retain | 4572f85e193739c953358c865005855253af4f68a497John McCall ObjCDeclSpec::DQ_PR_strong))) 4573988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor return true; 4574988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor 4575f85e193739c953358c865005855253af4f68a497John McCall // Check for more than one of { assign, copy, retain, strong }. 4576988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor unsigned AssignCopyRetMask = Attributes & (ObjCDeclSpec::DQ_PR_assign | 4577f85e193739c953358c865005855253af4f68a497John McCall ObjCDeclSpec::DQ_PR_unsafe_unretained | 4578988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor ObjCDeclSpec::DQ_PR_copy | 4579f85e193739c953358c865005855253af4f68a497John McCall ObjCDeclSpec::DQ_PR_retain| 4580f85e193739c953358c865005855253af4f68a497John McCall ObjCDeclSpec::DQ_PR_strong); 4581988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (AssignCopyRetMask && 4582988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor AssignCopyRetMask != ObjCDeclSpec::DQ_PR_assign && 4583f85e193739c953358c865005855253af4f68a497John McCall AssignCopyRetMask != ObjCDeclSpec::DQ_PR_unsafe_unretained && 4584988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor AssignCopyRetMask != ObjCDeclSpec::DQ_PR_copy && 4585f85e193739c953358c865005855253af4f68a497John McCall AssignCopyRetMask != ObjCDeclSpec::DQ_PR_retain && 4586f85e193739c953358c865005855253af4f68a497John McCall AssignCopyRetMask != ObjCDeclSpec::DQ_PR_strong) 4587988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor return true; 4588988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor 4589988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor return false; 4590988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor} 4591988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor 4592a93b108e025ef2480fa867cc533e7781a40a639bDouglas Gregorvoid Sema::CodeCompleteObjCPropertyFlags(Scope *S, ObjCDeclSpec &ODS) { 4593ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff if (!CodeCompleter) 4594ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff return; 4595d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor 4596ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff unsigned Attributes = ODS.getPropertyAttributes(); 4597ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff 45980a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 4599218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 460028a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 4601218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 4602ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff Results.EnterNewScope(); 4603988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_readonly)) 46040a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall Results.AddResult(CodeCompletionResult("readonly")); 4605988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_assign)) 46060a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall Results.AddResult(CodeCompletionResult("assign")); 4607f85e193739c953358c865005855253af4f68a497John McCall if (!ObjCPropertyFlagConflicts(Attributes, 4608f85e193739c953358c865005855253af4f68a497John McCall ObjCDeclSpec::DQ_PR_unsafe_unretained)) 4609f85e193739c953358c865005855253af4f68a497John McCall Results.AddResult(CodeCompletionResult("unsafe_unretained")); 4610988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_readwrite)) 46110a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall Results.AddResult(CodeCompletionResult("readwrite")); 4612988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_retain)) 46130a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall Results.AddResult(CodeCompletionResult("retain")); 4614f85e193739c953358c865005855253af4f68a497John McCall if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_strong)) 4615f85e193739c953358c865005855253af4f68a497John McCall Results.AddResult(CodeCompletionResult("strong")); 4616988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_copy)) 46170a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall Results.AddResult(CodeCompletionResult("copy")); 4618988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_nonatomic)) 46190a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall Results.AddResult(CodeCompletionResult("nonatomic")); 462027f45236005d9dd2bbbfeb1682eb349cb8b6998bFariborz Jahanian if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_atomic)) 462127f45236005d9dd2bbbfeb1682eb349cb8b6998bFariborz Jahanian Results.AddResult(CodeCompletionResult("atomic")); 4622988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_setter)) { 462328a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Setter(Results.getAllocator(), 462428a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis Results.getCodeCompletionTUInfo()); 4625218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Setter.AddTypedTextChunk("setter"); 4626218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Setter.AddTextChunk(" = "); 4627218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Setter.AddPlaceholderChunk("method"); 4628218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(CodeCompletionResult(Setter.TakeString())); 462954f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor } 4630988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_getter)) { 463128a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Getter(Results.getAllocator(), 463228a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis Results.getCodeCompletionTUInfo()); 4633218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Getter.AddTypedTextChunk("getter"); 4634218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Getter.AddTextChunk(" = "); 4635218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Getter.AddPlaceholderChunk("method"); 4636218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(CodeCompletionResult(Getter.TakeString())); 463754f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor } 4638ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff Results.ExitScope(); 4639e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 4640e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 4641e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 4642ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff} 4643c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff 46444ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor/// \brief Descripts the kind of Objective-C method that we want to find 46454ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor/// via code completion. 46464ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregorenum ObjCMethodKind { 464749fdccb4595862828aa5cadc1497d466a8031ddaDmitri Gribenko MK_Any, ///< Any kind of method, provided it means other specified criteria. 464849fdccb4595862828aa5cadc1497d466a8031ddaDmitri Gribenko MK_ZeroArgSelector, ///< Zero-argument (unary) selector. 464949fdccb4595862828aa5cadc1497d466a8031ddaDmitri Gribenko MK_OneArgSelector ///< One-argument selector. 46504ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor}; 46514ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 4652458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregorstatic bool isAcceptableObjCSelector(Selector Sel, 4653458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor ObjCMethodKind WantKind, 4654458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor IdentifierInfo **SelIdents, 4655cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor unsigned NumSelIdents, 4656cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor bool AllowSameLength = true) { 46574ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (NumSelIdents > Sel.getNumArgs()) 46584ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor return false; 4659458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor 46604ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor switch (WantKind) { 4661458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor case MK_Any: break; 4662458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor case MK_ZeroArgSelector: return Sel.isUnarySelector(); 4663458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor case MK_OneArgSelector: return Sel.getNumArgs() == 1; 46644ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor } 4665458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor 4666cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor if (!AllowSameLength && NumSelIdents && NumSelIdents == Sel.getNumArgs()) 4667cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor return false; 4668cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor 46694ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor for (unsigned I = 0; I != NumSelIdents; ++I) 46704ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (SelIdents[I] != Sel.getIdentifierInfoForSlot(I)) 46714ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor return false; 4672458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor 46734ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor return true; 46744ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor} 4675458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor 4676458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregorstatic bool isAcceptableObjCMethod(ObjCMethodDecl *Method, 4677458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor ObjCMethodKind WantKind, 4678458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor IdentifierInfo **SelIdents, 4679cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor unsigned NumSelIdents, 4680cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor bool AllowSameLength = true) { 4681458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor return isAcceptableObjCSelector(Method->getSelector(), WantKind, SelIdents, 4682cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor NumSelIdents, AllowSameLength); 4683458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor} 4684d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor 4685d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregornamespace { 4686d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor /// \brief A set of selectors, which is used to avoid introducing multiple 4687d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor /// completions with the same selector into the result set. 4688d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor typedef llvm::SmallPtrSet<Selector, 16> VisitedSelectorSet; 4689d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor} 4690d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor 469136ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// \brief Add all of the Objective-C methods in the given Objective-C 469236ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// container to the set of results. 469336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// 469436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// The container will be a class, protocol, category, or implementation of 469536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// any of the above. This mether will recurse to include methods from 469636ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// the superclasses of classes along with their categories, protocols, and 469736ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// implementations. 469836ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// 469936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// \param Container the container in which we'll look to find methods. 470036ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// 4701a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett/// \param WantInstanceMethods Whether to add instance methods (only); if 4702a40f792c685c3ad94fc5a0ef538d0661374c7825James Dennett/// false, this routine will add factory methods (only). 470336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// 470436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// \param CurContext the context in which we're performing the lookup that 470536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// finds methods. 470636ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// 4707cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor/// \param AllowSameLength Whether we allow a method to be added to the list 4708cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor/// when it has the same number of parameters as we have selector identifiers. 4709cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor/// 471036ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// \param Results the structure into which we'll add results. 471136ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregorstatic void AddObjCMethods(ObjCContainerDecl *Container, 471236ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor bool WantInstanceMethods, 47134ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor ObjCMethodKind WantKind, 4714d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor IdentifierInfo **SelIdents, 4715d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor unsigned NumSelIdents, 471636ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor DeclContext *CurContext, 4717d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor VisitedSelectorSet &Selectors, 4718cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor bool AllowSameLength, 4719408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor ResultBuilder &Results, 4720408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor bool InOriginalClass = true) { 47210a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 4722b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor Container = getContainerDef(Container); 472336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor for (ObjCContainerDecl::method_iterator M = Container->meth_begin(), 472436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor MEnd = Container->meth_end(); 472536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor M != MEnd; ++M) { 4726262bc18e32500558af7cb0afa205b34bd37bafedDavid Blaikie if (M->isInstanceMethod() == WantInstanceMethods) { 4727d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor // Check whether the selector identifiers we've been given are a 4728d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor // subset of the identifiers for this particular method. 4729581deb3da481053c4993c7600f97acf7768caac5David Blaikie if (!isAcceptableObjCMethod(*M, WantKind, SelIdents, NumSelIdents, 4730cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor AllowSameLength)) 4731d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor continue; 47324ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 4733262bc18e32500558af7cb0afa205b34bd37bafedDavid Blaikie if (!Selectors.insert(M->getSelector())) 4734d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor continue; 4735d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor 4736581deb3da481053c4993c7600f97acf7768caac5David Blaikie Result R = Result(*M, 0); 4737d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor R.StartParameter = NumSelIdents; 47384ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor R.AllParametersAreInformative = (WantKind != MK_Any); 4739408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor if (!InOriginalClass) 4740408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor R.Priority += CCD_InBaseClass; 4741d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor Results.MaybeAddResult(R, CurContext); 4742d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor } 474336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor } 474436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 4745e396c7bd99ed99fd8136fadc8945791754c61b16Douglas Gregor // Visit the protocols of protocols. 4746e396c7bd99ed99fd8136fadc8945791754c61b16Douglas Gregor if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) { 47475e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor if (Protocol->hasDefinition()) { 47485e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor const ObjCList<ObjCProtocolDecl> &Protocols 47495e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor = Protocol->getReferencedProtocols(); 47505e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 47515e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor E = Protocols.end(); 47525e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor I != E; ++I) 47535e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents, 47545e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor NumSelIdents, CurContext, Selectors, AllowSameLength, 47555e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor Results, false); 47565e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor } 4757e396c7bd99ed99fd8136fadc8945791754c61b16Douglas Gregor } 4758e396c7bd99ed99fd8136fadc8945791754c61b16Douglas Gregor 475936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container); 47602e5c15be82f362611c5928ce853d0685ff98c766Douglas Gregor if (!IFace || !IFace->hasDefinition()) 476136ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor return; 476236ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 476336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add methods in protocols. 4764a5f4441de7890953460d95f4e88b9fa432b48dc2Argyrios Kyrtzidis for (ObjCInterfaceDecl::protocol_iterator I = IFace->protocol_begin(), 4765a5f4441de7890953460d95f4e88b9fa432b48dc2Argyrios Kyrtzidis E = IFace->protocol_end(); 476636ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor I != E; ++I) 47674ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents, NumSelIdents, 4768cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor CurContext, Selectors, AllowSameLength, Results, false); 476936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 477036ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add methods in categories. 477136ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor for (ObjCCategoryDecl *CatDecl = IFace->getCategoryList(); CatDecl; 477236ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor CatDecl = CatDecl->getNextClassCategory()) { 47734ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(CatDecl, WantInstanceMethods, WantKind, SelIdents, 4774cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor NumSelIdents, CurContext, Selectors, AllowSameLength, 4775cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor Results, InOriginalClass); 477636ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 477736ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add a categories protocol methods. 477836ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor const ObjCList<ObjCProtocolDecl> &Protocols 477936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor = CatDecl->getReferencedProtocols(); 478036ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 478136ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor E = Protocols.end(); 478236ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor I != E; ++I) 47834ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents, 4784cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor NumSelIdents, CurContext, Selectors, AllowSameLength, 4785cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor Results, false); 478636ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 478736ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add methods in category implementations. 478836ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor if (ObjCCategoryImplDecl *Impl = CatDecl->getImplementation()) 47894ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(Impl, WantInstanceMethods, WantKind, SelIdents, 4790cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor NumSelIdents, CurContext, Selectors, AllowSameLength, 4791cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor Results, InOriginalClass); 479236ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor } 479336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 479436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add methods in superclass. 479536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor if (IFace->getSuperClass()) 47964ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(IFace->getSuperClass(), WantInstanceMethods, WantKind, 4797cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor SelIdents, NumSelIdents, CurContext, Selectors, 4798cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor AllowSameLength, Results, false); 479936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 480036ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add methods in our implementation, if any. 480136ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor if (ObjCImplementationDecl *Impl = IFace->getImplementation()) 48024ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(Impl, WantInstanceMethods, WantKind, SelIdents, 4803cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor NumSelIdents, CurContext, Selectors, AllowSameLength, 4804cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor Results, InOriginalClass); 48054ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor} 48064ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 48074ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 4808a28948f34817476d02412fa204cae038e228c827Fariborz Jahanianvoid Sema::CodeCompleteObjCPropertyGetter(Scope *S) { 48090a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 48104ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 48114ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor // Try to find the interface where getters might live. 4812a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurContext); 48134ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (!Class) { 48144ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (ObjCCategoryDecl *Category 4815a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian = dyn_cast_or_null<ObjCCategoryDecl>(CurContext)) 48164ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Class = Category->getClassInterface(); 48174ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 48184ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (!Class) 48194ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor return; 48204ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor } 48214ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 48224ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor // Find all of the potential getters. 4823218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 482428a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 4825218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 48264ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Results.EnterNewScope(); 48274ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 4828d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor VisitedSelectorSet Selectors; 4829d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor AddObjCMethods(Class, true, MK_ZeroArgSelector, 0, 0, CurContext, Selectors, 4830cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor /*AllowSameLength=*/true, Results); 48314ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Results.ExitScope(); 4832e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 4833e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 4834e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 48354ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor} 48364ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 4837a28948f34817476d02412fa204cae038e228c827Fariborz Jahanianvoid Sema::CodeCompleteObjCPropertySetter(Scope *S) { 48380a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 48394ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 48404ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor // Try to find the interface where setters might live. 48414ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor ObjCInterfaceDecl *Class 4842a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian = dyn_cast_or_null<ObjCInterfaceDecl>(CurContext); 48434ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (!Class) { 48444ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (ObjCCategoryDecl *Category 4845a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian = dyn_cast_or_null<ObjCCategoryDecl>(CurContext)) 48464ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Class = Category->getClassInterface(); 48474ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 48484ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (!Class) 48494ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor return; 48504ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor } 48514ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 48524ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor // Find all of the potential getters. 4853218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 485428a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 4855218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 48564ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Results.EnterNewScope(); 48574ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 4858d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor VisitedSelectorSet Selectors; 4859d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor AddObjCMethods(Class, true, MK_OneArgSelector, 0, 0, CurContext, 4860cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor Selectors, /*AllowSameLength=*/true, Results); 48614ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 48624ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Results.ExitScope(); 4863e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 4864e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 4865e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 486636ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor} 486736ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 4868afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregorvoid Sema::CodeCompleteObjCPassingType(Scope *S, ObjCDeclSpec &DS, 4869afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor bool IsParameter) { 48700a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 4871218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 487228a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 4873218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Type); 4874d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor Results.EnterNewScope(); 4875d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor 4876d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor // Add context-sensitive, Objective-C parameter-passing keywords. 4877d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor bool AddedInOut = false; 4878d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor if ((DS.getObjCDeclQualifier() & 4879d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor (ObjCDeclSpec::DQ_In | ObjCDeclSpec::DQ_Inout)) == 0) { 4880d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor Results.AddResult("in"); 4881d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor Results.AddResult("inout"); 4882d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor AddedInOut = true; 4883d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor } 4884d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor if ((DS.getObjCDeclQualifier() & 4885d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor (ObjCDeclSpec::DQ_Out | ObjCDeclSpec::DQ_Inout)) == 0) { 4886d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor Results.AddResult("out"); 4887d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor if (!AddedInOut) 4888d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor Results.AddResult("inout"); 4889d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor } 4890d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor if ((DS.getObjCDeclQualifier() & 4891d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor (ObjCDeclSpec::DQ_Bycopy | ObjCDeclSpec::DQ_Byref | 4892d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor ObjCDeclSpec::DQ_Oneway)) == 0) { 4893d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor Results.AddResult("bycopy"); 4894d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor Results.AddResult("byref"); 4895d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor Results.AddResult("oneway"); 4896d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor } 4897d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor 4898afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor // If we're completing the return type of an Objective-C method and the 4899afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor // identifier IBAction refers to a macro, provide a completion item for 4900afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor // an action, e.g., 4901afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor // IBAction)<#selector#>:(id)sender 4902afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor if (DS.getObjCDeclQualifier() == 0 && !IsParameter && 4903afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor Context.Idents.get("IBAction").hasMacroDefinition()) { 490428a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Builder(Results.getAllocator(), 490528a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis Results.getCodeCompletionTUInfo(), 490628a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CCP_CodePattern, CXAvailability_Available); 4907afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor Builder.AddTypedTextChunk("IBAction"); 49081eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Builder.AddChunk(CodeCompletionString::CK_RightParen); 4909afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor Builder.AddPlaceholderChunk("selector"); 49101eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Builder.AddChunk(CodeCompletionString::CK_Colon); 49111eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4912afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor Builder.AddTextChunk("id"); 49131eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer Builder.AddChunk(CodeCompletionString::CK_RightParen); 4914afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor Builder.AddTextChunk("sender"); 4915afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor Results.AddResult(CodeCompletionResult(Builder.TakeString())); 4916afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor } 4917afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor 4918d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor // Add various builtin type names and specifiers. 4919d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor AddOrdinaryNameResults(PCC_Type, S, *this, Results); 4920d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor Results.ExitScope(); 4921d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor 4922d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor // Add the various type names 4923d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor Results.setFilter(&ResultBuilder::IsOrdinaryNonValueName); 4924d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 4925d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 4926d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor CodeCompleter->includeGlobals()); 4927d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor 4928d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor if (CodeCompleter->includeMacros()) 4929d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor AddMacroResults(PP, Results); 4930d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor 4931d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 4932d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor CodeCompletionContext::CCC_Type, 4933d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor Results.data(), Results.size()); 4934d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor} 4935d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor 493622f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor/// \brief When we have an expression with type "id", we may assume 493722f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor/// that it has some more-specific class type based on knowledge of 493822f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor/// common uses of Objective-C. This routine returns that class type, 493922f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor/// or NULL if no better result could be determined. 494022f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregorstatic ObjCInterfaceDecl *GetAssumedMessageSendExprType(Expr *E) { 494178edf515544f0b9dddf69d6c1678fd83e94d8352Douglas Gregor ObjCMessageExpr *Msg = dyn_cast_or_null<ObjCMessageExpr>(E); 494222f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor if (!Msg) 494322f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor return 0; 494422f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor 494522f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor Selector Sel = Msg->getSelector(); 494622f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor if (Sel.isNull()) 494722f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor return 0; 494822f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor 494922f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor IdentifierInfo *Id = Sel.getIdentifierInfoForSlot(0); 495022f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor if (!Id) 495122f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor return 0; 495222f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor 495322f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor ObjCMethodDecl *Method = Msg->getMethodDecl(); 495422f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor if (!Method) 495522f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor return 0; 495622f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor 495722f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor // Determine the class that we're sending the message to. 495804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor ObjCInterfaceDecl *IFace = 0; 495904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor switch (Msg->getReceiverKind()) { 496004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor case ObjCMessageExpr::Class: 4961c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (const ObjCObjectType *ObjType 4962c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall = Msg->getClassReceiver()->getAs<ObjCObjectType>()) 4963c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall IFace = ObjType->getInterface(); 496404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor break; 496504badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor 496604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor case ObjCMessageExpr::Instance: { 496704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor QualType T = Msg->getInstanceReceiver()->getType(); 496804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor if (const ObjCObjectPointerType *Ptr = T->getAs<ObjCObjectPointerType>()) 496904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor IFace = Ptr->getInterfaceDecl(); 497004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor break; 497104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor } 497204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor 497304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor case ObjCMessageExpr::SuperInstance: 497404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor case ObjCMessageExpr::SuperClass: 497504badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor break; 497622f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor } 497722f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor 497822f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor if (!IFace) 497922f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor return 0; 498022f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor 498122f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor ObjCInterfaceDecl *Super = IFace->getSuperClass(); 498222f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor if (Method->isInstanceMethod()) 498322f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor return llvm::StringSwitch<ObjCInterfaceDecl *>(Id->getName()) 498422f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("retain", IFace) 4985f85e193739c953358c865005855253af4f68a497John McCall .Case("strong", IFace) 498622f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("autorelease", IFace) 498722f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("copy", IFace) 498822f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("copyWithZone", IFace) 498922f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("mutableCopy", IFace) 499022f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("mutableCopyWithZone", IFace) 499122f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("awakeFromCoder", IFace) 499222f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("replacementObjectFromCoder", IFace) 499322f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("class", IFace) 499422f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("classForCoder", IFace) 499522f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("superclass", Super) 499622f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Default(0); 499722f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor 499822f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor return llvm::StringSwitch<ObjCInterfaceDecl *>(Id->getName()) 499922f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("new", IFace) 500022f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("alloc", IFace) 500122f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("allocWithZone", IFace) 500222f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("class", IFace) 500322f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("superclass", Super) 500422f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Default(0); 500522f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor} 500622f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor 500703d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor// Add a special completion for a message send to "super", which fills in the 500803d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor// most likely case of forwarding all of our arguments to the superclass 500903d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor// function. 501003d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// 501103d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// \param S The semantic analysis object. 501203d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// 501303d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// \param S NeedSuperKeyword Whether we need to prefix this completion with 501403d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// the "super" keyword. Otherwise, we just need to provide the arguments. 501503d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// 501603d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// \param SelIdents The identifiers in the selector that have already been 501703d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// provided as arguments for a send to "super". 501803d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// 501903d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// \param NumSelIdents The number of identifiers in \p SelIdents. 502003d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// 502103d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// \param Results The set of results to augment. 502203d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// 502303d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// \returns the Objective-C method declaration that would be invoked by 502403d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// this "super" completion. If NULL, no completion was added. 502503d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregorstatic ObjCMethodDecl *AddSuperSendCompletion(Sema &S, bool NeedSuperKeyword, 502603d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor IdentifierInfo **SelIdents, 502703d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor unsigned NumSelIdents, 502803d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor ResultBuilder &Results) { 502903d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor ObjCMethodDecl *CurMethod = S.getCurMethodDecl(); 503003d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (!CurMethod) 503103d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor return 0; 503203d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 503303d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor ObjCInterfaceDecl *Class = CurMethod->getClassInterface(); 503403d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (!Class) 503503d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor return 0; 503603d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 503703d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor // Try to find a superclass method with the same selector. 503803d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor ObjCMethodDecl *SuperMethod = 0; 503978bcd9139f4b35be75190446c95614120d9b4c09Douglas Gregor while ((Class = Class->getSuperClass()) && !SuperMethod) { 504078bcd9139f4b35be75190446c95614120d9b4c09Douglas Gregor // Check in the class 504103d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor SuperMethod = Class->getMethod(CurMethod->getSelector(), 504203d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor CurMethod->isInstanceMethod()); 504303d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 504478bcd9139f4b35be75190446c95614120d9b4c09Douglas Gregor // Check in categories or class extensions. 504578bcd9139f4b35be75190446c95614120d9b4c09Douglas Gregor if (!SuperMethod) { 504678bcd9139f4b35be75190446c95614120d9b4c09Douglas Gregor for (ObjCCategoryDecl *Category = Class->getCategoryList(); Category; 504778bcd9139f4b35be75190446c95614120d9b4c09Douglas Gregor Category = Category->getNextClassCategory()) 504878bcd9139f4b35be75190446c95614120d9b4c09Douglas Gregor if ((SuperMethod = Category->getMethod(CurMethod->getSelector(), 504978bcd9139f4b35be75190446c95614120d9b4c09Douglas Gregor CurMethod->isInstanceMethod()))) 505078bcd9139f4b35be75190446c95614120d9b4c09Douglas Gregor break; 505178bcd9139f4b35be75190446c95614120d9b4c09Douglas Gregor } 505278bcd9139f4b35be75190446c95614120d9b4c09Douglas Gregor } 505378bcd9139f4b35be75190446c95614120d9b4c09Douglas Gregor 505403d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (!SuperMethod) 505503d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor return 0; 505603d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 505703d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor // Check whether the superclass method has the same signature. 505803d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (CurMethod->param_size() != SuperMethod->param_size() || 505903d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor CurMethod->isVariadic() != SuperMethod->isVariadic()) 506003d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor return 0; 506103d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 506203d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor for (ObjCMethodDecl::param_iterator CurP = CurMethod->param_begin(), 506303d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor CurPEnd = CurMethod->param_end(), 506403d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor SuperP = SuperMethod->param_begin(); 506503d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor CurP != CurPEnd; ++CurP, ++SuperP) { 506603d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor // Make sure the parameter types are compatible. 506703d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (!S.Context.hasSameUnqualifiedType((*CurP)->getType(), 506803d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor (*SuperP)->getType())) 506903d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor return 0; 507003d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 507103d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor // Make sure we have a parameter name to forward! 507203d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (!(*CurP)->getIdentifier()) 507303d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor return 0; 507403d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor } 507503d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 507603d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor // We have a superclass method. Now, form the send-to-super completion. 507728a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Builder(Results.getAllocator(), 507828a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis Results.getCodeCompletionTUInfo()); 507903d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 508003d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor // Give this completion a return type. 50818987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor AddResultTypeChunk(S.Context, getCompletionPrintingPolicy(S), SuperMethod, 50828987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor Builder); 508303d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 508403d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor // If we need the "super" keyword, add it (plus some spacing). 508503d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (NeedSuperKeyword) { 5086218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("super"); 5087218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 508803d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor } 508903d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 509003d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor Selector Sel = CurMethod->getSelector(); 509103d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (Sel.isUnarySelector()) { 509203d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (NeedSuperKeyword) 5093dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddTextChunk(Builder.getAllocator().CopyString( 5094813d8346529bf094eb2b249648906ba7fd226688Douglas Gregor Sel.getNameForSlot(0))); 509503d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor else 5096dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddTypedTextChunk(Builder.getAllocator().CopyString( 5097813d8346529bf094eb2b249648906ba7fd226688Douglas Gregor Sel.getNameForSlot(0))); 509803d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor } else { 509903d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor ObjCMethodDecl::param_iterator CurP = CurMethod->param_begin(); 510003d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor for (unsigned I = 0, N = Sel.getNumArgs(); I != N; ++I, ++CurP) { 510103d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (I > NumSelIdents) 5102218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 510303d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 510403d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (I < NumSelIdents) 5105218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddInformativeChunk( 5106dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.getAllocator().CopyString( 5107813d8346529bf094eb2b249648906ba7fd226688Douglas Gregor Sel.getNameForSlot(I) + ":")); 510803d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor else if (NeedSuperKeyword || I > NumSelIdents) { 5109218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk( 5110dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.getAllocator().CopyString( 5111813d8346529bf094eb2b249648906ba7fd226688Douglas Gregor Sel.getNameForSlot(I) + ":")); 5112dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddPlaceholderChunk(Builder.getAllocator().CopyString( 5113218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor (*CurP)->getIdentifier()->getName())); 511403d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor } else { 5115218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk( 5116dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.getAllocator().CopyString( 5117813d8346529bf094eb2b249648906ba7fd226688Douglas Gregor Sel.getNameForSlot(I) + ":")); 5118dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddPlaceholderChunk(Builder.getAllocator().CopyString( 5119218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor (*CurP)->getIdentifier()->getName())); 512003d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor } 512103d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor } 512203d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor } 512303d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 5124ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor Results.AddResult(CodeCompletionResult(Builder.TakeString(), SuperMethod, 5125ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor CCP_SuperCompletion)); 512603d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor return SuperMethod; 512703d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor} 512803d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 51298e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregorvoid Sema::CodeCompleteObjCMessageReceiver(Scope *S) { 51300a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 5131218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 513228a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 5133218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_ObjCMessageReceiver, 51344e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie getLangOpts().CPlusPlus0x 513581f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor ? &ResultBuilder::IsObjCMessageReceiverOrLambdaCapture 513681f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor : &ResultBuilder::IsObjCMessageReceiver); 51378e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 51388e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 51398e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor Results.EnterNewScope(); 51408071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 51418071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompleter->includeGlobals()); 51428e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 51438e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor // If we are in an Objective-C method inside a class that has a superclass, 51448e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor // add "super" as an option. 51458e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor if (ObjCMethodDecl *Method = getCurMethodDecl()) 51468e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor if (ObjCInterfaceDecl *Iface = Method->getClassInterface()) 514703d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (Iface->getSuperClass()) { 51488e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor Results.AddResult(Result("super")); 514903d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 515003d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor AddSuperSendCompletion(*this, /*NeedSuperKeyword=*/true, 0, 0, Results); 515103d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor } 51528e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 51534e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (getLangOpts().CPlusPlus0x) 515481f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor addThisCompletion(*this, Results); 515581f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor 51568e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor Results.ExitScope(); 51578e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 51588e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor if (CodeCompleter->includeMacros()) 51598e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor AddMacroResults(PP, Results); 5160cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 5161e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(), Results.size()); 51628e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 51638e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor} 51648e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 51652725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregorvoid Sema::CodeCompleteObjCSuperMessage(Scope *S, SourceLocation SuperLoc, 5166d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor IdentifierInfo **SelIdents, 516770c5ac70ace21b011dc2d4001bae26cdcf62ff8dDouglas Gregor unsigned NumSelIdents, 516870c5ac70ace21b011dc2d4001bae26cdcf62ff8dDouglas Gregor bool AtArgumentExpression) { 516924a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor ObjCInterfaceDecl *CDecl = 0; 51702725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) { 51712725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // Figure out which interface we're in. 51722725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor CDecl = CurMethod->getClassInterface(); 51732725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (!CDecl) 51742725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor return; 51752725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor 51762725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // Find the superclass of this class. 51772725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor CDecl = CDecl->getSuperClass(); 51782725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (!CDecl) 51792725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor return; 518024a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor 51812725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (CurMethod->isInstanceMethod()) { 51822725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // We are inside an instance method, which means that the message 51832725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // send [super ...] is actually calling an instance method on the 51846b0656a7c386662e1bec5f23a3bd0bf2687a9635Douglas Gregor // current object. 51856b0656a7c386662e1bec5f23a3bd0bf2687a9635Douglas Gregor return CodeCompleteObjCInstanceMessage(S, 0, 518603d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor SelIdents, NumSelIdents, 518770c5ac70ace21b011dc2d4001bae26cdcf62ff8dDouglas Gregor AtArgumentExpression, 51886b0656a7c386662e1bec5f23a3bd0bf2687a9635Douglas Gregor CDecl); 51892725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor } 519024a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor 51912725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // Fall through to send to the superclass in CDecl. 51922725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor } else { 51932725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // "super" may be the name of a type or variable. Figure out which 51942725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // it is. 51952725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor IdentifierInfo *Super = &Context.Idents.get("super"); 51962725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor NamedDecl *ND = LookupSingleName(S, Super, SuperLoc, 51972725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor LookupOrdinaryName); 51982725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if ((CDecl = dyn_cast_or_null<ObjCInterfaceDecl>(ND))) { 51992725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // "super" names an interface. Use it. 52002725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor } else if (TypeDecl *TD = dyn_cast_or_null<TypeDecl>(ND)) { 5201c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (const ObjCObjectType *Iface 5202c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall = Context.getTypeDeclType(TD)->getAs<ObjCObjectType>()) 5203c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall CDecl = Iface->getInterface(); 52042725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor } else if (ND && isa<UnresolvedUsingTypenameDecl>(ND)) { 52052725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // "super" names an unresolved type; we can't be more specific. 52062725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor } else { 52072725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // Assume that "super" names some kind of value and parse that way. 52082725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor CXXScopeSpec SS; 5209e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara SourceLocation TemplateKWLoc; 52102725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor UnqualifiedId id; 52112725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor id.setIdentifier(Super, SuperLoc); 5212e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara ExprResult SuperExpr = ActOnIdExpression(S, SS, TemplateKWLoc, id, 5213e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara false, false); 52142725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor return CodeCompleteObjCInstanceMessage(S, (Expr *)SuperExpr.get(), 521570c5ac70ace21b011dc2d4001bae26cdcf62ff8dDouglas Gregor SelIdents, NumSelIdents, 521670c5ac70ace21b011dc2d4001bae26cdcf62ff8dDouglas Gregor AtArgumentExpression); 52172725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor } 521824a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor 52192725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // Fall through 522024a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor } 522124a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor 5222b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall ParsedType Receiver; 52232725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (CDecl) 5224b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall Receiver = ParsedType::make(Context.getObjCInterfaceType(CDecl)); 52252725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor return CodeCompleteObjCClassMessage(S, Receiver, SelIdents, 522670c5ac70ace21b011dc2d4001bae26cdcf62ff8dDouglas Gregor NumSelIdents, AtArgumentExpression, 522770c5ac70ace21b011dc2d4001bae26cdcf62ff8dDouglas Gregor /*IsSuper=*/true); 52282725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor} 52292725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor 5230b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor/// \brief Given a set of code-completion results for the argument of a message 5231b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor/// send, determine the preferred type (if any) for that argument expression. 5232b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregorstatic QualType getPreferredArgumentTypeForMessageSend(ResultBuilder &Results, 5233b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor unsigned NumSelIdents) { 5234b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor typedef CodeCompletionResult Result; 5235b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor ASTContext &Context = Results.getSema().Context; 5236b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor 5237b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor QualType PreferredType; 5238b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor unsigned BestPriority = CCP_Unlikely * 2; 5239b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor Result *ResultsData = Results.data(); 5240b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor for (unsigned I = 0, N = Results.size(); I != N; ++I) { 5241b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor Result &R = ResultsData[I]; 5242b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor if (R.Kind == Result::RK_Declaration && 5243b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor isa<ObjCMethodDecl>(R.Declaration)) { 5244b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor if (R.Priority <= BestPriority) { 5245b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor ObjCMethodDecl *Method = cast<ObjCMethodDecl>(R.Declaration); 5246b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor if (NumSelIdents <= Method->param_size()) { 5247b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor QualType MyPreferredType = Method->param_begin()[NumSelIdents - 1] 5248b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor ->getType(); 5249b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor if (R.Priority < BestPriority || PreferredType.isNull()) { 5250b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor BestPriority = R.Priority; 5251b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor PreferredType = MyPreferredType; 5252b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor } else if (!Context.hasSameUnqualifiedType(PreferredType, 5253b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor MyPreferredType)) { 5254b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor PreferredType = QualType(); 5255b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor } 5256b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor } 5257b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor } 5258b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor } 5259b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor } 5260b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor 5261b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor return PreferredType; 5262b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor} 5263b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor 5264c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregorstatic void AddClassMessageCompletions(Sema &SemaRef, Scope *S, 5265c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor ParsedType Receiver, 5266c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor IdentifierInfo **SelIdents, 5267c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor unsigned NumSelIdents, 526870c5ac70ace21b011dc2d4001bae26cdcf62ff8dDouglas Gregor bool AtArgumentExpression, 5269c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor bool IsSuper, 5270c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor ResultBuilder &Results) { 52710a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 52722725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor ObjCInterfaceDecl *CDecl = 0; 5273c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor 527424a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor // If the given name refers to an interface type, retrieve the 527524a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor // corresponding declaration. 52762725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (Receiver) { 5277c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor QualType T = SemaRef.GetTypeFromParser(Receiver, 0); 52782725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (!T.isNull()) 5279c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (const ObjCObjectType *Interface = T->getAs<ObjCObjectType>()) 5280c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall CDecl = Interface->getInterface(); 528124a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor } 5282c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor 528336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add all of the factory methods in this Objective-C class, its protocols, 528436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // superclasses, categories, implementation, etc. 5285c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff Results.EnterNewScope(); 5286c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor 528703d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor // If this is a send-to-super, try to add the special "super" send 528803d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor // completion. 528903d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (IsSuper) { 529003d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (ObjCMethodDecl *SuperMethod 5291c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor = AddSuperSendCompletion(SemaRef, false, SelIdents, NumSelIdents, 5292c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor Results)) 529303d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor Results.Ignore(SuperMethod); 529403d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor } 5295c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor 5296265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor // If we're inside an Objective-C method definition, prefer its selector to 5297265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor // others. 5298c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor if (ObjCMethodDecl *CurMethod = SemaRef.getCurMethodDecl()) 5299265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor Results.setPreferredSelector(CurMethod->getSelector()); 5300c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor 5301d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor VisitedSelectorSet Selectors; 530213438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor if (CDecl) 5303c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor AddObjCMethods(CDecl, false, MK_Any, SelIdents, NumSelIdents, 5304cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor SemaRef.CurContext, Selectors, AtArgumentExpression, 5305cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor Results); 53062725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor else { 530713438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor // We're messaging "id" as a type; provide all class/factory methods. 5308c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor 5309719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor // If we have an external source, load the entire class method 53103c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl // pool from the AST file. 5311c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor if (SemaRef.ExternalSource) { 5312c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor for (uint32_t I = 0, 5313c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor N = SemaRef.ExternalSource->GetNumExternalSelectors(); 531476bd1f387e6a7b7abfe53f63b3bd429b97bb80f0John McCall I != N; ++I) { 5315c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor Selector Sel = SemaRef.ExternalSource->GetExternalSelector(I); 5316c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor if (Sel.isNull() || SemaRef.MethodPool.count(Sel)) 5317719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor continue; 5318c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor 5319c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor SemaRef.ReadMethodPool(Sel); 5320719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor } 5321719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor } 5322c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor 5323c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor for (Sema::GlobalMethodPool::iterator M = SemaRef.MethodPool.begin(), 5324c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor MEnd = SemaRef.MethodPool.end(); 5325db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl M != MEnd; ++M) { 5326db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl for (ObjCMethodList *MethList = &M->second.second; 5327db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl MethList && MethList->Method; 532813438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor MethList = MethList->Next) { 532913438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor if (!isAcceptableObjCMethod(MethList->Method, MK_Any, SelIdents, 533013438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor NumSelIdents)) 533113438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor continue; 5332c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor 533313438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor Result R(MethList->Method, 0); 533413438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor R.StartParameter = NumSelIdents; 533513438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor R.AllParametersAreInformative = false; 5336c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor Results.MaybeAddResult(R, SemaRef.CurContext); 533713438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor } 533813438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor } 533913438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor } 5340c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor 5341c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor Results.ExitScope(); 5342c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor} 534313438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor 5344c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregorvoid Sema::CodeCompleteObjCClassMessage(Scope *S, ParsedType Receiver, 5345c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor IdentifierInfo **SelIdents, 5346c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor unsigned NumSelIdents, 534770c5ac70ace21b011dc2d4001bae26cdcf62ff8dDouglas Gregor bool AtArgumentExpression, 5348c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor bool IsSuper) { 5349e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor 5350e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor QualType T = this->GetTypeFromParser(Receiver); 5351e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor 5352218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 535328a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 5354e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor CodeCompletionContext(CodeCompletionContext::CCC_ObjCClassMessage, 53550a47d69af8bda945352997af3da4687a3356096aDouglas Gregor T, SelIdents, NumSelIdents)); 5356e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor 535770c5ac70ace21b011dc2d4001bae26cdcf62ff8dDouglas Gregor AddClassMessageCompletions(*this, S, Receiver, SelIdents, NumSelIdents, 535870c5ac70ace21b011dc2d4001bae26cdcf62ff8dDouglas Gregor AtArgumentExpression, IsSuper, Results); 5359b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor 5360b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor // If we're actually at the argument expression (rather than prior to the 5361b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor // selector), we're actually performing code completion for an expression. 5362b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor // Determine whether we have a single, best method. If so, we can 5363b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor // code-complete the expression using the corresponding parameter type as 5364b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor // our preferred type, improving completion results. 5365b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor if (AtArgumentExpression) { 5366b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor QualType PreferredType = getPreferredArgumentTypeForMessageSend(Results, 5367e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor NumSelIdents); 5368b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor if (PreferredType.isNull()) 5369b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor CodeCompleteOrdinaryName(S, PCC_Expression); 5370b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor else 5371b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor CodeCompleteExpression(S, PreferredType); 5372b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor return; 5373b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor } 5374b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor 5375e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 5376e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor Results.getCompletionContext(), 537703d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor Results.data(), Results.size()); 5378c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff} 5379c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff 5380f81e5a9e3f3ff80c56e4afb4fe6311a8735f36e8Richard Trieuvoid Sema::CodeCompleteObjCInstanceMessage(Scope *S, Expr *Receiver, 5381d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor IdentifierInfo **SelIdents, 538203d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor unsigned NumSelIdents, 538370c5ac70ace21b011dc2d4001bae26cdcf62ff8dDouglas Gregor bool AtArgumentExpression, 53846b0656a7c386662e1bec5f23a3bd0bf2687a9635Douglas Gregor ObjCInterfaceDecl *Super) { 53850a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 5386c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff 5387c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff Expr *RecExpr = static_cast<Expr *>(Receiver); 5388c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff 538936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // If necessary, apply function/array conversion to the receiver. 539036ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // C99 6.7.5.3p[7,8]. 5391429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley if (RecExpr) { 5392429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley ExprResult Conv = DefaultFunctionArrayLvalueConversion(RecExpr); 5393429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley if (Conv.isInvalid()) // conversion failed. bail. 5394429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley return; 5395429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley RecExpr = Conv.take(); 5396429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley } 53976b0656a7c386662e1bec5f23a3bd0bf2687a9635Douglas Gregor QualType ReceiverType = RecExpr? RecExpr->getType() 53986b0656a7c386662e1bec5f23a3bd0bf2687a9635Douglas Gregor : Super? Context.getObjCObjectPointerType( 53996b0656a7c386662e1bec5f23a3bd0bf2687a9635Douglas Gregor Context.getObjCInterfaceType(Super)) 54006b0656a7c386662e1bec5f23a3bd0bf2687a9635Douglas Gregor : Context.getObjCIdType(); 5401c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff 5402da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor // If we're messaging an expression with type "id" or "Class", check 5403da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor // whether we know something special about the receiver that allows 5404da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor // us to assume a more-specific receiver type. 5405da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor if (ReceiverType->isObjCIdType() || ReceiverType->isObjCClassType()) 5406da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor if (ObjCInterfaceDecl *IFace = GetAssumedMessageSendExprType(RecExpr)) { 5407da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor if (ReceiverType->isObjCClassType()) 5408da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor return CodeCompleteObjCClassMessage(S, 5409da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor ParsedType::make(Context.getObjCInterfaceType(IFace)), 5410da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor SelIdents, NumSelIdents, 5411da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor AtArgumentExpression, Super); 5412da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor 5413da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor ReceiverType = Context.getObjCObjectPointerType( 5414da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor Context.getObjCInterfaceType(IFace)); 5415da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor } 5416da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor 541736ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Build the set of methods we can see. 5418218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 541928a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 5420e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor CodeCompletionContext(CodeCompletionContext::CCC_ObjCInstanceMessage, 54210a47d69af8bda945352997af3da4687a3356096aDouglas Gregor ReceiverType, SelIdents, NumSelIdents)); 5422e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor 542336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor Results.EnterNewScope(); 542422f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor 542503d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor // If this is a send-to-super, try to add the special "super" send 542603d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor // completion. 54276b0656a7c386662e1bec5f23a3bd0bf2687a9635Douglas Gregor if (Super) { 542803d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (ObjCMethodDecl *SuperMethod 542903d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor = AddSuperSendCompletion(*this, false, SelIdents, NumSelIdents, 543003d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor Results)) 543103d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor Results.Ignore(SuperMethod); 543203d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor } 543303d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 5434265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor // If we're inside an Objective-C method definition, prefer its selector to 5435265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor // others. 5436265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) 5437265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor Results.setPreferredSelector(CurMethod->getSelector()); 543836ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 5439d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor // Keep track of the selectors we've already added. 5440d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor VisitedSelectorSet Selectors; 5441d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor 5442f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // Handle messages to Class. This really isn't a message to an instance 5443f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // method, so we treat it the same way we would treat a message send to a 5444f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // class method. 5445f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor if (ReceiverType->isObjCClassType() || 5446f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor ReceiverType->isObjCQualifiedClassType()) { 5447f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) { 5448f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor if (ObjCInterfaceDecl *ClassDecl = CurMethod->getClassInterface()) 54494ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(ClassDecl, false, MK_Any, SelIdents, NumSelIdents, 5450cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor CurContext, Selectors, AtArgumentExpression, Results); 5451f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor } 5452f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor } 5453f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // Handle messages to a qualified ID ("id<foo>"). 5454f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor else if (const ObjCObjectPointerType *QualID 5455f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor = ReceiverType->getAsObjCQualifiedIdType()) { 5456f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // Search protocols for instance methods. 5457f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor for (ObjCObjectPointerType::qual_iterator I = QualID->qual_begin(), 5458f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor E = QualID->qual_end(); 5459f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor I != E; ++I) 54604ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(*I, true, MK_Any, SelIdents, NumSelIdents, CurContext, 5461cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor Selectors, AtArgumentExpression, Results); 5462f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor } 5463f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // Handle messages to a pointer to interface type. 5464f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor else if (const ObjCObjectPointerType *IFacePtr 5465f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor = ReceiverType->getAsObjCInterfacePointerType()) { 5466f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // Search the class, its superclasses, etc., for instance methods. 54674ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(IFacePtr->getInterfaceDecl(), true, MK_Any, SelIdents, 5468cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor NumSelIdents, CurContext, Selectors, AtArgumentExpression, 5469cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor Results); 5470f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor 5471f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // Search protocols for instance methods. 5472f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor for (ObjCObjectPointerType::qual_iterator I = IFacePtr->qual_begin(), 5473f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor E = IFacePtr->qual_end(); 5474f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor I != E; ++I) 54754ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(*I, true, MK_Any, SelIdents, NumSelIdents, CurContext, 5476cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor Selectors, AtArgumentExpression, Results); 5477f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor } 547813438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor // Handle messages to "id". 547913438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor else if (ReceiverType->isObjCIdType()) { 5480719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor // We're messaging "id", so provide all instance methods we know 5481719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor // about as code-completion results. 5482719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor 5483719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor // If we have an external source, load the entire class method 54843c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl // pool from the AST file. 5485719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor if (ExternalSource) { 548676bd1f387e6a7b7abfe53f63b3bd429b97bb80f0John McCall for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors(); 548776bd1f387e6a7b7abfe53f63b3bd429b97bb80f0John McCall I != N; ++I) { 548876bd1f387e6a7b7abfe53f63b3bd429b97bb80f0John McCall Selector Sel = ExternalSource->GetExternalSelector(I); 5489db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl if (Sel.isNull() || MethodPool.count(Sel)) 5490719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor continue; 5491719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor 5492db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl ReadMethodPool(Sel); 5493719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor } 5494719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor } 5495719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor 5496db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl for (GlobalMethodPool::iterator M = MethodPool.begin(), 5497db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl MEnd = MethodPool.end(); 5498db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl M != MEnd; ++M) { 5499db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl for (ObjCMethodList *MethList = &M->second.first; 5500db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl MethList && MethList->Method; 550113438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor MethList = MethList->Next) { 550213438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor if (!isAcceptableObjCMethod(MethList->Method, MK_Any, SelIdents, 550313438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor NumSelIdents)) 550413438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor continue; 5505d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor 5506d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor if (!Selectors.insert(MethList->Method->getSelector())) 5507d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor continue; 5508d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor 550913438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor Result R(MethList->Method, 0); 551013438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor R.StartParameter = NumSelIdents; 551113438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor R.AllParametersAreInformative = false; 551213438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor Results.MaybeAddResult(R, CurContext); 551313438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor } 551413438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor } 551513438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor } 5516f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor Results.ExitScope(); 5517b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor 5518b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor 5519b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor // If we're actually at the argument expression (rather than prior to the 5520b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor // selector), we're actually performing code completion for an expression. 5521b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor // Determine whether we have a single, best method. If so, we can 5522b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor // code-complete the expression using the corresponding parameter type as 5523b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor // our preferred type, improving completion results. 5524b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor if (AtArgumentExpression) { 5525b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor QualType PreferredType = getPreferredArgumentTypeForMessageSend(Results, 5526b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor NumSelIdents); 5527b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor if (PreferredType.isNull()) 5528b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor CodeCompleteOrdinaryName(S, PCC_Expression); 5529b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor else 5530b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor CodeCompleteExpression(S, PreferredType); 5531b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor return; 5532b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor } 5533b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor 5534e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 5535e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor Results.getCompletionContext(), 5536e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 5537c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff} 553855385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor 5539fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregorvoid Sema::CodeCompleteObjCForCollection(Scope *S, 5540fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor DeclGroupPtrTy IterationVar) { 5541fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor CodeCompleteExpressionData Data; 5542fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor Data.ObjCCollection = true; 5543fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor 5544fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor if (IterationVar.getAsOpaquePtr()) { 5545fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor DeclGroupRef DG = IterationVar.getAsVal<DeclGroupRef>(); 5546fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor for (DeclGroupRef::iterator I = DG.begin(), End = DG.end(); I != End; ++I) { 5547fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor if (*I) 5548fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor Data.IgnoreDecls.push_back(*I); 5549fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor } 5550fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor } 5551fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor 5552fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor CodeCompleteExpression(S, Data); 5553fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor} 5554fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor 5555458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregorvoid Sema::CodeCompleteObjCSelector(Scope *S, IdentifierInfo **SelIdents, 5556458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor unsigned NumSelIdents) { 5557458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor // If we have an external source, load the entire class method 5558458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor // pool from the AST file. 5559458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor if (ExternalSource) { 5560458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors(); 5561458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor I != N; ++I) { 5562458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor Selector Sel = ExternalSource->GetExternalSelector(I); 5563458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor if (Sel.isNull() || MethodPool.count(Sel)) 5564458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor continue; 5565458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor 5566458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor ReadMethodPool(Sel); 5567458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor } 5568458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor } 5569458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor 5570218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 557128a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 5572218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_SelectorName); 5573458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor Results.EnterNewScope(); 5574458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor for (GlobalMethodPool::iterator M = MethodPool.begin(), 5575458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor MEnd = MethodPool.end(); 5576458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor M != MEnd; ++M) { 5577458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor 5578458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor Selector Sel = M->first; 5579458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor if (!isAcceptableObjCSelector(Sel, MK_Any, SelIdents, NumSelIdents)) 5580458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor continue; 5581458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor 558228a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Builder(Results.getAllocator(), 558328a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis Results.getCodeCompletionTUInfo()); 5584458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor if (Sel.isUnarySelector()) { 5585dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddTypedTextChunk(Builder.getAllocator().CopyString( 5586813d8346529bf094eb2b249648906ba7fd226688Douglas Gregor Sel.getNameForSlot(0))); 5587218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 5588458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor continue; 5589458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor } 5590458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor 55912d9e21f4675232a39a39611a5b4bb1f4914b2742Douglas Gregor std::string Accumulator; 5592458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor for (unsigned I = 0, N = Sel.getNumArgs(); I != N; ++I) { 55932d9e21f4675232a39a39611a5b4bb1f4914b2742Douglas Gregor if (I == NumSelIdents) { 55942d9e21f4675232a39a39611a5b4bb1f4914b2742Douglas Gregor if (!Accumulator.empty()) { 5595dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddInformativeChunk(Builder.getAllocator().CopyString( 5596218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Accumulator)); 55972d9e21f4675232a39a39611a5b4bb1f4914b2742Douglas Gregor Accumulator.clear(); 55982d9e21f4675232a39a39611a5b4bb1f4914b2742Douglas Gregor } 55992d9e21f4675232a39a39611a5b4bb1f4914b2742Douglas Gregor } 56002d9e21f4675232a39a39611a5b4bb1f4914b2742Douglas Gregor 5601a0651c5f5d1c8928d3ae062435ed9cf0aa0d04baBenjamin Kramer Accumulator += Sel.getNameForSlot(I); 56022d9e21f4675232a39a39611a5b4bb1f4914b2742Douglas Gregor Accumulator += ':'; 5603458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor } 5604dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddTypedTextChunk(Builder.getAllocator().CopyString( Accumulator)); 5605218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 5606458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor } 5607458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor Results.ExitScope(); 5608458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor 5609458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 5610458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor CodeCompletionContext::CCC_SelectorName, 5611458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor Results.data(), Results.size()); 5612458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor} 5613458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor 561455385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor/// \brief Add all of the protocol declarations that we find in the given 561555385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor/// (translation unit) context. 561655385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregorstatic void AddProtocolResults(DeclContext *Ctx, DeclContext *CurContext, 5617083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor bool OnlyForwardDeclarations, 561855385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor ResultBuilder &Results) { 56190a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 562055385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor 562155385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor for (DeclContext::decl_iterator D = Ctx->decls_begin(), 562255385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor DEnd = Ctx->decls_end(); 562355385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor D != DEnd; ++D) { 562455385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor // Record any protocols we find. 562555385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor if (ObjCProtocolDecl *Proto = dyn_cast<ObjCProtocolDecl>(*D)) 56265e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor if (!OnlyForwardDeclarations || !Proto->hasDefinition()) 5627608300be1972c43fe99154d25d62d697e7c0a0c2Douglas Gregor Results.AddResult(Result(Proto, 0), CurContext, 0, false); 562855385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor } 562955385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor} 563055385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor 563155385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregorvoid Sema::CodeCompleteObjCProtocolReferences(IdentifierLocPair *Protocols, 563255385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor unsigned NumProtocols) { 5633218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 563428a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 5635218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_ObjCProtocolName); 563655385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor 563770c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor if (CodeCompleter && CodeCompleter->includeGlobals()) { 563870c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor Results.EnterNewScope(); 563970c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor 564070c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor // Tell the result set to ignore all of the protocols we have 564170c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor // already seen. 564270c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor // FIXME: This doesn't work when caching code-completion results. 564370c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor for (unsigned I = 0; I != NumProtocols; ++I) 564470c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor if (ObjCProtocolDecl *Protocol = LookupProtocol(Protocols[I].first, 564570c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor Protocols[I].second)) 564670c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor Results.Ignore(Protocol); 564770c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor 564870c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor // Add all protocols. 564970c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor AddProtocolResults(Context.getTranslationUnitDecl(), CurContext, false, 565070c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor Results); 5651083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor 565270c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor Results.ExitScope(); 565370c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor } 565470c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor 5655e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 5656e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_ObjCProtocolName, 5657e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 5658083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor} 5659083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor 5660083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregorvoid Sema::CodeCompleteObjCProtocolDecl(Scope *) { 5661218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 566228a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 5663218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_ObjCProtocolName); 5664083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor 566570c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor if (CodeCompleter && CodeCompleter->includeGlobals()) { 566670c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor Results.EnterNewScope(); 566770c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor 566870c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor // Add all protocols. 566970c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor AddProtocolResults(Context.getTranslationUnitDecl(), CurContext, true, 567070c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor Results); 567155385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor 567270c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor Results.ExitScope(); 567370c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor } 567470c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor 5675e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 5676e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_ObjCProtocolName, 5677e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 567855385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor} 56793b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 56803b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor/// \brief Add all of the Objective-C interface declarations that we find in 56813b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor/// the given (translation unit) context. 56823b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregorstatic void AddInterfaceResults(DeclContext *Ctx, DeclContext *CurContext, 56833b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor bool OnlyForwardDeclarations, 56843b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor bool OnlyUnimplemented, 56853b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor ResultBuilder &Results) { 56860a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 56873b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 56883b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor for (DeclContext::decl_iterator D = Ctx->decls_begin(), 56893b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor DEnd = Ctx->decls_end(); 56903b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor D != DEnd; ++D) { 5691deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor // Record any interfaces we find. 5692deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor if (ObjCInterfaceDecl *Class = dyn_cast<ObjCInterfaceDecl>(*D)) 56937723fec9b45b7258c0eddf4cbfd0d335348f5edcDouglas Gregor if ((!OnlyForwardDeclarations || !Class->hasDefinition()) && 5694deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor (!OnlyUnimplemented || !Class->getImplementation())) 5695deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor Results.AddResult(Result(Class, 0), CurContext, 0, false); 56963b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor } 56973b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor} 56983b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 56993b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregorvoid Sema::CodeCompleteObjCInterfaceDecl(Scope *S) { 5700218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 570128a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 5702218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 57033b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.EnterNewScope(); 57043b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 57050f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor if (CodeCompleter->includeGlobals()) { 57060f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor // Add all classes. 57070f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false, 57080f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor false, Results); 57090f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor } 57100f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor 57113b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.ExitScope(); 57120f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor 5713e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 57140f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor CodeCompletionContext::CCC_ObjCInterfaceName, 5715e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 57163b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor} 57173b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 5718c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregorvoid Sema::CodeCompleteObjCSuperclass(Scope *S, IdentifierInfo *ClassName, 5719c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor SourceLocation ClassNameLoc) { 5720218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 572128a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 57220f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor CodeCompletionContext::CCC_ObjCInterfaceName); 57233b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.EnterNewScope(); 57243b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 57253b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor // Make sure that we ignore the class we're currently defining. 57263b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor NamedDecl *CurClass 5727c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor = LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName); 572833ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor if (CurClass && isa<ObjCInterfaceDecl>(CurClass)) 57293b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.Ignore(CurClass); 57303b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 57310f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor if (CodeCompleter->includeGlobals()) { 57320f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor // Add all classes. 57330f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false, 57340f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor false, Results); 57350f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor } 57360f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor 57373b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.ExitScope(); 57380f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor 5739e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 57400f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor CodeCompletionContext::CCC_ObjCInterfaceName, 5741e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 57423b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor} 57433b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 57443b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregorvoid Sema::CodeCompleteObjCImplementationDecl(Scope *S) { 5745218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 574628a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 5747218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 57483b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.EnterNewScope(); 57493b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 57500f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor if (CodeCompleter->includeGlobals()) { 57510f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor // Add all unimplemented classes. 57520f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false, 57530f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor true, Results); 57540f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor } 57550f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor 57563b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.ExitScope(); 57570f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor 5758e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 57590f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor CodeCompletionContext::CCC_ObjCInterfaceName, 5760e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 57613b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor} 576233ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 576333ced0b8550f3e7169f326944731ee02e9338659Douglas Gregorvoid Sema::CodeCompleteObjCInterfaceCategory(Scope *S, 5764c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor IdentifierInfo *ClassName, 5765c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor SourceLocation ClassNameLoc) { 57660a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 576733ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 5768218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 576928a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 57703da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CodeCompletionContext::CCC_ObjCCategoryName); 577133ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 577233ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // Ignore any categories we find that have already been implemented by this 577333ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // interface. 577433ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor llvm::SmallPtrSet<IdentifierInfo *, 16> CategoryNames; 577533ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor NamedDecl *CurClass 5776c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor = LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName); 577733ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor if (ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurClass)) 577833ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor for (ObjCCategoryDecl *Category = Class->getCategoryList(); Category; 577933ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Category = Category->getNextClassCategory()) 578033ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor CategoryNames.insert(Category->getIdentifier()); 578133ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 578233ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // Add all of the categories we know about. 578333ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Results.EnterNewScope(); 578433ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor TranslationUnitDecl *TU = Context.getTranslationUnitDecl(); 578533ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor for (DeclContext::decl_iterator D = TU->decls_begin(), 578633ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor DEnd = TU->decls_end(); 578733ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor D != DEnd; ++D) 578833ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(*D)) 578933ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor if (CategoryNames.insert(Category->getIdentifier())) 5790608300be1972c43fe99154d25d62d697e7c0a0c2Douglas Gregor Results.AddResult(Result(Category, 0), CurContext, 0, false); 579133ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Results.ExitScope(); 579233ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 5793e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 57943da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CodeCompletionContext::CCC_ObjCCategoryName, 5795e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 579633ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor} 579733ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 579833ced0b8550f3e7169f326944731ee02e9338659Douglas Gregorvoid Sema::CodeCompleteObjCImplementationCategory(Scope *S, 5799c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor IdentifierInfo *ClassName, 5800c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor SourceLocation ClassNameLoc) { 58010a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 580233ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 580333ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // Find the corresponding interface. If we couldn't find the interface, the 580433ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // program itself is ill-formed. However, we'll try to be helpful still by 580533ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // providing the list of all of the categories we know about. 580633ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor NamedDecl *CurClass 5807c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor = LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName); 580833ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurClass); 580933ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor if (!Class) 5810c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor return CodeCompleteObjCInterfaceCategory(S, ClassName, ClassNameLoc); 581133ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 5812218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 581328a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 58143da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CodeCompletionContext::CCC_ObjCCategoryName); 581533ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 581633ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // Add all of the categories that have have corresponding interface 581733ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // declarations in this class and any of its superclasses, except for 581833ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // already-implemented categories in the class itself. 581933ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor llvm::SmallPtrSet<IdentifierInfo *, 16> CategoryNames; 582033ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Results.EnterNewScope(); 582133ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor bool IgnoreImplemented = true; 582233ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor while (Class) { 582333ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor for (ObjCCategoryDecl *Category = Class->getCategoryList(); Category; 582433ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Category = Category->getNextClassCategory()) 582533ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor if ((!IgnoreImplemented || !Category->getImplementation()) && 582633ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor CategoryNames.insert(Category->getIdentifier())) 5827608300be1972c43fe99154d25d62d697e7c0a0c2Douglas Gregor Results.AddResult(Result(Category, 0), CurContext, 0, false); 582833ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 582933ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Class = Class->getSuperClass(); 583033ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor IgnoreImplemented = false; 583133ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor } 583233ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Results.ExitScope(); 583333ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 5834e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 58353da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CodeCompletionContext::CCC_ObjCCategoryName, 5836e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 583733ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor} 5838322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 5839a28948f34817476d02412fa204cae038e228c827Fariborz Jahanianvoid Sema::CodeCompleteObjCPropertyDefinition(Scope *S) { 58400a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 5841218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 584228a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 5843218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 5844322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 5845322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Figure out where this @synthesize lives. 5846322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor ObjCContainerDecl *Container 5847a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian = dyn_cast_or_null<ObjCContainerDecl>(CurContext); 5848322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor if (!Container || 5849322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor (!isa<ObjCImplementationDecl>(Container) && 5850322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor !isa<ObjCCategoryImplDecl>(Container))) 5851322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor return; 5852322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 5853322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Ignore any properties that have already been implemented. 5854b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor Container = getContainerDef(Container); 5855b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor for (DeclContext::decl_iterator D = Container->decls_begin(), 5856322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor DEnd = Container->decls_end(); 5857322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor D != DEnd; ++D) 5858322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor if (ObjCPropertyImplDecl *PropertyImpl = dyn_cast<ObjCPropertyImplDecl>(*D)) 5859322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Results.Ignore(PropertyImpl->getPropertyDecl()); 5860322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 5861322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Add any properties that we find. 58627344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor AddedPropertiesSet AddedProperties; 5863322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Results.EnterNewScope(); 5864322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor if (ObjCImplementationDecl *ClassImpl 5865322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor = dyn_cast<ObjCImplementationDecl>(Container)) 58664b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddObjCProperties(ClassImpl->getClassInterface(), false, 58674b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor /*AllowNullaryMethods=*/false, CurContext, 58687344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor AddedProperties, Results); 5869322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor else 5870322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor AddObjCProperties(cast<ObjCCategoryImplDecl>(Container)->getCategoryDecl(), 58714b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor false, /*AllowNullaryMethods=*/false, CurContext, 58724b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddedProperties, Results); 5873322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Results.ExitScope(); 5874322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 5875e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 5876e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 5877e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 5878322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor} 5879322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 5880322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregorvoid Sema::CodeCompleteObjCPropertySynthesizeIvar(Scope *S, 5881a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian IdentifierInfo *PropertyName) { 58820a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 5883218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 588428a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 5885218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 5886322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 5887322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Figure out where this @synthesize lives. 5888322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor ObjCContainerDecl *Container 5889a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian = dyn_cast_or_null<ObjCContainerDecl>(CurContext); 5890322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor if (!Container || 5891322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor (!isa<ObjCImplementationDecl>(Container) && 5892322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor !isa<ObjCCategoryImplDecl>(Container))) 5893322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor return; 5894322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 5895322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Figure out which interface we're looking into. 5896322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor ObjCInterfaceDecl *Class = 0; 5897322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor if (ObjCImplementationDecl *ClassImpl 5898322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor = dyn_cast<ObjCImplementationDecl>(Container)) 5899322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Class = ClassImpl->getClassInterface(); 5900322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor else 5901322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Class = cast<ObjCCategoryImplDecl>(Container)->getCategoryDecl() 5902322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor ->getClassInterface(); 5903322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 5904e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor // Determine the type of the property we're synthesizing. 5905e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor QualType PropertyType = Context.getObjCIdType(); 5906e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor if (Class) { 5907e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor if (ObjCPropertyDecl *Property 5908e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor = Class->FindPropertyDeclaration(PropertyName)) { 5909e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor PropertyType 5910e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor = Property->getType().getNonReferenceType().getUnqualifiedType(); 5911e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor 5912e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor // Give preference to ivars 5913e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor Results.setPreferredType(PropertyType); 5914e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor } 5915e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor } 5916e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor 5917322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Add all of the instance variables in this class and its superclasses. 5918322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Results.EnterNewScope(); 5919aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor bool SawSimilarlyNamedIvar = false; 5920aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor std::string NameWithPrefix; 5921aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor NameWithPrefix += '_'; 5922a0651c5f5d1c8928d3ae062435ed9cf0aa0d04baBenjamin Kramer NameWithPrefix += PropertyName->getName(); 5923aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor std::string NameWithSuffix = PropertyName->getName().str(); 5924aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor NameWithSuffix += '_'; 5925322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor for(; Class; Class = Class->getSuperClass()) { 5926aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor for (ObjCIvarDecl *Ivar = Class->all_declared_ivar_begin(); Ivar; 5927aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor Ivar = Ivar->getNextIvar()) { 5928e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor Results.AddResult(Result(Ivar, 0), CurContext, 0, false); 5929e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor 5930aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor // Determine whether we've seen an ivar with a name similar to the 5931aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor // property. 5932e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor if ((PropertyName == Ivar->getIdentifier() || 5933aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor NameWithPrefix == Ivar->getName() || 5934e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor NameWithSuffix == Ivar->getName())) { 5935aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor SawSimilarlyNamedIvar = true; 5936e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor 5937e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor // Reduce the priority of this result by one, to give it a slight 5938e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor // advantage over other results whose names don't match so closely. 5939e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor if (Results.size() && 5940e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor Results.data()[Results.size() - 1].Kind 5941e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor == CodeCompletionResult::RK_Declaration && 5942e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor Results.data()[Results.size() - 1].Declaration == Ivar) 5943e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor Results.data()[Results.size() - 1].Priority--; 5944e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor } 5945aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor } 5946322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor } 5947aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor 5948aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor if (!SawSimilarlyNamedIvar) { 5949aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor // Create ivar result _propName, that the user can use to synthesize 5950e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor // an ivar of the appropriate type. 5951e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor unsigned Priority = CCP_MemberDeclaration + 1; 5952aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor typedef CodeCompletionResult Result; 5953aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor CodeCompletionAllocator &Allocator = Results.getAllocator(); 595428a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo(), 595528a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis Priority,CXAvailability_Available); 5956aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor 59578987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor PrintingPolicy Policy = getCompletionPrintingPolicy(*this); 5958e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor Builder.AddResultTypeChunk(GetCompletionTypeString(PropertyType, Context, 59598987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor Policy, Allocator)); 5960aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(NameWithPrefix)); 5961aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor Results.AddResult(Result(Builder.TakeString(), Priority, 5962aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor CXCursor_ObjCIvarDecl)); 5963aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor } 5964aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor 5965322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Results.ExitScope(); 5966322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 5967e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 5968e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 5969e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 5970322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor} 5971e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 5972408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor// Mapping from selectors to the methods that implement that selector, along 5973408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor// with the "in original class" flag. 5974408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregortypedef llvm::DenseMap<Selector, std::pair<ObjCMethodDecl *, bool> > 5975408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor KnownMethodsMap; 5976e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 5977e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor/// \brief Find all of the methods that reside in the given container 5978e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor/// (and its superclasses, protocols, etc.) that meet the given 5979e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor/// criteria. Insert those methods into the map of known methods, 5980e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor/// indexed by selector so they can be easily found. 5981e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregorstatic void FindImplementableMethods(ASTContext &Context, 5982e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor ObjCContainerDecl *Container, 5983e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor bool WantInstanceMethods, 5984e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor QualType ReturnType, 5985408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor KnownMethodsMap &KnownMethods, 5986408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor bool InOriginalClass = true) { 5987e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container)) { 5988b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor // Make sure we have a definition; that's what we'll walk. 59892e5c15be82f362611c5928ce853d0685ff98c766Douglas Gregor if (!IFace->hasDefinition()) 59902e5c15be82f362611c5928ce853d0685ff98c766Douglas Gregor return; 5991b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor 5992b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor IFace = IFace->getDefinition(); 5993b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor Container = IFace; 59942e5c15be82f362611c5928ce853d0685ff98c766Douglas Gregor 5995e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor const ObjCList<ObjCProtocolDecl> &Protocols 5996e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor = IFace->getReferencedProtocols(); 5997e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 5998ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor E = Protocols.end(); 5999e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor I != E; ++I) 6000e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType, 6001ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor KnownMethods, InOriginalClass); 6002e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6003ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor // Add methods from any class extensions and categories. 6004ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor for (const ObjCCategoryDecl *Cat = IFace->getCategoryList(); Cat; 6005ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor Cat = Cat->getNextClassCategory()) 600680aa1cd7973561889e51c1c152c8990a8de9c953Fariborz Jahanian FindImplementableMethods(Context, const_cast<ObjCCategoryDecl*>(Cat), 600780aa1cd7973561889e51c1c152c8990a8de9c953Fariborz Jahanian WantInstanceMethods, ReturnType, 6008ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor KnownMethods, false); 6009ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor 6010ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor // Visit the superclass. 6011ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor if (IFace->getSuperClass()) 6012ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor FindImplementableMethods(Context, IFace->getSuperClass(), 6013ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor WantInstanceMethods, ReturnType, 6014ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor KnownMethods, false); 6015e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 6016e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6017e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(Container)) { 6018e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Recurse into protocols. 6019e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor const ObjCList<ObjCProtocolDecl> &Protocols 6020e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor = Category->getReferencedProtocols(); 6021e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 6022ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor E = Protocols.end(); 6023e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor I != E; ++I) 6024e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType, 6025ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor KnownMethods, InOriginalClass); 6026ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor 6027ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor // If this category is the original class, jump to the interface. 6028ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor if (InOriginalClass && Category->getClassInterface()) 6029ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor FindImplementableMethods(Context, Category->getClassInterface(), 6030ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor WantInstanceMethods, ReturnType, KnownMethods, 6031ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor false); 6032e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 6033e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6034e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) { 6035b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor // Make sure we have a definition; that's what we'll walk. 6036b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor if (!Protocol->hasDefinition()) 6037b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor return; 6038b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor Protocol = Protocol->getDefinition(); 6039b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor Container = Protocol; 6040b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor 6041b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor // Recurse into protocols. 6042b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor const ObjCList<ObjCProtocolDecl> &Protocols 6043b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor = Protocol->getReferencedProtocols(); 6044b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 6045b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor E = Protocols.end(); 6046b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor I != E; ++I) 6047b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType, 6048b92a4089db33ae9d44e015cf2dfd1e82fea88747Douglas Gregor KnownMethods, false); 6049e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 6050e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6051e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Add methods in this container. This operation occurs last because 6052e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // we want the methods from this container to override any methods 6053e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // we've previously seen with the same selector. 6054e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor for (ObjCContainerDecl::method_iterator M = Container->meth_begin(), 6055e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor MEnd = Container->meth_end(); 6056e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor M != MEnd; ++M) { 6057262bc18e32500558af7cb0afa205b34bd37bafedDavid Blaikie if (M->isInstanceMethod() == WantInstanceMethods) { 6058e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (!ReturnType.isNull() && 6059262bc18e32500558af7cb0afa205b34bd37bafedDavid Blaikie !Context.hasSameUnqualifiedType(ReturnType, M->getResultType())) 6060e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor continue; 6061e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6062581deb3da481053c4993c7600f97acf7768caac5David Blaikie KnownMethods[M->getSelector()] = std::make_pair(*M, InOriginalClass); 6063e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 6064e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 6065e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor} 6066e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6067577cdfdb20840350e841a483df630237326126d5Douglas Gregor/// \brief Add the parenthesized return or parameter type chunk to a code 6068577cdfdb20840350e841a483df630237326126d5Douglas Gregor/// completion string. 6069577cdfdb20840350e841a483df630237326126d5Douglas Gregorstatic void AddObjCPassingTypeChunk(QualType Type, 607090f5f47348b6581eab5d42eaeacf7f2b28b8118fDouglas Gregor unsigned ObjCDeclQuals, 6071577cdfdb20840350e841a483df630237326126d5Douglas Gregor ASTContext &Context, 60728987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor const PrintingPolicy &Policy, 6073577cdfdb20840350e841a483df630237326126d5Douglas Gregor CodeCompletionBuilder &Builder) { 6074577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 607590f5f47348b6581eab5d42eaeacf7f2b28b8118fDouglas Gregor std::string Quals = formatObjCParamQualifiers(ObjCDeclQuals); 607690f5f47348b6581eab5d42eaeacf7f2b28b8118fDouglas Gregor if (!Quals.empty()) 607790f5f47348b6581eab5d42eaeacf7f2b28b8118fDouglas Gregor Builder.AddTextChunk(Builder.getAllocator().CopyString(Quals)); 60788987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor Builder.AddTextChunk(GetCompletionTypeString(Type, Context, Policy, 6079577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.getAllocator())); 6080577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6081577cdfdb20840350e841a483df630237326126d5Douglas Gregor} 6082577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6083577cdfdb20840350e841a483df630237326126d5Douglas Gregor/// \brief Determine whether the given class is or inherits from a class by 6084577cdfdb20840350e841a483df630237326126d5Douglas Gregor/// the given name. 6085577cdfdb20840350e841a483df630237326126d5Douglas Gregorstatic bool InheritsFromClassNamed(ObjCInterfaceDecl *Class, 60865f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef Name) { 6087577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (!Class) 6088577cdfdb20840350e841a483df630237326126d5Douglas Gregor return false; 6089577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6090577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (Class->getIdentifier() && Class->getIdentifier()->getName() == Name) 6091577cdfdb20840350e841a483df630237326126d5Douglas Gregor return true; 6092577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6093577cdfdb20840350e841a483df630237326126d5Douglas Gregor return InheritsFromClassNamed(Class->getSuperClass(), Name); 6094577cdfdb20840350e841a483df630237326126d5Douglas Gregor} 6095577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6096577cdfdb20840350e841a483df630237326126d5Douglas Gregor/// \brief Add code completions for Objective-C Key-Value Coding (KVC) and 6097577cdfdb20840350e841a483df630237326126d5Douglas Gregor/// Key-Value Observing (KVO). 6098577cdfdb20840350e841a483df630237326126d5Douglas Gregorstatic void AddObjCKeyValueCompletions(ObjCPropertyDecl *Property, 6099577cdfdb20840350e841a483df630237326126d5Douglas Gregor bool IsInstanceMethod, 6100577cdfdb20840350e841a483df630237326126d5Douglas Gregor QualType ReturnType, 6101577cdfdb20840350e841a483df630237326126d5Douglas Gregor ASTContext &Context, 6102e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor VisitedSelectorSet &KnownSelectors, 6103577cdfdb20840350e841a483df630237326126d5Douglas Gregor ResultBuilder &Results) { 6104577cdfdb20840350e841a483df630237326126d5Douglas Gregor IdentifierInfo *PropName = Property->getIdentifier(); 6105577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (!PropName || PropName->getLength() == 0) 6106577cdfdb20840350e841a483df630237326126d5Douglas Gregor return; 6107577cdfdb20840350e841a483df630237326126d5Douglas Gregor 61088987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor PrintingPolicy Policy = getCompletionPrintingPolicy(Results.getSema()); 61098987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor 6110577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Builder that will create each code completion. 6111577cdfdb20840350e841a483df630237326126d5Douglas Gregor typedef CodeCompletionResult Result; 6112577cdfdb20840350e841a483df630237326126d5Douglas Gregor CodeCompletionAllocator &Allocator = Results.getAllocator(); 611328a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo()); 6114577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6115577cdfdb20840350e841a483df630237326126d5Douglas Gregor // The selector table. 6116577cdfdb20840350e841a483df630237326126d5Douglas Gregor SelectorTable &Selectors = Context.Selectors; 6117577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6118577cdfdb20840350e841a483df630237326126d5Douglas Gregor // The property name, copied into the code completion allocation region 6119577cdfdb20840350e841a483df630237326126d5Douglas Gregor // on demand. 6120577cdfdb20840350e841a483df630237326126d5Douglas Gregor struct KeyHolder { 6121577cdfdb20840350e841a483df630237326126d5Douglas Gregor CodeCompletionAllocator &Allocator; 61225f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef Key; 6123577cdfdb20840350e841a483df630237326126d5Douglas Gregor const char *CopiedKey; 6124577cdfdb20840350e841a483df630237326126d5Douglas Gregor 61255f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner KeyHolder(CodeCompletionAllocator &Allocator, StringRef Key) 6126577cdfdb20840350e841a483df630237326126d5Douglas Gregor : Allocator(Allocator), Key(Key), CopiedKey(0) { } 6127577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6128577cdfdb20840350e841a483df630237326126d5Douglas Gregor operator const char *() { 6129577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (CopiedKey) 6130577cdfdb20840350e841a483df630237326126d5Douglas Gregor return CopiedKey; 6131577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6132577cdfdb20840350e841a483df630237326126d5Douglas Gregor return CopiedKey = Allocator.CopyString(Key); 6133577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6134577cdfdb20840350e841a483df630237326126d5Douglas Gregor } Key(Allocator, PropName->getName()); 6135577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6136577cdfdb20840350e841a483df630237326126d5Douglas Gregor // The uppercased name of the property name. 6137577cdfdb20840350e841a483df630237326126d5Douglas Gregor std::string UpperKey = PropName->getName(); 6138577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (!UpperKey.empty()) 6139577cdfdb20840350e841a483df630237326126d5Douglas Gregor UpperKey[0] = toupper(UpperKey[0]); 6140577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6141577cdfdb20840350e841a483df630237326126d5Douglas Gregor bool ReturnTypeMatchesProperty = ReturnType.isNull() || 6142577cdfdb20840350e841a483df630237326126d5Douglas Gregor Context.hasSameUnqualifiedType(ReturnType.getNonReferenceType(), 6143577cdfdb20840350e841a483df630237326126d5Douglas Gregor Property->getType()); 6144577cdfdb20840350e841a483df630237326126d5Douglas Gregor bool ReturnTypeMatchesVoid 6145577cdfdb20840350e841a483df630237326126d5Douglas Gregor = ReturnType.isNull() || ReturnType->isVoidType(); 6146577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6147577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Add the normal accessor -(type)key. 6148577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && 6149e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor KnownSelectors.insert(Selectors.getNullarySelector(PropName)) && 6150577cdfdb20840350e841a483df630237326126d5Douglas Gregor ReturnTypeMatchesProperty && !Property->getGetterMethodDecl()) { 6151577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) 615290f5f47348b6581eab5d42eaeacf7f2b28b8118fDouglas Gregor AddObjCPassingTypeChunk(Property->getType(), /*Quals=*/0, 615390f5f47348b6581eab5d42eaeacf7f2b28b8118fDouglas Gregor Context, Policy, Builder); 6154577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6155577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Key); 6156577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern, 6157577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6158577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6159577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6160577cdfdb20840350e841a483df630237326126d5Douglas Gregor // If we have an integral or boolean property (or the user has provided 6161577cdfdb20840350e841a483df630237326126d5Douglas Gregor // an integral or boolean return type), add the accessor -(type)isKey. 6162577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && 6163577cdfdb20840350e841a483df630237326126d5Douglas Gregor ((!ReturnType.isNull() && 6164577cdfdb20840350e841a483df630237326126d5Douglas Gregor (ReturnType->isIntegerType() || ReturnType->isBooleanType())) || 6165577cdfdb20840350e841a483df630237326126d5Douglas Gregor (ReturnType.isNull() && 6166577cdfdb20840350e841a483df630237326126d5Douglas Gregor (Property->getType()->isIntegerType() || 6167577cdfdb20840350e841a483df630237326126d5Douglas Gregor Property->getType()->isBooleanType())))) { 61685f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::string SelectorName = (Twine("is") + UpperKey).str(); 61696204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6170e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))) { 6171577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6172577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6173577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("BOOL"); 6174577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6175577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6176577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6177577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk( 6178577cdfdb20840350e841a483df630237326126d5Douglas Gregor Allocator.CopyString(SelectorId->getName())); 6179577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern, 6180577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6181577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6182577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6183577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6184577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Add the normal mutator. 6185577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid && 6186577cdfdb20840350e841a483df630237326126d5Douglas Gregor !Property->getSetterMethodDecl()) { 61875f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::string SelectorName = (Twine("set") + UpperKey).str(); 61886204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6189e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6190577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6191577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6192577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6193577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6194577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6195577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6196577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk( 6197577cdfdb20840350e841a483df630237326126d5Douglas Gregor Allocator.CopyString(SelectorId->getName())); 6198577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(":"); 619990f5f47348b6581eab5d42eaeacf7f2b28b8118fDouglas Gregor AddObjCPassingTypeChunk(Property->getType(), /*Quals=*/0, 620090f5f47348b6581eab5d42eaeacf7f2b28b8118fDouglas Gregor Context, Policy, Builder); 6201577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk(Key); 6202577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern, 6203577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6204577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6205577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6206577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6207577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Indexed and unordered accessors 6208577cdfdb20840350e841a483df630237326126d5Douglas Gregor unsigned IndexedGetterPriority = CCP_CodePattern; 6209577cdfdb20840350e841a483df630237326126d5Douglas Gregor unsigned IndexedSetterPriority = CCP_CodePattern; 6210577cdfdb20840350e841a483df630237326126d5Douglas Gregor unsigned UnorderedGetterPriority = CCP_CodePattern; 6211577cdfdb20840350e841a483df630237326126d5Douglas Gregor unsigned UnorderedSetterPriority = CCP_CodePattern; 6212577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (const ObjCObjectPointerType *ObjCPointer 6213577cdfdb20840350e841a483df630237326126d5Douglas Gregor = Property->getType()->getAs<ObjCObjectPointerType>()) { 6214577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ObjCInterfaceDecl *IFace = ObjCPointer->getInterfaceDecl()) { 6215577cdfdb20840350e841a483df630237326126d5Douglas Gregor // If this interface type is not provably derived from a known 6216577cdfdb20840350e841a483df630237326126d5Douglas Gregor // collection, penalize the corresponding completions. 6217577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (!InheritsFromClassNamed(IFace, "NSMutableArray")) { 6218577cdfdb20840350e841a483df630237326126d5Douglas Gregor IndexedSetterPriority += CCD_ProbablyNotObjCCollection; 6219577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (!InheritsFromClassNamed(IFace, "NSArray")) 6220577cdfdb20840350e841a483df630237326126d5Douglas Gregor IndexedGetterPriority += CCD_ProbablyNotObjCCollection; 6221577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6222577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6223577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (!InheritsFromClassNamed(IFace, "NSMutableSet")) { 6224577cdfdb20840350e841a483df630237326126d5Douglas Gregor UnorderedSetterPriority += CCD_ProbablyNotObjCCollection; 6225577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (!InheritsFromClassNamed(IFace, "NSSet")) 6226577cdfdb20840350e841a483df630237326126d5Douglas Gregor UnorderedGetterPriority += CCD_ProbablyNotObjCCollection; 6227577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6228577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6229577cdfdb20840350e841a483df630237326126d5Douglas Gregor } else { 6230577cdfdb20840350e841a483df630237326126d5Douglas Gregor IndexedGetterPriority += CCD_ProbablyNotObjCCollection; 6231577cdfdb20840350e841a483df630237326126d5Douglas Gregor IndexedSetterPriority += CCD_ProbablyNotObjCCollection; 6232577cdfdb20840350e841a483df630237326126d5Douglas Gregor UnorderedGetterPriority += CCD_ProbablyNotObjCCollection; 6233577cdfdb20840350e841a483df630237326126d5Douglas Gregor UnorderedSetterPriority += CCD_ProbablyNotObjCCollection; 6234577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6235577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6236577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Add -(NSUInteger)countOf<key> 6237577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && 6238577cdfdb20840350e841a483df630237326126d5Douglas Gregor (ReturnType.isNull() || ReturnType->isIntegerType())) { 62395f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::string SelectorName = (Twine("countOf") + UpperKey).str(); 62406204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6241e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))) { 6242577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6243577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6244577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSUInteger"); 6245577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6246577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6247577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6248577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk( 6249577cdfdb20840350e841a483df630237326126d5Douglas Gregor Allocator.CopyString(SelectorId->getName())); 6250577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), 6251577cdfdb20840350e841a483df630237326126d5Douglas Gregor std::min(IndexedGetterPriority, 6252577cdfdb20840350e841a483df630237326126d5Douglas Gregor UnorderedGetterPriority), 6253577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6254577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6255577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6256577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6257577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Indexed getters 6258577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Add -(id)objectInKeyAtIndex:(NSUInteger)index 6259577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && 6260577cdfdb20840350e841a483df630237326126d5Douglas Gregor (ReturnType.isNull() || ReturnType->isObjCObjectPointerType())) { 62616204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor std::string SelectorName 62625f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner = (Twine("objectIn") + UpperKey + "AtIndex").str(); 62636204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6264e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6265577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6266577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6267577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("id"); 6268577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6269577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6270577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6271577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6272577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6273577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSUInteger"); 6274577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6275577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("index"); 6276577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority, 6277577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6278577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6279577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6280577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6281577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Add -(NSArray *)keyAtIndexes:(NSIndexSet *)indexes 6282577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && 6283577cdfdb20840350e841a483df630237326126d5Douglas Gregor (ReturnType.isNull() || 6284577cdfdb20840350e841a483df630237326126d5Douglas Gregor (ReturnType->isObjCObjectPointerType() && 6285577cdfdb20840350e841a483df630237326126d5Douglas Gregor ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() && 6286577cdfdb20840350e841a483df630237326126d5Douglas Gregor ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() 6287577cdfdb20840350e841a483df630237326126d5Douglas Gregor ->getName() == "NSArray"))) { 62886204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor std::string SelectorName 62895f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner = (Twine(Property->getName()) + "AtIndexes").str(); 62906204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6291e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6292577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6293577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6294577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSArray *"); 6295577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6296577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6297577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6298577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6299577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6300577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSIndexSet *"); 6301577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6302577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("indexes"); 6303577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority, 6304577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6305577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6306577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6307577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6308577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Add -(void)getKey:(type **)buffer range:(NSRange)inRange 6309577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid) { 63105f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::string SelectorName = (Twine("get") + UpperKey).str(); 6311577cdfdb20840350e841a483df630237326126d5Douglas Gregor IdentifierInfo *SelectorIds[2] = { 63126204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor &Context.Idents.get(SelectorName), 6313577cdfdb20840350e841a483df630237326126d5Douglas Gregor &Context.Idents.get("range") 6314577cdfdb20840350e841a483df630237326126d5Douglas Gregor }; 6315577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6316e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds))) { 6317577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6318577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6319577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6320577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6321577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6322577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6323577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6324577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6325577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddPlaceholderChunk("object-type"); 6326577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk(" **"); 6327577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6328577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("buffer"); 6329577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6330577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk("range:"); 6331577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6332577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSRange"); 6333577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6334577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("inRange"); 6335577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority, 6336577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6337577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6338577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6339577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6340577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Mutable indexed accessors 6341577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6342577cdfdb20840350e841a483df630237326126d5Douglas Gregor // - (void)insertObject:(type *)object inKeyAtIndex:(NSUInteger)index 6343577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid) { 63445f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::string SelectorName = (Twine("in") + UpperKey + "AtIndex").str(); 6345577cdfdb20840350e841a483df630237326126d5Douglas Gregor IdentifierInfo *SelectorIds[2] = { 6346577cdfdb20840350e841a483df630237326126d5Douglas Gregor &Context.Idents.get("insertObject"), 63476204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor &Context.Idents.get(SelectorName) 6348577cdfdb20840350e841a483df630237326126d5Douglas Gregor }; 6349577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6350e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds))) { 6351577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6352577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6353577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6354577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6355577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6356577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6357577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk("insertObject:"); 6358577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6359577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddPlaceholderChunk("object-type"); 6360577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk(" *"); 6361577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6362577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("object"); 6363577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6364577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6365577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6366577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddPlaceholderChunk("NSUInteger"); 6367577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6368577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("index"); 6369577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 6370577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6371577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6372577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6373577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6374577cdfdb20840350e841a483df630237326126d5Douglas Gregor // - (void)insertKey:(NSArray *)array atIndexes:(NSIndexSet *)indexes 6375577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid) { 63765f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::string SelectorName = (Twine("insert") + UpperKey).str(); 6377577cdfdb20840350e841a483df630237326126d5Douglas Gregor IdentifierInfo *SelectorIds[2] = { 63786204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor &Context.Idents.get(SelectorName), 6379577cdfdb20840350e841a483df630237326126d5Douglas Gregor &Context.Idents.get("atIndexes") 6380577cdfdb20840350e841a483df630237326126d5Douglas Gregor }; 6381577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6382e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds))) { 6383577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6384577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6385577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6386577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6387577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6388577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6389577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6390577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6391577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSArray *"); 6392577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6393577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("array"); 6394577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6395577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk("atIndexes:"); 6396577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6397577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddPlaceholderChunk("NSIndexSet *"); 6398577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6399577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("indexes"); 6400577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 6401577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6402577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6403577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6404577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6405577cdfdb20840350e841a483df630237326126d5Douglas Gregor // -(void)removeObjectFromKeyAtIndex:(NSUInteger)index 6406577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid) { 64076204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor std::string SelectorName 64085f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner = (Twine("removeObjectFrom") + UpperKey + "AtIndex").str(); 64096204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6410e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6411577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6412577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6413577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6414577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6415577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6416577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6417577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6418577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6419577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSUInteger"); 6420577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6421577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("index"); 6422577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 6423577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6424577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6425577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6426577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6427577cdfdb20840350e841a483df630237326126d5Douglas Gregor // -(void)removeKeyAtIndexes:(NSIndexSet *)indexes 6428577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid) { 64296204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor std::string SelectorName 64305f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner = (Twine("remove") + UpperKey + "AtIndexes").str(); 64316204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6432e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6433577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6434577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6435577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6436577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6437577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6438577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6439577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6440577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6441577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSIndexSet *"); 6442577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6443577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("indexes"); 6444577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 6445577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6446577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6447577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6448577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6449577cdfdb20840350e841a483df630237326126d5Douglas Gregor // - (void)replaceObjectInKeyAtIndex:(NSUInteger)index withObject:(id)object 6450577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid) { 64516204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor std::string SelectorName 64525f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner = (Twine("replaceObjectIn") + UpperKey + "AtIndex").str(); 6453577cdfdb20840350e841a483df630237326126d5Douglas Gregor IdentifierInfo *SelectorIds[2] = { 64546204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor &Context.Idents.get(SelectorName), 6455577cdfdb20840350e841a483df630237326126d5Douglas Gregor &Context.Idents.get("withObject") 6456577cdfdb20840350e841a483df630237326126d5Douglas Gregor }; 6457577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6458e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds))) { 6459577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6460577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6461577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6462577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6463577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6464577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6465577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6466577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6467577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddPlaceholderChunk("NSUInteger"); 6468577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6469577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("index"); 6470577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6471577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk("withObject:"); 6472577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6473577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("id"); 6474577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6475577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("object"); 6476577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 6477577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6478577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6479577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6480577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6481577cdfdb20840350e841a483df630237326126d5Douglas Gregor // - (void)replaceKeyAtIndexes:(NSIndexSet *)indexes withKey:(NSArray *)array 6482577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid) { 64836204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor std::string SelectorName1 64845f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner = (Twine("replace") + UpperKey + "AtIndexes").str(); 64855f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::string SelectorName2 = (Twine("with") + UpperKey).str(); 6486577cdfdb20840350e841a483df630237326126d5Douglas Gregor IdentifierInfo *SelectorIds[2] = { 64876204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor &Context.Idents.get(SelectorName1), 64886204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor &Context.Idents.get(SelectorName2) 6489577cdfdb20840350e841a483df630237326126d5Douglas Gregor }; 6490577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6491e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds))) { 6492577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6493577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6494577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6495577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6496577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6497577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6498577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName1 + ":")); 6499577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6500577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddPlaceholderChunk("NSIndexSet *"); 6501577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6502577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("indexes"); 6503577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6504577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName2 + ":")); 6505577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6506577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSArray *"); 6507577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6508577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("array"); 6509577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 6510577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6511577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6512577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6513577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6514577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Unordered getters 6515577cdfdb20840350e841a483df630237326126d5Douglas Gregor // - (NSEnumerator *)enumeratorOfKey 6516577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && 6517577cdfdb20840350e841a483df630237326126d5Douglas Gregor (ReturnType.isNull() || 6518577cdfdb20840350e841a483df630237326126d5Douglas Gregor (ReturnType->isObjCObjectPointerType() && 6519577cdfdb20840350e841a483df630237326126d5Douglas Gregor ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() && 6520577cdfdb20840350e841a483df630237326126d5Douglas Gregor ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() 6521577cdfdb20840350e841a483df630237326126d5Douglas Gregor ->getName() == "NSEnumerator"))) { 65225f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::string SelectorName = (Twine("enumeratorOf") + UpperKey).str(); 65236204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6524e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))) { 6525577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6526577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6527577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSEnumerator *"); 6528577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6529577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6530577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6531577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName)); 6532577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), UnorderedGetterPriority, 6533577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6534577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6535577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6536577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6537577cdfdb20840350e841a483df630237326126d5Douglas Gregor // - (type *)memberOfKey:(type *)object 6538577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && 6539577cdfdb20840350e841a483df630237326126d5Douglas Gregor (ReturnType.isNull() || ReturnType->isObjCObjectPointerType())) { 65405f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::string SelectorName = (Twine("memberOf") + UpperKey).str(); 65416204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6542e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6543577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6544577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6545577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddPlaceholderChunk("object-type"); 6546577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk(" *"); 6547577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6548577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6549577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6550577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6551577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6552577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6553577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddPlaceholderChunk("object-type"); 6554577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk(" *"); 6555577cdfdb20840350e841a483df630237326126d5Douglas Gregor } else { 6556577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk(GetCompletionTypeString(ReturnType, Context, 65578987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor Policy, 6558577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.getAllocator())); 6559577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6560577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6561577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("object"); 6562577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), UnorderedGetterPriority, 6563577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6564577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6565577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6566577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6567577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Mutable unordered accessors 6568577cdfdb20840350e841a483df630237326126d5Douglas Gregor // - (void)addKeyObject:(type *)object 6569577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid) { 65706204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor std::string SelectorName 65715f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner = (Twine("add") + UpperKey + Twine("Object")).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.AddTextChunk("void"); 6577577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6578577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6579577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6580577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6581577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6582577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddPlaceholderChunk("object-type"); 6583577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk(" *"); 6584577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6585577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("object"); 6586577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority, 6587577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6588577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6589577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6590577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6591577cdfdb20840350e841a483df630237326126d5Douglas Gregor // - (void)addKey:(NSSet *)objects 6592577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid) { 65935f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::string SelectorName = (Twine("add") + UpperKey).str(); 65946204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6595e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6596577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6597577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6598577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6599577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6600577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6601577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6602577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6603577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6604577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSSet *"); 6605577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6606577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("objects"); 6607577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority, 6608577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6609577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6610577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6611577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6612577cdfdb20840350e841a483df630237326126d5Douglas Gregor // - (void)removeKeyObject:(type *)object 6613577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid) { 66146204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor std::string SelectorName 66155f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner = (Twine("remove") + UpperKey + Twine("Object")).str(); 66166204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6617e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6618577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6619577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6620577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6621577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6622577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6623577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6624577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6625577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6626577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddPlaceholderChunk("object-type"); 6627577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk(" *"); 6628577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6629577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("object"); 6630577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority, 6631577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6632577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6633577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6634577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6635577cdfdb20840350e841a483df630237326126d5Douglas Gregor // - (void)removeKey:(NSSet *)objects 6636577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid) { 66375f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::string SelectorName = (Twine("remove") + UpperKey).str(); 66386204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6639e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6640577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6641577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6642577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6643577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6644577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6645577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6646577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6647577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6648577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSSet *"); 6649577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6650577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("objects"); 6651577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority, 6652577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6653577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6654577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6655577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6656577cdfdb20840350e841a483df630237326126d5Douglas Gregor // - (void)intersectKey:(NSSet *)objects 6657577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid) { 66585f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::string SelectorName = (Twine("intersect") + UpperKey).str(); 66596204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6660e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6661577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6662577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6663577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6664577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6665577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6666577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6667577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6668577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6669577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSSet *"); 6670577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6671577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("objects"); 6672577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority, 6673577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6674577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6675577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6676577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6677577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Key-Value Observing 6678577cdfdb20840350e841a483df630237326126d5Douglas Gregor // + (NSSet *)keyPathsForValuesAffectingKey 6679577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (!IsInstanceMethod && 6680577cdfdb20840350e841a483df630237326126d5Douglas Gregor (ReturnType.isNull() || 6681577cdfdb20840350e841a483df630237326126d5Douglas Gregor (ReturnType->isObjCObjectPointerType() && 6682577cdfdb20840350e841a483df630237326126d5Douglas Gregor ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() && 6683577cdfdb20840350e841a483df630237326126d5Douglas Gregor ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() 6684577cdfdb20840350e841a483df630237326126d5Douglas Gregor ->getName() == "NSSet"))) { 66856204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor std::string SelectorName 66865f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner = (Twine("keyPathsForValuesAffecting") + UpperKey).str(); 66876204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6688e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))) { 6689577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6690577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6691577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSSet *"); 6692577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6693577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6694577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6695577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName)); 6696577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern, 66973f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor CXCursor_ObjCClassMethodDecl)); 66983f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor } 66993f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor } 67003f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor 67013f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor // + (BOOL)automaticallyNotifiesObserversForKey 67023f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor if (!IsInstanceMethod && 67033f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor (ReturnType.isNull() || 67043f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor ReturnType->isIntegerType() || 67053f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor ReturnType->isBooleanType())) { 67063f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor std::string SelectorName 67075f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner = (Twine("automaticallyNotifiesObserversOf") + UpperKey).str(); 67083f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 67093f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))) { 67103f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor if (ReturnType.isNull()) { 67113f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 67123f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor Builder.AddTextChunk("BOOL"); 67133f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 67143f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor } 67153f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor 67163f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName)); 67173f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern, 67183f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor CXCursor_ObjCClassMethodDecl)); 6719577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6720577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6721577cdfdb20840350e841a483df630237326126d5Douglas Gregor} 6722577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6723e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregorvoid Sema::CodeCompleteObjCMethodDecl(Scope *S, 6724e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor bool IsInstanceMethod, 6725a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian ParsedType ReturnTy) { 6726e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Determine the return type of the method we're declaring, if 6727e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // provided. 6728e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor QualType ReturnType = GetTypeFromParser(ReturnTy); 6729a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian Decl *IDecl = 0; 6730a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian if (CurContext->isObjCContainer()) { 6731a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian ObjCContainerDecl *OCD = dyn_cast<ObjCContainerDecl>(CurContext); 6732a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian IDecl = cast<Decl>(OCD); 6733a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian } 6734ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor // Determine where we should start searching for methods. 6735ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor ObjCContainerDecl *SearchDecl = 0; 6736e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor bool IsInImplementation = false; 6737d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall if (Decl *D = IDecl) { 6738e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (ObjCImplementationDecl *Impl = dyn_cast<ObjCImplementationDecl>(D)) { 6739e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor SearchDecl = Impl->getClassInterface(); 6740e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor IsInImplementation = true; 6741e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } else if (ObjCCategoryImplDecl *CatImpl 6742ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor = dyn_cast<ObjCCategoryImplDecl>(D)) { 6743e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor SearchDecl = CatImpl->getCategoryDecl(); 6744e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor IsInImplementation = true; 6745ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor } else 6746e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor SearchDecl = dyn_cast<ObjCContainerDecl>(D); 6747e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 6748e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6749e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (!SearchDecl && S) { 6750ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor if (DeclContext *DC = static_cast<DeclContext *>(S->getEntity())) 6751e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor SearchDecl = dyn_cast<ObjCContainerDecl>(DC); 6752e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 6753e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6754ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor if (!SearchDecl) { 6755e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 6756e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 6757e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor 0, 0); 6758e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor return; 6759e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 6760e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6761e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Find all of the methods that we could declare/implement here. 6762e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor KnownMethodsMap KnownMethods; 6763e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor FindImplementableMethods(Context, SearchDecl, IsInstanceMethod, 6764ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor ReturnType, KnownMethods); 6765e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6766e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Add declarations or definitions for each of the known methods. 67670a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 6768218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 676928a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 6770218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 6771e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Results.EnterNewScope(); 67728987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor PrintingPolicy Policy = getCompletionPrintingPolicy(*this); 6773e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor for (KnownMethodsMap::iterator M = KnownMethods.begin(), 6774e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor MEnd = KnownMethods.end(); 6775e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor M != MEnd; ++M) { 6776408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor ObjCMethodDecl *Method = M->second.first; 677728a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Builder(Results.getAllocator(), 677828a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis Results.getCodeCompletionTUInfo()); 6779e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6780e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // If the result type was not already provided, add it to the 6781e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // pattern as (type). 6782577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) 678390f5f47348b6581eab5d42eaeacf7f2b28b8118fDouglas Gregor AddObjCPassingTypeChunk(Method->getResultType(), 678490f5f47348b6581eab5d42eaeacf7f2b28b8118fDouglas Gregor Method->getObjCDeclQualifier(), 678590f5f47348b6581eab5d42eaeacf7f2b28b8118fDouglas Gregor Context, Policy, 678690f5f47348b6581eab5d42eaeacf7f2b28b8118fDouglas Gregor Builder); 6787e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6788e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Selector Sel = Method->getSelector(); 6789e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6790e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Add the first part of the selector to the pattern. 6791dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddTypedTextChunk(Builder.getAllocator().CopyString( 6792813d8346529bf094eb2b249648906ba7fd226688Douglas Gregor Sel.getNameForSlot(0))); 6793e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6794e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Add parameters to the pattern. 6795e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor unsigned I = 0; 6796e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor for (ObjCMethodDecl::param_iterator P = Method->param_begin(), 6797e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor PEnd = Method->param_end(); 6798e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor P != PEnd; (void)++P, ++I) { 6799e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Add the part of the selector name. 6800e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (I == 0) 6801218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk(":"); 6802e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor else if (I < Sel.getNumArgs()) { 6803218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6804218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk( 6805813d8346529bf094eb2b249648906ba7fd226688Douglas Gregor Builder.getAllocator().CopyString(Sel.getNameForSlot(I) + ":")); 6806e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } else 6807e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor break; 6808e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6809e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Add the parameter type. 681090f5f47348b6581eab5d42eaeacf7f2b28b8118fDouglas Gregor AddObjCPassingTypeChunk((*P)->getOriginalType(), 681190f5f47348b6581eab5d42eaeacf7f2b28b8118fDouglas Gregor (*P)->getObjCDeclQualifier(), 681290f5f47348b6581eab5d42eaeacf7f2b28b8118fDouglas Gregor Context, Policy, 68138987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor Builder); 6814e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6815e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (IdentifierInfo *Id = (*P)->getIdentifier()) 6816dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddTextChunk(Builder.getAllocator().CopyString( Id->getName())); 6817e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 6818e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6819e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (Method->isVariadic()) { 6820e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (Method->param_size() > 0) 6821218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_Comma); 6822218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("..."); 6823e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor } 6824e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6825447107dfff705ab79d1dbf33ce79b524d63572fdDouglas Gregor if (IsInImplementation && Results.includeCodePatterns()) { 6826e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // We will be defining the method here, so add a compound statement. 6827218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6828218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 6829218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 6830e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (!Method->getResultType()->isVoidType()) { 6831e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // If the result type is not void, add a return clause. 6832218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("return"); 6833218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6834218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 6835218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_SemiColon); 6836e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } else 6837218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("statements"); 6838e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6839218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 6840218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 6841e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 6842e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6843408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor unsigned Priority = CCP_CodePattern; 6844408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor if (!M->second.second) 6845408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor Priority += CCD_InBaseClass; 6846408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor 6847ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor Results.AddResult(Result(Builder.TakeString(), Method, Priority)); 6848e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 6849e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6850577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Add Key-Value-Coding and Key-Value-Observing accessor methods for all of 6851577cdfdb20840350e841a483df630237326126d5Douglas Gregor // the properties in this class and its categories. 68524e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (Context.getLangOpts().ObjC2) { 68535f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<ObjCContainerDecl *, 4> Containers; 6854577cdfdb20840350e841a483df630237326126d5Douglas Gregor Containers.push_back(SearchDecl); 6855577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6856e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor VisitedSelectorSet KnownSelectors; 6857e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor for (KnownMethodsMap::iterator M = KnownMethods.begin(), 6858e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor MEnd = KnownMethods.end(); 6859e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor M != MEnd; ++M) 6860e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor KnownSelectors.insert(M->first); 6861e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor 6862e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor 6863577cdfdb20840350e841a483df630237326126d5Douglas Gregor ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(SearchDecl); 6864577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (!IFace) 6865577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(SearchDecl)) 6866577cdfdb20840350e841a483df630237326126d5Douglas Gregor IFace = Category->getClassInterface(); 6867577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6868577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IFace) { 6869577cdfdb20840350e841a483df630237326126d5Douglas Gregor for (ObjCCategoryDecl *Category = IFace->getCategoryList(); Category; 6870577cdfdb20840350e841a483df630237326126d5Douglas Gregor Category = Category->getNextClassCategory()) 6871577cdfdb20840350e841a483df630237326126d5Douglas Gregor Containers.push_back(Category); 6872577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6873577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6874577cdfdb20840350e841a483df630237326126d5Douglas Gregor for (unsigned I = 0, N = Containers.size(); I != N; ++I) { 6875577cdfdb20840350e841a483df630237326126d5Douglas Gregor for (ObjCContainerDecl::prop_iterator P = Containers[I]->prop_begin(), 6876577cdfdb20840350e841a483df630237326126d5Douglas Gregor PEnd = Containers[I]->prop_end(); 6877577cdfdb20840350e841a483df630237326126d5Douglas Gregor P != PEnd; ++P) { 6878581deb3da481053c4993c7600f97acf7768caac5David Blaikie AddObjCKeyValueCompletions(*P, IsInstanceMethod, ReturnType, Context, 6879e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor KnownSelectors, Results); 6880577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6881577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6882577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6883577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6884e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Results.ExitScope(); 6885e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6886e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 6887e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 6888e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 6889e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor} 68901f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 68911f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregorvoid Sema::CodeCompleteObjCMethodDeclSelector(Scope *S, 68921f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor bool IsInstanceMethod, 689340ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor bool AtParameterName, 6894b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall ParsedType ReturnTy, 68951f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor IdentifierInfo **SelIdents, 68961f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor unsigned NumSelIdents) { 68971f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor // If we have an external source, load the entire class method 68983c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl // pool from the AST file. 68991f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor if (ExternalSource) { 69001f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors(); 69011f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor I != N; ++I) { 69021f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor Selector Sel = ExternalSource->GetExternalSelector(I); 6903db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl if (Sel.isNull() || MethodPool.count(Sel)) 69041f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor continue; 6905db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl 6906db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl ReadMethodPool(Sel); 69071f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor } 69081f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor } 69091f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 69101f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor // Build the set of methods we can see. 69110a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 6912218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 691328a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 6914218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 69151f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 69161f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor if (ReturnTy) 69171f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor Results.setPreferredType(GetTypeFromParser(ReturnTy).getNonReferenceType()); 6918db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl 69191f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor Results.EnterNewScope(); 6920db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl for (GlobalMethodPool::iterator M = MethodPool.begin(), 6921db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl MEnd = MethodPool.end(); 6922db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl M != MEnd; ++M) { 6923db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl for (ObjCMethodList *MethList = IsInstanceMethod ? &M->second.first : 6924db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl &M->second.second; 6925db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl MethList && MethList->Method; 69261f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor MethList = MethList->Next) { 69271f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor if (!isAcceptableObjCMethod(MethList->Method, MK_Any, SelIdents, 69281f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor NumSelIdents)) 69291f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor continue; 69301f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 693140ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor if (AtParameterName) { 693240ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor // Suggest parameter names we've seen before. 693340ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor if (NumSelIdents && NumSelIdents <= MethList->Method->param_size()) { 693440ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor ParmVarDecl *Param = MethList->Method->param_begin()[NumSelIdents-1]; 693540ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor if (Param->getIdentifier()) { 693628a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Builder(Results.getAllocator(), 693728a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis Results.getCodeCompletionTUInfo()); 6938dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddTypedTextChunk(Builder.getAllocator().CopyString( 6939218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Param->getIdentifier()->getName())); 6940218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 694140ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor } 694240ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor } 694340ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor 694440ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor continue; 694540ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor } 694640ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor 69471f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor Result R(MethList->Method, 0); 69481f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor R.StartParameter = NumSelIdents; 69491f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor R.AllParametersAreInformative = false; 69501f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor R.DeclaringEntity = true; 69511f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor Results.MaybeAddResult(R, CurContext); 69521f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor } 69531f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor } 69541f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 69551f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor Results.ExitScope(); 6956e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 6957e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 6958e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 69591f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor} 696087c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor 6961f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregorvoid Sema::CodeCompletePreprocessorDirective(bool InConditional) { 6962218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 696328a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 696452779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor CodeCompletionContext::CCC_PreprocessorDirective); 6965f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor Results.EnterNewScope(); 6966f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 6967f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #if <condition> 696828a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Builder(Results.getAllocator(), 696928a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis Results.getCodeCompletionTUInfo()); 6970218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("if"); 6971218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6972218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("condition"); 6973218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 6974f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 6975f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #ifdef <macro> 6976218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("ifdef"); 6977218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6978218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("macro"); 6979218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 6980218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor 6981f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #ifndef <macro> 6982218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("ifndef"); 6983218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6984218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("macro"); 6985218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 6986f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 6987f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor if (InConditional) { 6988f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #elif <condition> 6989218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("elif"); 6990218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6991218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("condition"); 6992218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 6993f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 6994f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #else 6995218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("else"); 6996218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 6997f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 6998f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #endif 6999218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("endif"); 7000218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 7001f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor } 7002f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 7003f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #include "header" 7004218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("include"); 7005218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7006218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("\""); 7007218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("header"); 7008218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("\""); 7009218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 7010f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 7011f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #include <header> 7012218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("include"); 7013218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7014218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("<"); 7015218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("header"); 7016218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk(">"); 7017218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 7018f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 7019f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #define <macro> 7020218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("define"); 7021218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7022218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("macro"); 7023218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 7024f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 7025f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #define <macro>(<args>) 7026218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("define"); 7027218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7028218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("macro"); 7029218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 7030218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("args"); 7031218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 7032218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 7033f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 7034f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #undef <macro> 7035218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("undef"); 7036218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7037218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("macro"); 7038218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 7039f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 7040f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #line <number> 7041218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("line"); 7042218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7043218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("number"); 7044218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 7045f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 7046f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #line <number> "filename" 7047218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("line"); 7048218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7049218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("number"); 7050218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7051218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("\""); 7052218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("filename"); 7053218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("\""); 7054218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 7055f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 7056f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #error <message> 7057218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("error"); 7058218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7059218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("message"); 7060218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 7061f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 7062f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #pragma <arguments> 7063218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("pragma"); 7064218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7065218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("arguments"); 7066218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 7067f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 70684e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (getLangOpts().ObjC1) { 7069f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #import "header" 7070218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("import"); 7071218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7072218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("\""); 7073218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("header"); 7074218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("\""); 7075218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 7076f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 7077f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #import <header> 7078218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("import"); 7079218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7080218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("<"); 7081218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("header"); 7082218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk(">"); 7083218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 7084f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor } 7085f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 7086f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #include_next "header" 7087218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("include_next"); 7088218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7089218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("\""); 7090218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("header"); 7091218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("\""); 7092218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 7093f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 7094f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #include_next <header> 7095218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("include_next"); 7096218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7097218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("<"); 7098218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("header"); 7099218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk(">"); 7100218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 7101f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 7102f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #warning <message> 7103218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("warning"); 7104218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7105218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("message"); 7106218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 7107f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 7108f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // Note: #ident and #sccs are such crazy anachronisms that we don't provide 7109f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // completions for them. And __include_macros is a Clang-internal extension 7110f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // that we don't want to encourage anyone to use. 7111f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 7112f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // FIXME: we don't support #assert or #unassert, so don't suggest them. 7113f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor Results.ExitScope(); 7114f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 7115f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 7116721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor CodeCompletionContext::CCC_PreprocessorDirective, 7117f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor Results.data(), Results.size()); 7118f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor} 7119f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 7120f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregorvoid Sema::CodeCompleteInPreprocessorConditionalExclusion(Scope *S) { 7121f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor CodeCompleteOrdinaryName(S, 7122f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall S->getFnParent()? Sema::PCC_RecoveryInFunction 7123f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall : Sema::PCC_Namespace); 7124f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor} 7125f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 7126f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregorvoid Sema::CodeCompletePreprocessorMacroName(bool IsDefinition) { 7127218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 712828a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 712952779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor IsDefinition? CodeCompletionContext::CCC_MacroName 713052779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor : CodeCompletionContext::CCC_MacroNameUse); 71311fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor if (!IsDefinition && (!CodeCompleter || CodeCompleter->includeMacros())) { 71321fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor // Add just the names of macros, not their arguments. 713328a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Builder(Results.getAllocator(), 713428a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis Results.getCodeCompletionTUInfo()); 71351fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor Results.EnterNewScope(); 71361fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor for (Preprocessor::macro_iterator M = PP.macro_begin(), 71371fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor MEnd = PP.macro_end(); 71381fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor M != MEnd; ++M) { 7139dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddTypedTextChunk(Builder.getAllocator().CopyString( 7140218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor M->first->getName())); 7141218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 71421fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor } 71431fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor Results.ExitScope(); 71441fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor } else if (IsDefinition) { 71451fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor // FIXME: Can we detect when the user just wrote an include guard above? 71461fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor } 71471fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor 714852779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 71491fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor Results.data(), Results.size()); 71501fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor} 71511fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor 7152f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregorvoid Sema::CodeCompletePreprocessorExpression() { 7153218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 715428a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompleter->getCodeCompletionTUInfo(), 715552779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor CodeCompletionContext::CCC_PreprocessorExpression); 7156f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor 7157f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor if (!CodeCompleter || CodeCompleter->includeMacros()) 7158f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor AddMacroResults(PP, Results); 7159f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor 7160f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor // defined (<macro>) 7161f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor Results.EnterNewScope(); 716228a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionBuilder Builder(Results.getAllocator(), 716328a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis Results.getCodeCompletionTUInfo()); 7164218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("defined"); 7165218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7166218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 7167218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("macro"); 7168218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 7169218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 7170f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor Results.ExitScope(); 7171f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor 7172f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 7173f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor CodeCompletionContext::CCC_PreprocessorExpression, 7174f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor Results.data(), Results.size()); 7175f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor} 7176f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor 7177f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregorvoid Sema::CodeCompletePreprocessorMacroArgument(Scope *S, 7178f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor IdentifierInfo *Macro, 7179f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor MacroInfo *MacroInfo, 7180f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor unsigned Argument) { 7181f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor // FIXME: In the future, we could provide "overload" results, much like we 7182f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor // do for function calls. 7183f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor 71845c5f03e4020e90b9760ec547962ba02b029cc359Argyrios Kyrtzidis // Now just ignore this. There will be another code-completion callback 71855c5f03e4020e90b9760ec547962ba02b029cc359Argyrios Kyrtzidis // for the expanded tokens. 7186f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor} 7187f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor 718855817afdf9d453a443262a733f6caf6692dca118Douglas Gregorvoid Sema::CodeCompleteNaturalLanguage() { 718955817afdf9d453a443262a733f6caf6692dca118Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 7190af1c6b532e6e1e944db987f29062e5efce71a573Douglas Gregor CodeCompletionContext::CCC_NaturalLanguage, 719155817afdf9d453a443262a733f6caf6692dca118Douglas Gregor 0, 0); 719255817afdf9d453a443262a733f6caf6692dca118Douglas Gregor} 719355817afdf9d453a443262a733f6caf6692dca118Douglas Gregor 7194dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregorvoid Sema::GatherGlobalCodeCompletions(CodeCompletionAllocator &Allocator, 719528a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionTUInfo &CCTUInfo, 71965f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVectorImpl<CodeCompletionResult> &Results) { 719728a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis ResultBuilder Builder(*this, Allocator, CCTUInfo, 719828a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis CodeCompletionContext::CCC_Recovery); 71998071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor if (!CodeCompleter || CodeCompleter->includeGlobals()) { 72008071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompletionDeclConsumer Consumer(Builder, 72018071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor Context.getTranslationUnitDecl()); 72028071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(Context.getTranslationUnitDecl(), LookupAnyName, 72038071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor Consumer); 72048071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor } 720587c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor 720687c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor if (!CodeCompleter || CodeCompleter->includeMacros()) 720787c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor AddMacroResults(PP, Builder); 720887c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor 720987c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor Results.clear(); 721087c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor Results.insert(Results.end(), 721187c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor Builder.data(), Builder.data() + Builder.size()); 721287c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor} 7213