SemaCodeComplete.cpp revision ebcb57a8d298862c65043e88b2429591ab3c58d3
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; 12686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 12786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \brief If non-NULL, a filter function used to remove any code-completion 12886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// results that are not desirable. 12986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor LookupFilter Filter; 13045bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor 13145bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor /// \brief Whether we should allow declarations as 13245bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor /// nested-name-specifiers that would otherwise be filtered out. 13345bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor bool AllowNestedNameSpecifiers; 13445bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor 1355ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor /// \brief If set, the type that we would prefer our resulting value 1365ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor /// declarations to have. 1375ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor /// 1385ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor /// Closely matching the preferred type gives a boost to a result's 1395ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor /// priority. 1405ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor CanQualType PreferredType; 1415ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 14286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \brief A list of shadow maps, which is used to model name hiding at 14386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// different levels of, e.g., the inheritance hierarchy. 14486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor std::list<ShadowMap> ShadowMaps; 14586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 1463cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor /// \brief If we're potentially referring to a C++ member function, the set 1473cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor /// of qualifiers applied to the object type. 1483cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor Qualifiers ObjectTypeQualifiers; 1493cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor 1503cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor /// \brief Whether the \p ObjectTypeQualifiers field is active. 1513cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor bool HasObjectTypeQualifiers; 1523cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor 153265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor /// \brief The selector that we prefer. 154265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor Selector PreferredSelector; 155265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor 156ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor /// \brief The completion context in which we are gathering results. 157cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor CodeCompletionContext CompletionContext; 158cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor 159ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor /// \brief If we are in an instance method definition, the @implementation 160ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor /// object. 161ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor ObjCImplementationDecl *ObjCImplementation; 162ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor 163cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor void AdjustResultPriorityForDecl(Result &R); 1641f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 1656f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor void MaybeAddConstructorResults(Result R); 1666f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 16786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor public: 168dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor explicit ResultBuilder(Sema &SemaRef, CodeCompletionAllocator &Allocator, 16952779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor const CodeCompletionContext &CompletionContext, 17052779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor LookupFilter Filter = 0) 171218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor : SemaRef(SemaRef), Allocator(Allocator), Filter(Filter), 172218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor AllowNestedNameSpecifiers(false), HasObjectTypeQualifiers(false), 173ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor CompletionContext(CompletionContext), 174ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor ObjCImplementation(0) 175ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor { 176ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor // If this is an Objective-C instance method definition, dig out the 177ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor // corresponding implementation. 178ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor switch (CompletionContext.getKind()) { 179ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor case CodeCompletionContext::CCC_Expression: 180ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor case CodeCompletionContext::CCC_ObjCMessageReceiver: 181ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor case CodeCompletionContext::CCC_ParenthesizedExpression: 182ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor case CodeCompletionContext::CCC_Statement: 183ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor case CodeCompletionContext::CCC_Recovery: 184ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor if (ObjCMethodDecl *Method = SemaRef.getCurMethodDecl()) 185ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor if (Method->isInstanceMethod()) 186ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor if (ObjCInterfaceDecl *Interface = Method->getClassInterface()) 187ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor ObjCImplementation = Interface->getImplementation(); 188ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor break; 189ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor 190ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor default: 191ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor break; 192ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor } 193ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor } 19486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 195d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor /// \brief Whether we should include code patterns in the completion 196d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor /// results. 197d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor bool includeCodePatterns() const { 198d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor return SemaRef.CodeCompleter && 199f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor SemaRef.CodeCompleter->includeCodePatterns(); 200d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor } 201d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor 20286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \brief Set the filter used for code-completion results. 20386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor void setFilter(LookupFilter Filter) { 20486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor this->Filter = Filter; 20586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 20686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 20786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Result *data() { return Results.empty()? 0 : &Results.front(); } 20886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor unsigned size() const { return Results.size(); } 20986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool empty() const { return Results.empty(); } 21086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 2115ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor /// \brief Specify the preferred type. 2125ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor void setPreferredType(QualType T) { 2135ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor PreferredType = SemaRef.Context.getCanonicalType(T); 2145ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor } 2155ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 2163cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor /// \brief Set the cv-qualifiers on the object type, for us in filtering 2173cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor /// calls to member functions. 2183cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor /// 2193cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor /// When there are qualifiers in this set, they will be used to filter 2203cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor /// out member functions that aren't available (because there will be a 2213cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor /// cv-qualifier mismatch) or prefer functions with an exact qualifier 2223cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor /// match. 2233cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor void setObjectTypeQualifiers(Qualifiers Quals) { 2243cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor ObjectTypeQualifiers = Quals; 2253cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor HasObjectTypeQualifiers = true; 2263cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor } 2273cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor 228265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor /// \brief Set the preferred selector. 229265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor /// 230265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor /// When an Objective-C method declaration result is added, and that 231265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor /// method's selector matches this preferred selector, we give that method 232265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor /// a slight priority boost. 233265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor void setPreferredSelector(Selector Sel) { 234265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor PreferredSelector = Sel; 235265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor } 236ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor 237cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor /// \brief Retrieve the code-completion context for which results are 238cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor /// being collected. 239cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor const CodeCompletionContext &getCompletionContext() const { 240cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor return CompletionContext; 241cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor } 242cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor 24345bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor /// \brief Specify whether nested-name-specifiers are allowed. 24445bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor void allowNestedNameSpecifiers(bool Allow = true) { 24545bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor AllowNestedNameSpecifiers = Allow; 24645bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor } 24745bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor 248b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor /// \brief Return the semantic analysis object for which we are collecting 249b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor /// code completion results. 250b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor Sema &getSema() const { return SemaRef; } 251b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor 252218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor /// \brief Retrieve the allocator used to allocate code completion strings. 253dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor CodeCompletionAllocator &getAllocator() const { return Allocator; } 254218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor 255e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor /// \brief Determine whether the given declaration is at all interesting 256e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor /// as a code-completion result. 25745bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor /// 25845bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor /// \param ND the declaration that we are inspecting. 25945bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor /// 26045bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor /// \param AsNestedNameSpecifier will be set true if this declaration is 26145bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor /// only interesting when it is a nested-name-specifier. 26245bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor bool isInterestingDecl(NamedDecl *ND, bool &AsNestedNameSpecifier) const; 2636660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor 2646660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor /// \brief Check whether the result is hidden by the Hiding declaration. 2656660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor /// 2666660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor /// \returns true if the result is hidden and cannot be found, false if 2676660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor /// the hidden result could still be found. When false, \p R may be 2686660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor /// modified to describe how the result can be found (e.g., via extra 2696660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor /// qualification). 2706660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor bool CheckHiddenResult(Result &R, DeclContext *CurContext, 2716660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor NamedDecl *Hiding); 2726660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor 27386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \brief Add a new result to this result set (if it isn't already in one 27486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// of the shadow maps), or replace an existing result (for, e.g., a 27586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// redeclaration). 276456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor /// 27781f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor /// \param R the result to add (if it is unique). 278456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor /// 27981f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor /// \param CurContext the context in which this result will be named. 280456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor void MaybeAddResult(Result R, DeclContext *CurContext = 0); 28186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 2821ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// \brief Add a new result to this result set, where we already know 2831ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// the hiding declation (if any). 2841ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// 2851ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// \param R the result to add (if it is unique). 2861ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// 2871ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// \param CurContext the context in which this result will be named. 2881ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// 2891ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// \param Hiding the declaration that hides the result. 2900cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor /// 2910cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor /// \param InBaseClass whether the result was found in a base 2920cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor /// class of the searched context. 2930cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor void AddResult(Result R, DeclContext *CurContext, NamedDecl *Hiding, 2940cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor bool InBaseClass); 2951ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 296a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor /// \brief Add a new non-declaration result to this result set. 297a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor void AddResult(Result R); 298a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor 29986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \brief Enter into a new scope. 30086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor void EnterNewScope(); 30186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 30286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \brief Exit from the current scope. 30386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor void ExitScope(); 30486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 30555385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor /// \brief Ignore this declaration, if it is seen again. 30655385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor void Ignore(Decl *D) { AllDeclsFound.insert(D->getCanonicalDecl()); } 30755385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor 30886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \name Name lookup predicates 30986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// 31086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// These predicates can be passed to the name lookup functions to filter the 31186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// results of name lookup. All of the predicates have the same type, so that 31286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// 31386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor //@{ 314791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor bool IsOrdinaryName(NamedDecl *ND) const; 3154710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor bool IsOrdinaryNonTypeName(NamedDecl *ND) const; 316f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor bool IsIntegralConstantValue(NamedDecl *ND) const; 31701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor bool IsOrdinaryNonValueName(NamedDecl *ND) const; 31886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool IsNestedNameSpecifier(NamedDecl *ND) const; 31986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool IsEnum(NamedDecl *ND) const; 32086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool IsClassOrStruct(NamedDecl *ND) const; 32186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool IsUnion(NamedDecl *ND) const; 32286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool IsNamespace(NamedDecl *ND) const; 32386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool IsNamespaceOrAlias(NamedDecl *ND) const; 32486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool IsType(NamedDecl *ND) const; 325eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor bool IsMember(NamedDecl *ND) const; 32680f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor bool IsObjCIvar(NamedDecl *ND) const; 3278e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor bool IsObjCMessageReceiver(NamedDecl *ND) const; 32881f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor bool IsObjCMessageReceiverOrLambdaCapture(NamedDecl *ND) const; 329fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor bool IsObjCCollection(NamedDecl *ND) const; 33052779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor bool IsImpossibleToSatisfy(NamedDecl *ND) const; 33186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor //@} 33286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor }; 33386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 33486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 335fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregorclass ResultBuilder::ShadowMapEntry::iterator { 336fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor llvm::PointerUnion<NamedDecl*, const DeclIndexPair*> DeclOrIterator; 337fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor unsigned SingleDeclIndex; 338fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 339fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregorpublic: 340fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor typedef DeclIndexPair value_type; 341fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor typedef value_type reference; 342fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor typedef std::ptrdiff_t difference_type; 343fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor typedef std::input_iterator_tag iterator_category; 344fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 345fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor class pointer { 346fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor DeclIndexPair Value; 347fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 348fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor public: 349fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor pointer(const DeclIndexPair &Value) : Value(Value) { } 350fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 351fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor const DeclIndexPair *operator->() const { 352fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return &Value; 353fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 354fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor }; 355fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 356fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor iterator() : DeclOrIterator((NamedDecl *)0), SingleDeclIndex(0) { } 357fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 358fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor iterator(NamedDecl *SingleDecl, unsigned Index) 359fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor : DeclOrIterator(SingleDecl), SingleDeclIndex(Index) { } 360fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 361fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor iterator(const DeclIndexPair *Iterator) 362fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor : DeclOrIterator(Iterator), SingleDeclIndex(0) { } 363fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 364fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor iterator &operator++() { 365fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (DeclOrIterator.is<NamedDecl *>()) { 366fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor DeclOrIterator = (NamedDecl *)0; 367fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor SingleDeclIndex = 0; 368fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return *this; 369fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 370fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 371fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor const DeclIndexPair *I = DeclOrIterator.get<const DeclIndexPair*>(); 372fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ++I; 373fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor DeclOrIterator = I; 374fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return *this; 375fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 376fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 37766392d4260cdd1a98f9ce908d99e3cf9a31432e2Chris Lattner /*iterator operator++(int) { 378fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor iterator tmp(*this); 379fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ++(*this); 380fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return tmp; 38166392d4260cdd1a98f9ce908d99e3cf9a31432e2Chris Lattner }*/ 382fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 383fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor reference operator*() const { 384fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (NamedDecl *ND = DeclOrIterator.dyn_cast<NamedDecl *>()) 385fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return reference(ND, SingleDeclIndex); 386fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 387d490f953e812a9bb1729637cc70a6db7d997ced0Douglas Gregor return *DeclOrIterator.get<const DeclIndexPair*>(); 388fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 389fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 390fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor pointer operator->() const { 391fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return pointer(**this); 392fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 393fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 394fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor friend bool operator==(const iterator &X, const iterator &Y) { 395d490f953e812a9bb1729637cc70a6db7d997ced0Douglas Gregor return X.DeclOrIterator.getOpaqueValue() 396d490f953e812a9bb1729637cc70a6db7d997ced0Douglas Gregor == Y.DeclOrIterator.getOpaqueValue() && 397fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor X.SingleDeclIndex == Y.SingleDeclIndex; 398fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 399fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 400fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor friend bool operator!=(const iterator &X, const iterator &Y) { 401d490f953e812a9bb1729637cc70a6db7d997ced0Douglas Gregor return !(X == Y); 402fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 403fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor}; 404fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 405fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas GregorResultBuilder::ShadowMapEntry::iterator 406fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas GregorResultBuilder::ShadowMapEntry::begin() const { 407fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (DeclOrVector.isNull()) 408fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return iterator(); 409fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 410fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (NamedDecl *ND = DeclOrVector.dyn_cast<NamedDecl *>()) 411fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return iterator(ND, SingleDeclIndex); 412fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 413fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return iterator(DeclOrVector.get<DeclIndexPairVector *>()->begin()); 414fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor} 415fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 416fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas GregorResultBuilder::ShadowMapEntry::iterator 417fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas GregorResultBuilder::ShadowMapEntry::end() const { 418fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (DeclOrVector.is<NamedDecl *>() || DeclOrVector.isNull()) 419fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return iterator(); 420fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 421fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return iterator(DeclOrVector.get<DeclIndexPairVector *>()->end()); 422fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor} 423fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 424456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// \brief Compute the qualification required to get from the current context 425456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// (\p CurContext) to the target context (\p TargetContext). 426456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// 427456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// \param Context the AST context in which the qualification will be used. 428456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// 429456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// \param CurContext the context where an entity is being named, which is 430456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// typically based on the current scope. 431456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// 432456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// \param TargetContext the context in which the named entity actually 433456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// resides. 434456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// 435456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// \returns a nested name specifier that refers into the target context, or 436456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// NULL if no qualification is needed. 437456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregorstatic NestedNameSpecifier * 438456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas GregorgetRequiredQualification(ASTContext &Context, 439456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor DeclContext *CurContext, 440456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor DeclContext *TargetContext) { 4415f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<DeclContext *, 4> TargetParents; 442456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor 443456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor for (DeclContext *CommonAncestor = TargetContext; 444456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor CommonAncestor && !CommonAncestor->Encloses(CurContext); 445456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor CommonAncestor = CommonAncestor->getLookupParent()) { 446456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor if (CommonAncestor->isTransparentContext() || 447456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor CommonAncestor->isFunctionOrMethod()) 448456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor continue; 449456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor 450456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor TargetParents.push_back(CommonAncestor); 451456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor } 452456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor 453456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor NestedNameSpecifier *Result = 0; 454456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor while (!TargetParents.empty()) { 455456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor DeclContext *Parent = TargetParents.back(); 456456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor TargetParents.pop_back(); 457456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor 458fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor if (NamespaceDecl *Namespace = dyn_cast<NamespaceDecl>(Parent)) { 459fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor if (!Namespace->getIdentifier()) 460fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor continue; 461fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor 462456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor Result = NestedNameSpecifier::Create(Context, Result, Namespace); 463fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor } 464456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor else if (TagDecl *TD = dyn_cast<TagDecl>(Parent)) 465456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor Result = NestedNameSpecifier::Create(Context, Result, 466456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor false, 467456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor Context.getTypeDeclType(TD).getTypePtr()); 4680c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor } 469456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor return Result; 470456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor} 471456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor 47245bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregorbool ResultBuilder::isInterestingDecl(NamedDecl *ND, 47345bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor bool &AsNestedNameSpecifier) const { 47445bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor AsNestedNameSpecifier = false; 47545bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor 476e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor ND = ND->getUnderlyingDecl(); 477e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor unsigned IDNS = ND->getIdentifierNamespace(); 478f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor 479f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor // Skip unnamed entities. 480e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor if (!ND->getDeclName()) 481e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return false; 48286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 48386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Friend declarations and declarations introduced due to friends are never 48486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // added as results. 48592b7f70c924cbf4514e9e434cea7def51ab49860John McCall if (IDNS & (Decl::IDNS_OrdinaryFriend | Decl::IDNS_TagFriend)) 486e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return false; 487e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 4887628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor // Class template (partial) specializations are never added as results. 489e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor if (isa<ClassTemplateSpecializationDecl>(ND) || 490e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor isa<ClassTemplatePartialSpecializationDecl>(ND)) 491e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return false; 49286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 4937628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor // Using declarations themselves are never added as results. 494e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor if (isa<UsingDecl>(ND)) 495e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return false; 496e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 497e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor // Some declarations have reserved names that we don't want to ever show. 498e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor if (const IdentifierInfo *Id = ND->getIdentifier()) { 49986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // __va_list_tag is a freak of nature. Find it and skip it. 50086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (Id->isStr("__va_list_tag") || Id->isStr("__builtin_va_list")) 501e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return false; 50286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 503f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor // Filter out names reserved for the implementation (C99 7.1.3, 504797efb51ce0825eb4cce2864a5cea2b30e85f06cDouglas Gregor // C++ [lib.global.names]) if they come from a system header. 505e013d685c6689ac7ae103ee88acf573422d1ed6aDaniel Dunbar // 506e013d685c6689ac7ae103ee88acf573422d1ed6aDaniel Dunbar // FIXME: Add predicate for this. 507f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor if (Id->getLength() >= 2) { 508e013d685c6689ac7ae103ee88acf573422d1ed6aDaniel Dunbar const char *Name = Id->getNameStart(); 509f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor if (Name[0] == '_' && 510797efb51ce0825eb4cce2864a5cea2b30e85f06cDouglas Gregor (Name[1] == '_' || (Name[1] >= 'A' && Name[1] <= 'Z')) && 511797efb51ce0825eb4cce2864a5cea2b30e85f06cDouglas Gregor (ND->getLocation().isInvalid() || 512797efb51ce0825eb4cce2864a5cea2b30e85f06cDouglas Gregor SemaRef.SourceMgr.isInSystemHeader( 513797efb51ce0825eb4cce2864a5cea2b30e85f06cDouglas Gregor SemaRef.SourceMgr.getSpellingLoc(ND->getLocation())))) 514e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return false; 515f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor } 51686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 5176f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 5189b0ba87a5ee4d872ae60dbfe4cbd500e57b8a775Douglas Gregor // Skip out-of-line declarations and definitions. 5199b0ba87a5ee4d872ae60dbfe4cbd500e57b8a775Douglas Gregor // NOTE: Unless it's an Objective-C property, method, or ivar, where 5209b0ba87a5ee4d872ae60dbfe4cbd500e57b8a775Douglas Gregor // the contexts can be messy. 5219b0ba87a5ee4d872ae60dbfe4cbd500e57b8a775Douglas Gregor if (!ND->getDeclContext()->Equals(ND->getLexicalDeclContext()) && 5229b0ba87a5ee4d872ae60dbfe4cbd500e57b8a775Douglas Gregor !(isa<ObjCPropertyDecl>(ND) || isa<ObjCIvarDecl>(ND) || 5239b0ba87a5ee4d872ae60dbfe4cbd500e57b8a775Douglas Gregor isa<ObjCMethodDecl>(ND))) 5249b0ba87a5ee4d872ae60dbfe4cbd500e57b8a775Douglas Gregor return false; 5259b0ba87a5ee4d872ae60dbfe4cbd500e57b8a775Douglas Gregor 526a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor if (Filter == &ResultBuilder::IsNestedNameSpecifier || 527a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor ((isa<NamespaceDecl>(ND) || isa<NamespaceAliasDecl>(ND)) && 528a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor Filter != &ResultBuilder::IsNamespace && 52952779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor Filter != &ResultBuilder::IsNamespaceOrAlias && 53052779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor Filter != 0)) 531a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor AsNestedNameSpecifier = true; 532a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor 53386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Filter out any unwanted results. 53445bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor if (Filter && !(this->*Filter)(ND)) { 53545bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor // Check whether it is interesting as a nested-name-specifier. 53645bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor if (AllowNestedNameSpecifiers && SemaRef.getLangOptions().CPlusPlus && 53745bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor IsNestedNameSpecifier(ND) && 53845bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor (Filter != &ResultBuilder::IsMember || 53945bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor (isa<CXXRecordDecl>(ND) && 54045bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor cast<CXXRecordDecl>(ND)->isInjectedClassName()))) { 54145bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor AsNestedNameSpecifier = true; 54245bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor return true; 54345bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor } 54445bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor 545e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return false; 546a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor } 547e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor // ... then it must be interesting! 548e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return true; 549e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor} 550e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 5516660d845af8edb99098a08cf2539233a3be650b3Douglas Gregorbool ResultBuilder::CheckHiddenResult(Result &R, DeclContext *CurContext, 5526660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor NamedDecl *Hiding) { 5536660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor // In C, there is no way to refer to a hidden name. 5546660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor // FIXME: This isn't true; we can find a tag name hidden by an ordinary 5556660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor // name if we introduce the tag type. 5566660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor if (!SemaRef.getLangOptions().CPlusPlus) 5576660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor return true; 5586660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor 5597a126a474fdde06382b315b4e3d8ef0a21d4dc31Sebastian Redl DeclContext *HiddenCtx = R.Declaration->getDeclContext()->getRedeclContext(); 5606660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor 5616660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor // There is no way to qualify a name declared in a function or method. 5626660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor if (HiddenCtx->isFunctionOrMethod()) 5636660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor return true; 5646660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor 5657a126a474fdde06382b315b4e3d8ef0a21d4dc31Sebastian Redl if (HiddenCtx == Hiding->getDeclContext()->getRedeclContext()) 5666660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor return true; 5676660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor 5686660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor // We can refer to the result with the appropriate qualification. Do it. 5696660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor R.Hidden = true; 5706660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor R.QualifierIsInformative = false; 5716660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor 5726660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor if (!R.Qualifier) 5736660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor R.Qualifier = getRequiredQualification(SemaRef.Context, 5746660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor CurContext, 5756660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor R.Declaration->getDeclContext()); 5766660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor return false; 5776660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor} 5786660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor 5791f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor/// \brief A simplified classification of types used to determine whether two 5801f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor/// types are "similar enough" when adjusting priorities. 5811827e10051638770ad9ccf3e285caf95f995afd1Douglas GregorSimplifiedTypeClass clang::getSimplifiedTypeClass(CanQualType T) { 5821f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor switch (T->getTypeClass()) { 5831f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::Builtin: 5841f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor switch (cast<BuiltinType>(T)->getKind()) { 5851f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case BuiltinType::Void: 5861f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Void; 5871f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 5881f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case BuiltinType::NullPtr: 5891f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Pointer; 5901f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 5911f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case BuiltinType::Overload: 5921f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case BuiltinType::Dependent: 5931f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Other; 5941f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 5951f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case BuiltinType::ObjCId: 5961f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case BuiltinType::ObjCClass: 5971f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case BuiltinType::ObjCSel: 5981f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_ObjectiveC; 5991f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 6001f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor default: 6011f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Arithmetic; 6021f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor } 6037530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie 6041f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::Complex: 6051f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Arithmetic; 6061f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 6071f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::Pointer: 6081f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Pointer; 6091f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 6101f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::BlockPointer: 6111f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Block; 6121f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 6131f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::LValueReference: 6141f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::RValueReference: 6151f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return getSimplifiedTypeClass(T->getAs<ReferenceType>()->getPointeeType()); 6161f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 6171f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::ConstantArray: 6181f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::IncompleteArray: 6191f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::VariableArray: 6201f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::DependentSizedArray: 6211f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Array; 6221f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 6231f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::DependentSizedExtVector: 6241f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::Vector: 6251f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::ExtVector: 6261f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Arithmetic; 6271f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 6281f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::FunctionProto: 6291f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::FunctionNoProto: 6301f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Function; 6311f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 6321f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::Record: 6331f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Record; 6341f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 6351f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::Enum: 6361f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Arithmetic; 6371f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 6381f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::ObjCObject: 6391f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::ObjCInterface: 6401f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::ObjCObjectPointer: 6411f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_ObjectiveC; 6421f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 6431f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor default: 6441f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Other; 6451f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor } 6461f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor} 6471f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 6481f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor/// \brief Get the type that a given expression will have if this declaration 6491f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor/// is used as an expression in its "typical" code-completion form. 6501827e10051638770ad9ccf3e285caf95f995afd1Douglas GregorQualType clang::getDeclUsageType(ASTContext &C, NamedDecl *ND) { 6511f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor ND = cast<NamedDecl>(ND->getUnderlyingDecl()); 6521f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 6531f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor if (TypeDecl *Type = dyn_cast<TypeDecl>(ND)) 6541f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return C.getTypeDeclType(Type); 6551f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor if (ObjCInterfaceDecl *Iface = dyn_cast<ObjCInterfaceDecl>(ND)) 6561f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return C.getObjCInterfaceType(Iface); 6571f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 6581f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor QualType T; 6591f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor if (FunctionDecl *Function = dyn_cast<FunctionDecl>(ND)) 6605291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor T = Function->getCallResultType(); 6611f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor else if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(ND)) 6625291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor T = Method->getSendResultType(); 6631f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor else if (FunctionTemplateDecl *FunTmpl = dyn_cast<FunctionTemplateDecl>(ND)) 6645291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor T = FunTmpl->getTemplatedDecl()->getCallResultType(); 6651f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor else if (EnumConstantDecl *Enumerator = dyn_cast<EnumConstantDecl>(ND)) 6661f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor T = C.getTypeDeclType(cast<EnumDecl>(Enumerator->getDeclContext())); 6671f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor else if (ObjCPropertyDecl *Property = dyn_cast<ObjCPropertyDecl>(ND)) 6681f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor T = Property->getType(); 6691f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor else if (ValueDecl *Value = dyn_cast<ValueDecl>(ND)) 6701f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor T = Value->getType(); 6711f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor else 6721f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return QualType(); 6733e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor 6743e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor // Dig through references, function pointers, and block pointers to 6753e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor // get down to the likely type of an expression when the entity is 6763e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor // used. 6773e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor do { 6783e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor if (const ReferenceType *Ref = T->getAs<ReferenceType>()) { 6793e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor T = Ref->getPointeeType(); 6803e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor continue; 6813e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor } 6823e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor 6833e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor if (const PointerType *Pointer = T->getAs<PointerType>()) { 6843e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor if (Pointer->getPointeeType()->isFunctionType()) { 6853e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor T = Pointer->getPointeeType(); 6863e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor continue; 6873e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor } 6883e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor 6893e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor break; 6903e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor } 6913e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor 6923e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor if (const BlockPointerType *Block = T->getAs<BlockPointerType>()) { 6933e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor T = Block->getPointeeType(); 6943e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor continue; 6953e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor } 6963e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor 6973e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor if (const FunctionType *Function = T->getAs<FunctionType>()) { 6983e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor T = Function->getResultType(); 6993e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor continue; 7003e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor } 7013e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor 7023e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor break; 7033e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor } while (true); 7043e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor 7053e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor return T; 7061f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor} 7071f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 708cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregorvoid ResultBuilder::AdjustResultPriorityForDecl(Result &R) { 709cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor // If this is an Objective-C method declaration whose selector matches our 710cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor // preferred selector, give it a priority boost. 711cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor if (!PreferredSelector.isNull()) 712cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(R.Declaration)) 713cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor if (PreferredSelector == Method->getSelector()) 714cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor R.Priority += CCD_SelectorMatch; 71508f43cd5d966fd31b32bd5c76c0645ebbf08b2f1Douglas Gregor 716cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor // If we have a preferred type, adjust the priority for results with exactly- 717cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor // matching or nearly-matching types. 718cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor if (!PreferredType.isNull()) { 719cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor QualType T = getDeclUsageType(SemaRef.Context, R.Declaration); 720cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor if (!T.isNull()) { 721cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor CanQualType TC = SemaRef.Context.getCanonicalType(T); 722cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor // Check for exactly-matching types (modulo qualifiers). 723cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor if (SemaRef.Context.hasSameUnqualifiedType(PreferredType, TC)) 724cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor R.Priority /= CCF_ExactTypeMatch; 725cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor // Check for nearly-matching types, based on classification of each. 726cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor else if ((getSimplifiedTypeClass(PreferredType) 7271f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor == getSimplifiedTypeClass(TC)) && 728cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor !(PreferredType->isEnumeralType() && TC->isEnumeralType())) 729cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor R.Priority /= CCF_SimilarTypeMatch; 730cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor } 731cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor } 7321f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor} 7331f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 7346f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregorvoid ResultBuilder::MaybeAddConstructorResults(Result R) { 7356f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor if (!SemaRef.getLangOptions().CPlusPlus || !R.Declaration || 7366f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor !CompletionContext.wantConstructorResults()) 7376f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor return; 7386f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 7396f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor ASTContext &Context = SemaRef.Context; 7406f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor NamedDecl *D = R.Declaration; 7416f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor CXXRecordDecl *Record = 0; 7426f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor if (ClassTemplateDecl *ClassTemplate = dyn_cast<ClassTemplateDecl>(D)) 7436f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor Record = ClassTemplate->getTemplatedDecl(); 7446f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor else if ((Record = dyn_cast<CXXRecordDecl>(D))) { 7456f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor // Skip specializations and partial specializations. 7466f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor if (isa<ClassTemplateSpecializationDecl>(Record)) 7476f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor return; 7486f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor } else { 7496f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor // There are no constructors here. 7506f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor return; 7516f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor } 7526f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 7536f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor Record = Record->getDefinition(); 7546f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor if (!Record) 7556f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor return; 7566f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 7576f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 7586f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor QualType RecordTy = Context.getTypeDeclType(Record); 7596f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor DeclarationName ConstructorName 7606f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor = Context.DeclarationNames.getCXXConstructorName( 7616f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor Context.getCanonicalType(RecordTy)); 7626f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor for (DeclContext::lookup_result Ctors = Record->lookup(ConstructorName); 7636f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor Ctors.first != Ctors.second; ++Ctors.first) { 7646f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor R.Declaration = *Ctors.first; 7656f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor R.CursorKind = getCursorKindForDecl(R.Declaration); 7666f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor Results.push_back(R); 7676f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor } 7686f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor} 7696f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 770e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregorvoid ResultBuilder::MaybeAddResult(Result R, DeclContext *CurContext) { 771e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor assert(!ShadowMaps.empty() && "Must enter into a results scope"); 772e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 773e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor if (R.Kind != Result::RK_Declaration) { 774e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor // For non-declaration results, just add the result. 775e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor Results.push_back(R); 776e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return; 777e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor } 778e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 779e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor // Look through using declarations. 780e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor if (UsingShadowDecl *Using = dyn_cast<UsingShadowDecl>(R.Declaration)) { 781e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor MaybeAddResult(Result(Using->getTargetDecl(), R.Qualifier), CurContext); 78286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return; 783e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor } 78486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 785e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor Decl *CanonDecl = R.Declaration->getCanonicalDecl(); 786e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor unsigned IDNS = CanonDecl->getIdentifierNamespace(); 787e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 78845bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor bool AsNestedNameSpecifier = false; 78945bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor if (!isInterestingDecl(R.Declaration, AsNestedNameSpecifier)) 790e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return; 791e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 7926f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor // C++ constructors are never found by name lookup. 7936f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor if (isa<CXXConstructorDecl>(R.Declaration)) 7946f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor return; 7956f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 79686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ShadowMap &SMap = ShadowMaps.back(); 797fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ShadowMapEntry::iterator I, IEnd; 798fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ShadowMap::iterator NamePos = SMap.find(R.Declaration->getDeclName()); 799fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (NamePos != SMap.end()) { 800fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor I = NamePos->second.begin(); 801fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor IEnd = NamePos->second.end(); 802fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 803fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 804fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor for (; I != IEnd; ++I) { 805fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor NamedDecl *ND = I->first; 806fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor unsigned Index = I->second; 80786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (ND->getCanonicalDecl() == CanonDecl) { 80886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // This is a redeclaration. Always pick the newer declaration. 80986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Results[Index].Declaration = R.Declaration; 81086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 81186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // We're done. 81286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return; 81386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 81486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 81586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 81686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // This is a new declaration in this scope. However, check whether this 81786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // declaration name is hidden by a similarly-named declaration in an outer 81886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // scope. 81986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor std::list<ShadowMap>::iterator SM, SMEnd = ShadowMaps.end(); 82086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor --SMEnd; 82186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor for (SM = ShadowMaps.begin(); SM != SMEnd; ++SM) { 822fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ShadowMapEntry::iterator I, IEnd; 823fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ShadowMap::iterator NamePos = SM->find(R.Declaration->getDeclName()); 824fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (NamePos != SM->end()) { 825fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor I = NamePos->second.begin(); 826fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor IEnd = NamePos->second.end(); 827fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 828fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor for (; I != IEnd; ++I) { 82986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // A tag declaration does not hide a non-tag declaration. 8300d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCall if (I->first->hasTagIdentifierNamespace() && 83186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor (IDNS & (Decl::IDNS_Member | Decl::IDNS_Ordinary | 83286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Decl::IDNS_ObjCProtocol))) 83386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor continue; 83486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 83586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Protocols are in distinct namespaces from everything else. 836fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (((I->first->getIdentifierNamespace() & Decl::IDNS_ObjCProtocol) 83786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor || (IDNS & Decl::IDNS_ObjCProtocol)) && 838fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor I->first->getIdentifierNamespace() != IDNS) 83986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor continue; 84086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 84186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // The newly-added result is hidden by an entry in the shadow map. 8426660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor if (CheckHiddenResult(R, CurContext, I->first)) 84386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return; 84486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 84586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor break; 84686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 84786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 84886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 84986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Make sure that any given declaration only shows up in the result set once. 85086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!AllDeclsFound.insert(CanonDecl)) 85186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return; 852265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor 853eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor // If the filter is for nested-name-specifiers, then this result starts a 854eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor // nested-name-specifier. 85512e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor if (AsNestedNameSpecifier) { 856eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor R.StartsNestedNameSpecifier = true; 85712e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor R.Priority = CCP_NestedNameSpecifier; 858cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor } else 859cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor AdjustResultPriorityForDecl(R); 860265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor 8610563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor // If this result is supposed to have an informative qualifier, add one. 862eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor if (R.QualifierIsInformative && !R.Qualifier && 863eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor !R.StartsNestedNameSpecifier) { 8640563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor DeclContext *Ctx = R.Declaration->getDeclContext(); 8650563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor if (NamespaceDecl *Namespace = dyn_cast<NamespaceDecl>(Ctx)) 8660563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor R.Qualifier = NestedNameSpecifier::Create(SemaRef.Context, 0, Namespace); 8670563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor else if (TagDecl *Tag = dyn_cast<TagDecl>(Ctx)) 8680563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor R.Qualifier = NestedNameSpecifier::Create(SemaRef.Context, 0, false, 8690563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor SemaRef.Context.getTypeDeclType(Tag).getTypePtr()); 8700563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor else 8710563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor R.QualifierIsInformative = false; 8720563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor } 873eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor 87486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Insert this result into the set of results and into the current shadow 87586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // map. 876fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor SMap[R.Declaration->getDeclName()].Add(R.Declaration, Results.size()); 87786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Results.push_back(R); 8786f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 8796f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor if (!AsNestedNameSpecifier) 8806f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor MaybeAddConstructorResults(R); 88186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 88286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 8831ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregorvoid ResultBuilder::AddResult(Result R, DeclContext *CurContext, 8840cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor NamedDecl *Hiding, bool InBaseClass = false) { 885a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor if (R.Kind != Result::RK_Declaration) { 886a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor // For non-declaration results, just add the result. 887a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.push_back(R); 888a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor return; 889a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor } 890a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor 8911ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor // Look through using declarations. 8921ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor if (UsingShadowDecl *Using = dyn_cast<UsingShadowDecl>(R.Declaration)) { 8931ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor AddResult(Result(Using->getTargetDecl(), R.Qualifier), CurContext, Hiding); 8941ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor return; 8951ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor } 8961ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 89745bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor bool AsNestedNameSpecifier = false; 89845bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor if (!isInterestingDecl(R.Declaration, AsNestedNameSpecifier)) 8991ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor return; 9001ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 9016f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor // C++ constructors are never found by name lookup. 9026f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor if (isa<CXXConstructorDecl>(R.Declaration)) 9036f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor return; 9046f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 9051ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor if (Hiding && CheckHiddenResult(R, CurContext, Hiding)) 9061ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor return; 9071ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 9081ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor // Make sure that any given declaration only shows up in the result set once. 9091ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor if (!AllDeclsFound.insert(R.Declaration->getCanonicalDecl())) 9101ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor return; 9111ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 9121ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor // If the filter is for nested-name-specifiers, then this result starts a 9131ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor // nested-name-specifier. 91412e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor if (AsNestedNameSpecifier) { 9151ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor R.StartsNestedNameSpecifier = true; 91612e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor R.Priority = CCP_NestedNameSpecifier; 91712e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor } 9180cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor else if (Filter == &ResultBuilder::IsMember && !R.Qualifier && InBaseClass && 9190cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor isa<CXXRecordDecl>(R.Declaration->getDeclContext() 9207a126a474fdde06382b315b4e3d8ef0a21d4dc31Sebastian Redl ->getRedeclContext())) 9210cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor R.QualifierIsInformative = true; 9220cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor 9231ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor // If this result is supposed to have an informative qualifier, add one. 9241ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor if (R.QualifierIsInformative && !R.Qualifier && 9251ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor !R.StartsNestedNameSpecifier) { 9261ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor DeclContext *Ctx = R.Declaration->getDeclContext(); 9271ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor if (NamespaceDecl *Namespace = dyn_cast<NamespaceDecl>(Ctx)) 9281ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor R.Qualifier = NestedNameSpecifier::Create(SemaRef.Context, 0, Namespace); 9291ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor else if (TagDecl *Tag = dyn_cast<TagDecl>(Ctx)) 9301ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor R.Qualifier = NestedNameSpecifier::Create(SemaRef.Context, 0, false, 93145bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor SemaRef.Context.getTypeDeclType(Tag).getTypePtr()); 9321ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor else 9331ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor R.QualifierIsInformative = false; 9341ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor } 9351ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 93612e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor // Adjust the priority if this result comes from a base class. 93712e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor if (InBaseClass) 93812e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor R.Priority += CCD_InBaseClass; 93912e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor 940cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor AdjustResultPriorityForDecl(R); 9415ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 9423cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor if (HasObjectTypeQualifiers) 9433cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(R.Declaration)) 9443cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor if (Method->isInstance()) { 9453cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor Qualifiers MethodQuals 9463cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor = Qualifiers::fromCVRMask(Method->getTypeQualifiers()); 9473cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor if (ObjectTypeQualifiers == MethodQuals) 9483cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor R.Priority += CCD_ObjectQualifierMatch; 9493cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor else if (ObjectTypeQualifiers - MethodQuals) { 9503cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor // The method cannot be invoked, because doing so would drop 9513cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor // qualifiers. 9523cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor return; 9533cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor } 9543cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor } 9553cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor 9561ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor // Insert this result into the set of results. 9571ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor Results.push_back(R); 9586f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 9596f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor if (!AsNestedNameSpecifier) 9606f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor MaybeAddConstructorResults(R); 9611ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor} 9621ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 963a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregorvoid ResultBuilder::AddResult(Result R) { 964a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor assert(R.Kind != Result::RK_Declaration && 965a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor "Declaration results need more context"); 966a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.push_back(R); 967a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor} 968a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor 96986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Enter into a new scope. 97086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorvoid ResultBuilder::EnterNewScope() { 97186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ShadowMaps.push_back(ShadowMap()); 97286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 97386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 97486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Exit from the current scope. 97586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorvoid ResultBuilder::ExitScope() { 976fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor for (ShadowMap::iterator E = ShadowMaps.back().begin(), 977fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor EEnd = ShadowMaps.back().end(); 978fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor E != EEnd; 979fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ++E) 980fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor E->second.Destroy(); 981fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 98286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ShadowMaps.pop_back(); 98386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 98486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 985791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor/// \brief Determines whether this given declaration will be found by 986791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor/// ordinary name lookup. 987791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregorbool ResultBuilder::IsOrdinaryName(NamedDecl *ND) const { 9884710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor ND = cast<NamedDecl>(ND->getUnderlyingDecl()); 9894710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor 990791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor unsigned IDNS = Decl::IDNS_Ordinary; 991791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus) 9929b30b267e77d1778e1e9b7c44b6852489c2c5096Douglas Gregor IDNS |= Decl::IDNS_Tag | Decl::IDNS_Namespace | Decl::IDNS_Member; 993ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor else if (SemaRef.getLangOptions().ObjC1) { 994ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor if (isa<ObjCIvarDecl>(ND)) 995ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor return true; 996ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor } 997ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor 998791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor return ND->getIdentifierNamespace() & IDNS; 999791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor} 1000791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor 100101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor/// \brief Determines whether this given declaration will be found by 10024710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor/// ordinary name lookup but is not a type name. 10034710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregorbool ResultBuilder::IsOrdinaryNonTypeName(NamedDecl *ND) const { 10044710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor ND = cast<NamedDecl>(ND->getUnderlyingDecl()); 10054710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor if (isa<TypeDecl>(ND) || isa<ObjCInterfaceDecl>(ND)) 10064710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor return false; 10074710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor 10084710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor unsigned IDNS = Decl::IDNS_Ordinary; 10094710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus) 10109b30b267e77d1778e1e9b7c44b6852489c2c5096Douglas Gregor IDNS |= Decl::IDNS_Tag | Decl::IDNS_Namespace | Decl::IDNS_Member; 1011ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor else if (SemaRef.getLangOptions().ObjC1) { 1012ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor if (isa<ObjCIvarDecl>(ND)) 1013ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor return true; 1014ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor } 1015ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor 10164710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor return ND->getIdentifierNamespace() & IDNS; 10174710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor} 10184710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor 1019f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregorbool ResultBuilder::IsIntegralConstantValue(NamedDecl *ND) const { 1020f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor if (!IsOrdinaryNonTypeName(ND)) 1021f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor return 0; 1022f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor 1023f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor if (ValueDecl *VD = dyn_cast<ValueDecl>(ND->getUnderlyingDecl())) 1024f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor if (VD->getType()->isIntegralOrEnumerationType()) 1025f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor return true; 1026f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor 1027f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor return false; 1028f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor} 1029f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor 10304710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor/// \brief Determines whether this given declaration will be found by 103101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor/// ordinary name lookup. 103201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregorbool ResultBuilder::IsOrdinaryNonValueName(NamedDecl *ND) const { 10334710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor ND = cast<NamedDecl>(ND->getUnderlyingDecl()); 10344710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor 103501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor unsigned IDNS = Decl::IDNS_Ordinary; 103601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus) 10370d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCall IDNS |= Decl::IDNS_Tag | Decl::IDNS_Namespace; 103801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 103901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor return (ND->getIdentifierNamespace() & IDNS) && 10404710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor !isa<ValueDecl>(ND) && !isa<FunctionTemplateDecl>(ND) && 10414710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor !isa<ObjCPropertyDecl>(ND); 104201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor} 104301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 104486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Determines whether the given declaration is suitable as the 104586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// start of a C++ nested-name-specifier, e.g., a class or namespace. 104686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsNestedNameSpecifier(NamedDecl *ND) const { 104786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Allow us to find class templates, too. 104886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (ClassTemplateDecl *ClassTemplate = dyn_cast<ClassTemplateDecl>(ND)) 104986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ND = ClassTemplate->getTemplatedDecl(); 105086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 105186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return SemaRef.isAcceptableNestedNameSpecifier(ND); 105286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 105386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 105486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Determines whether the given declaration is an enumeration. 105586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsEnum(NamedDecl *ND) const { 105686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return isa<EnumDecl>(ND); 105786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 105886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 105986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Determines whether the given declaration is a class or struct. 106086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsClassOrStruct(NamedDecl *ND) const { 106186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Allow us to find class templates, too. 106286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (ClassTemplateDecl *ClassTemplate = dyn_cast<ClassTemplateDecl>(ND)) 106386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ND = ClassTemplate->getTemplatedDecl(); 106486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 106586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (RecordDecl *RD = dyn_cast<RecordDecl>(ND)) 1066465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara return RD->getTagKind() == TTK_Class || 1067465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara RD->getTagKind() == TTK_Struct; 106886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 106986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return false; 107086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 107186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 107286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Determines whether the given declaration is a union. 107386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsUnion(NamedDecl *ND) const { 107486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Allow us to find class templates, too. 107586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (ClassTemplateDecl *ClassTemplate = dyn_cast<ClassTemplateDecl>(ND)) 107686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ND = ClassTemplate->getTemplatedDecl(); 107786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 107886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (RecordDecl *RD = dyn_cast<RecordDecl>(ND)) 1079465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara return RD->getTagKind() == TTK_Union; 108086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 108186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return false; 108286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 108386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 108486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Determines whether the given declaration is a namespace. 108586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsNamespace(NamedDecl *ND) const { 108686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return isa<NamespaceDecl>(ND); 108786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 108886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 108986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Determines whether the given declaration is a namespace or 109086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// namespace alias. 109186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsNamespaceOrAlias(NamedDecl *ND) const { 109286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return isa<NamespaceDecl>(ND) || isa<NamespaceAliasDecl>(ND); 109386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 109486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 10957628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor/// \brief Determines whether the given declaration is a type. 109686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsType(NamedDecl *ND) const { 1097d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor if (UsingShadowDecl *Using = dyn_cast<UsingShadowDecl>(ND)) 1098d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor ND = Using->getTargetDecl(); 1099d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor 1100d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor return isa<TypeDecl>(ND) || isa<ObjCInterfaceDecl>(ND); 110186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 110286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 11037628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor/// \brief Determines which members of a class should be visible via 11047628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor/// "." or "->". Only value declarations, nested name specifiers, and 11057628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor/// using declarations thereof should show up. 1106eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregorbool ResultBuilder::IsMember(NamedDecl *ND) const { 11077628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor if (UsingShadowDecl *Using = dyn_cast<UsingShadowDecl>(ND)) 11087628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor ND = Using->getTargetDecl(); 11097628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor 1110ce82196076cd15f5ecfa029fcda8b58dc0146cf1Douglas Gregor return isa<ValueDecl>(ND) || isa<FunctionTemplateDecl>(ND) || 1111ce82196076cd15f5ecfa029fcda8b58dc0146cf1Douglas Gregor isa<ObjCPropertyDecl>(ND); 1112eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor} 1113eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor 11148e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregorstatic bool isObjCReceiverType(ASTContext &C, QualType T) { 11158e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor T = C.getCanonicalType(T); 11168e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor switch (T->getTypeClass()) { 11178e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor case Type::ObjCObject: 11188e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor case Type::ObjCInterface: 11198e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor case Type::ObjCObjectPointer: 11208e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor return true; 11218e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 11228e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor case Type::Builtin: 11238e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor switch (cast<BuiltinType>(T)->getKind()) { 11248e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor case BuiltinType::ObjCId: 11258e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor case BuiltinType::ObjCClass: 11268e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor case BuiltinType::ObjCSel: 11278e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor return true; 11288e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 11298e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor default: 11308e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor break; 11318e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor } 11328e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor return false; 11338e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 11348e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor default: 11358e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor break; 11368e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor } 11378e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 11388e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor if (!C.getLangOptions().CPlusPlus) 11398e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor return false; 11408e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 11418e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor // FIXME: We could perform more analysis here to determine whether a 11428e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor // particular class type has any conversions to Objective-C types. For now, 11438e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor // just accept all class types. 11448e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor return T->isDependentType() || T->isRecordType(); 11458e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor} 11468e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 11478e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregorbool ResultBuilder::IsObjCMessageReceiver(NamedDecl *ND) const { 11488e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor QualType T = getDeclUsageType(SemaRef.Context, ND); 11498e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor if (T.isNull()) 11508e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor return false; 11518e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 11528e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor T = SemaRef.Context.getBaseElementType(T); 11538e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor return isObjCReceiverType(SemaRef.Context, T); 11548e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor} 11558e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 115681f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregorbool ResultBuilder::IsObjCMessageReceiverOrLambdaCapture(NamedDecl *ND) const { 115781f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor if (IsObjCMessageReceiver(ND)) 115881f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor return true; 115981f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor 116081f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor VarDecl *Var = dyn_cast<VarDecl>(ND); 116181f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor if (!Var) 116281f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor return false; 116381f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor 116481f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor return Var->hasLocalStorage() && !Var->hasAttr<BlocksAttr>(); 116581f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor} 116681f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor 1167fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregorbool ResultBuilder::IsObjCCollection(NamedDecl *ND) const { 1168fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor if ((SemaRef.getLangOptions().CPlusPlus && !IsOrdinaryName(ND)) || 1169fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor (!SemaRef.getLangOptions().CPlusPlus && !IsOrdinaryNonTypeName(ND))) 1170fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor return false; 1171fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor 1172fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor QualType T = getDeclUsageType(SemaRef.Context, ND); 1173fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor if (T.isNull()) 1174fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor return false; 1175fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor 1176fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor T = SemaRef.Context.getBaseElementType(T); 1177fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor return T->isObjCObjectType() || T->isObjCObjectPointerType() || 1178fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor T->isObjCIdType() || 1179fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor (SemaRef.getLangOptions().CPlusPlus && T->isRecordType()); 1180fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor} 11818e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 118252779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregorbool ResultBuilder::IsImpossibleToSatisfy(NamedDecl *ND) const { 118352779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor return false; 118452779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor} 118552779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor 118680f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor/// \rief Determines whether the given declaration is an Objective-C 118780f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor/// instance variable. 118880f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregorbool ResultBuilder::IsObjCIvar(NamedDecl *ND) const { 118980f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor return isa<ObjCIvarDecl>(ND); 119080f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor} 119180f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor 11921ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregornamespace { 11931ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// \brief Visible declaration consumer that adds a code-completion result 11941ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// for each visible declaration. 11951ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor class CodeCompletionDeclConsumer : public VisibleDeclConsumer { 11961ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor ResultBuilder &Results; 11971ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor DeclContext *CurContext; 11981ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 11991ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor public: 12001ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor CodeCompletionDeclConsumer(ResultBuilder &Results, DeclContext *CurContext) 12011ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor : Results(Results), CurContext(CurContext) { } 12021ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 1203d12059673dcef32bc2b6bae5321654d33863afe6Erik Verbruggen virtual void FoundDecl(NamedDecl *ND, NamedDecl *Hiding, DeclContext *Ctx, 1204d12059673dcef32bc2b6bae5321654d33863afe6Erik Verbruggen bool InBaseClass) { 1205d12059673dcef32bc2b6bae5321654d33863afe6Erik Verbruggen bool Accessible = true; 120617015eff2b3166e445377b15913474b472775e7cDouglas Gregor if (Ctx) 120717015eff2b3166e445377b15913474b472775e7cDouglas Gregor Accessible = Results.getSema().IsSimplyAccessible(ND, Ctx); 120817015eff2b3166e445377b15913474b472775e7cDouglas Gregor 1209d12059673dcef32bc2b6bae5321654d33863afe6Erik Verbruggen ResultBuilder::Result Result(ND, 0, false, Accessible); 1210d12059673dcef32bc2b6bae5321654d33863afe6Erik Verbruggen Results.AddResult(Result, CurContext, Hiding, InBaseClass); 12111ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor } 12121ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor }; 12131ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor} 12141ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 121586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Add type specifiers for the current language as keyword results. 1216bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddTypeSpecifierResults(const LangOptions &LangOpts, 121786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ResultBuilder &Results) { 12180a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 121912e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("short", CCP_Type)); 122012e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("long", CCP_Type)); 122112e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("signed", CCP_Type)); 122212e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("unsigned", CCP_Type)); 122312e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("void", CCP_Type)); 122412e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("char", CCP_Type)); 122512e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("int", CCP_Type)); 122612e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("float", CCP_Type)); 122712e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("double", CCP_Type)); 122812e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("enum", CCP_Type)); 122912e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("struct", CCP_Type)); 123012e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("union", CCP_Type)); 123112e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("const", CCP_Type)); 123212e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("volatile", CCP_Type)); 123301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 123486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (LangOpts.C99) { 123586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // C99-specific 123612e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("_Complex", CCP_Type)); 123712e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("_Imaginary", CCP_Type)); 123812e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("_Bool", CCP_Type)); 123912e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("restrict", CCP_Type)); 124086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 124186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 1242218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder Builder(Results.getAllocator()); 124386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (LangOpts.CPlusPlus) { 124486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // C++-specific 1245b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor Results.AddResult(Result("bool", CCP_Type + 1246b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor (LangOpts.ObjC1? CCD_bool_in_ObjC : 0))); 124712e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("class", CCP_Type)); 124812e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("wchar_t", CCP_Type)); 124986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 1250c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // typename qualified-id 1251218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("typename"); 1252218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1253218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("qualifier"); 1254218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("::"); 1255218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("name"); 1256218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1257d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor 125886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (LangOpts.CPlusPlus0x) { 125912e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("auto", CCP_Type)); 126012e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("char16_t", CCP_Type)); 126112e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("char32_t", CCP_Type)); 1262c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor 1263218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("decltype"); 1264218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1265218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1266218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1267218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 126886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 126986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 127086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 127186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // GNU extensions 127286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (LangOpts.GNUMode) { 127386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // FIXME: Enable when we actually support decimal floating point. 1274a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor // Results.AddResult(Result("_Decimal32")); 1275a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor // Results.AddResult(Result("_Decimal64")); 1276a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor // Results.AddResult(Result("_Decimal128")); 127701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1278218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("typeof"); 1279218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1280218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1281218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1282c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor 1283218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("typeof"); 1284218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1285218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("type"); 1286218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1287218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 128801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 128901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor} 129001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1291f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCallstatic void AddStorageSpecifiers(Sema::ParserCompletionContext CCC, 129201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor const LangOptions &LangOpts, 129301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor ResultBuilder &Results) { 12940a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 129501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Note: we don't suggest either "auto" or "register", because both 129601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // are pointless as storage specifiers. Elsewhere, we suggest "auto" 129701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // in C++0x as a type specifier. 1298a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("extern")); 1299a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("static")); 130001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor} 130101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1302f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCallstatic void AddFunctionSpecifiers(Sema::ParserCompletionContext CCC, 130301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor const LangOptions &LangOpts, 130401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor ResultBuilder &Results) { 13050a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 130601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor switch (CCC) { 1307f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Class: 1308f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_MemberTemplate: 130901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (LangOpts.CPlusPlus) { 1310a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("explicit")); 1311a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("friend")); 1312a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("mutable")); 1313a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("virtual")); 131401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 131501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Fall through 131601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1317f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ObjCInterface: 1318f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ObjCImplementation: 1319f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Namespace: 1320f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Template: 132101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (LangOpts.CPlusPlus || LangOpts.C99) 1322a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("inline")); 132301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 132401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1325f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ObjCInstanceVariableList: 1326f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Expression: 1327f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Statement: 1328f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ForInit: 1329f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Condition: 1330f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_RecoveryInFunction: 1331f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Type: 13320268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor case Sema::PCC_ParenthesizedExpression: 133368e3c2eef52701a178fbcc2bb424f31dd4b36931Douglas Gregor case Sema::PCC_LocalDeclarationSpecifiers: 133401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 133501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 133601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor} 133701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1338bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCExpressionResults(ResultBuilder &Results, bool NeedAt); 1339bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCStatementResults(ResultBuilder &Results, bool NeedAt); 1340bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCVisibilityResults(const LangOptions &LangOpts, 1341c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor ResultBuilder &Results, 1342c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor bool NeedAt); 1343bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCImplementationResults(const LangOptions &LangOpts, 1344b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor ResultBuilder &Results, 1345b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor bool NeedAt); 1346bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCInterfaceResults(const LangOptions &LangOpts, 1347b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor ResultBuilder &Results, 1348b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor bool NeedAt); 1349bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCTopLevelResults(ResultBuilder &Results, bool NeedAt); 1350b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 1351c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregorstatic void AddTypedefResult(ResultBuilder &Results) { 1352218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder Builder(Results.getAllocator()); 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)) 14178ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor return BT->getName(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(); 144581f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor CodeCompletionBuilder Builder(Allocator); 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(); 14618ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor CodeCompletionBuilder Builder(Allocator); 14628ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor PrintingPolicy Policy = getCompletionPrintingPolicy(SemaRef); 1463218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor 14640a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 146501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor switch (CCC) { 1466f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Namespace: 1467c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor if (SemaRef.getLangOptions().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 1512b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor if (SemaRef.getLangOptions().ObjC1) 1513bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCTopLevelResults(Results, true); 1514b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 1515c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor AddTypedefResult(Results); 151601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Fall through 151701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1518f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Class: 1519c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor if (SemaRef.getLangOptions().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"); 1545218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_Colon); 1546218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 154701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 154801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // protected: 1549218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("protected"); 1550218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_Colon); 1551218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 155201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 155301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // private: 1554218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("private"); 1555218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_Colon); 1556218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 155701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 155801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 155901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Fall through 156001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1561f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Template: 1562f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_MemberTemplate: 1563d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus && Results.includeCodePatterns()) { 156401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // template < parameters > 1565218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("template"); 1566218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftAngle); 1567218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("parameters"); 1568218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightAngle); 1569218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 157001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 157101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1572bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddStorageSpecifiers(CCC, SemaRef.getLangOptions(), Results); 1573bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddFunctionSpecifiers(CCC, SemaRef.getLangOptions(), Results); 157401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 157501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1576f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ObjCInterface: 1577bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCInterfaceResults(SemaRef.getLangOptions(), Results, true); 1578bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddStorageSpecifiers(CCC, SemaRef.getLangOptions(), Results); 1579bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddFunctionSpecifiers(CCC, SemaRef.getLangOptions(), Results); 1580b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor break; 1581b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 1582f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ObjCImplementation: 1583bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCImplementationResults(SemaRef.getLangOptions(), Results, true); 1584bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddStorageSpecifiers(CCC, SemaRef.getLangOptions(), Results); 1585bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddFunctionSpecifiers(CCC, SemaRef.getLangOptions(), Results); 1586b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor break; 1587b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 1588f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ObjCInstanceVariableList: 1589bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCVisibilityResults(SemaRef.getLangOptions(), Results, true); 1590c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor break; 1591c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor 1592f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_RecoveryInFunction: 1593f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Statement: { 1594c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor AddTypedefResult(Results); 159501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1596ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor if (SemaRef.getLangOptions().CPlusPlus && Results.includeCodePatterns() && 1597ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor SemaRef.getLangOptions().CXXExceptions) { 1598218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("try"); 1599218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 1600218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("statements"); 1601218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 1602218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 1603218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("catch"); 1604218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1605218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("declaration"); 1606218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1607218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 1608218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("statements"); 1609218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 1610218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 1611218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 161201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 1613b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor if (SemaRef.getLangOptions().ObjC1) 1614bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCStatementResults(Results, true); 1615b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 1616d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor if (Results.includeCodePatterns()) { 1617d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor // if (condition) { statements } 1618218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("if"); 1619218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1620d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus) 1621218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("condition"); 1622d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor else 1623218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1624218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1625218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 1626218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("statements"); 1627218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 1628218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 1629218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 163001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1631d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor // switch (condition) { } 1632218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("switch"); 1633218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1634d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus) 1635218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("condition"); 1636d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor else 1637218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1638218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1639218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 1640218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 1641218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 1642218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1643d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor } 1644d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor 164501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Switch-specific statements. 1646781472fe99a120098c631b0cbe33c89f8cef5e70John McCall if (!SemaRef.getCurFunction()->SwitchStack.empty()) { 164701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // case expression: 1648218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("case"); 1649218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1650218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1651218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_Colon); 1652218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 165301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 165401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // default: 1655218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("default"); 1656218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_Colon); 1657218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 165801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 165901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1660d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor if (Results.includeCodePatterns()) { 1661d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor /// while (condition) { statements } 1662218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("while"); 1663218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1664d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus) 1665218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("condition"); 1666d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor else 1667218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1668218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1669218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 1670218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("statements"); 1671218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 1672218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 1673218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 167401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1675d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor // do { statements } while ( expression ); 1676218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("do"); 1677218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 1678218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("statements"); 1679218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 1680218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 1681218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("while"); 1682218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1683218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1684218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1685218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 168601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1687d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor // for ( for-init-statement ; condition ; expression ) { statements } 1688218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("for"); 1689218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1690d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus || SemaRef.getLangOptions().C99) 1691218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("init-statement"); 1692d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor else 1693218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("init-expression"); 1694218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_SemiColon); 1695218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("condition"); 1696218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_SemiColon); 1697218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("inc-expression"); 1698218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1699218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 1700218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 1701218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("statements"); 1702218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 1703218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 1704218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1705d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor } 170601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 170701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (S->getContinueParent()) { 170801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // continue ; 1709218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("continue"); 1710218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 171101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 171201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 171301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (S->getBreakParent()) { 171401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // break ; 1715218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("break"); 1716218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 171701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 171801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 171901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // "return expression ;" or "return ;", depending on whether we 172001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // know the function is void or not. 172101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor bool isVoid = false; 172201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (FunctionDecl *Function = dyn_cast<FunctionDecl>(SemaRef.CurContext)) 172301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor isVoid = Function->getResultType()->isVoidType(); 172401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor else if (ObjCMethodDecl *Method 172501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor = dyn_cast<ObjCMethodDecl>(SemaRef.CurContext)) 172601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor isVoid = Method->getResultType()->isVoidType(); 17279ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor else if (SemaRef.getCurBlock() && 17289ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor !SemaRef.getCurBlock()->ReturnType.isNull()) 17299ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor isVoid = SemaRef.getCurBlock()->ReturnType->isVoidType(); 1730218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("return"); 17319329800d6f4c4ea8778aabd64cde1b712b290b00Douglas Gregor if (!isVoid) { 1732218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1733218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 17349329800d6f4c4ea8778aabd64cde1b712b290b00Douglas Gregor } 1735218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 173601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1737c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // goto identifier ; 1738218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("goto"); 1739218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1740218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("label"); 1741218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 174201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1743c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // Using directives 1744218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("using"); 1745218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1746218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("namespace"); 1747218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1748218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("identifier"); 1749218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 175001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 175101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 175201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Fall through (for statement expressions). 1753f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ForInit: 1754f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Condition: 1755bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddStorageSpecifiers(CCC, SemaRef.getLangOptions(), Results); 175601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Fall through: conditions and statements can have expressions. 175701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 17580268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor case Sema::PCC_ParenthesizedExpression: 1759f85e193739c953358c865005855253af4f68a497John McCall if (SemaRef.getLangOptions().ObjCAutoRefCount && 1760f85e193739c953358c865005855253af4f68a497John McCall CCC == Sema::PCC_ParenthesizedExpression) { 1761f85e193739c953358c865005855253af4f68a497John McCall // (__bridge <type>)<expression> 1762f85e193739c953358c865005855253af4f68a497John McCall Builder.AddTypedTextChunk("__bridge"); 1763f85e193739c953358c865005855253af4f68a497John McCall Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1764f85e193739c953358c865005855253af4f68a497John McCall Builder.AddPlaceholderChunk("type"); 1765f85e193739c953358c865005855253af4f68a497John McCall Builder.AddChunk(CodeCompletionString::CK_RightParen); 1766f85e193739c953358c865005855253af4f68a497John McCall Builder.AddPlaceholderChunk("expression"); 1767f85e193739c953358c865005855253af4f68a497John McCall Results.AddResult(Result(Builder.TakeString())); 1768f85e193739c953358c865005855253af4f68a497John McCall 1769f85e193739c953358c865005855253af4f68a497John McCall // (__bridge_transfer <Objective-C type>)<expression> 1770f85e193739c953358c865005855253af4f68a497John McCall Builder.AddTypedTextChunk("__bridge_transfer"); 1771f85e193739c953358c865005855253af4f68a497John McCall Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1772f85e193739c953358c865005855253af4f68a497John McCall Builder.AddPlaceholderChunk("Objective-C type"); 1773f85e193739c953358c865005855253af4f68a497John McCall Builder.AddChunk(CodeCompletionString::CK_RightParen); 1774f85e193739c953358c865005855253af4f68a497John McCall Builder.AddPlaceholderChunk("expression"); 1775f85e193739c953358c865005855253af4f68a497John McCall Results.AddResult(Result(Builder.TakeString())); 1776f85e193739c953358c865005855253af4f68a497John McCall 1777f85e193739c953358c865005855253af4f68a497John McCall // (__bridge_retained <CF type>)<expression> 1778f85e193739c953358c865005855253af4f68a497John McCall Builder.AddTypedTextChunk("__bridge_retained"); 1779f85e193739c953358c865005855253af4f68a497John McCall Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1780f85e193739c953358c865005855253af4f68a497John McCall Builder.AddPlaceholderChunk("CF type"); 1781f85e193739c953358c865005855253af4f68a497John McCall Builder.AddChunk(CodeCompletionString::CK_RightParen); 1782f85e193739c953358c865005855253af4f68a497John McCall Builder.AddPlaceholderChunk("expression"); 1783f85e193739c953358c865005855253af4f68a497John McCall Results.AddResult(Result(Builder.TakeString())); 1784f85e193739c953358c865005855253af4f68a497John McCall } 1785f85e193739c953358c865005855253af4f68a497John McCall // Fall through 1786f85e193739c953358c865005855253af4f68a497John McCall 1787f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Expression: { 178801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus) { 178901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // 'this', if we're in a non-static member function. 179081f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor addThisCompletion(SemaRef, Results); 17918ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor 17928ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor // true 17938ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("bool"); 17948ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddTypedTextChunk("true"); 17958ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 179601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 17978ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor // false 17988ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("bool"); 17998ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddTypedTextChunk("false"); 18008ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 180101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1802ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor if (SemaRef.getLangOptions().RTTI) { 1803ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor // dynamic_cast < type-id > ( expression ) 1804ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddTypedTextChunk("dynamic_cast"); 1805ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftAngle); 1806ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddPlaceholderChunk("type"); 1807ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightAngle); 1808ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1809ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1810ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1811ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1812ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor } 1813c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor 1814c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // static_cast < type-id > ( expression ) 1815218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("static_cast"); 1816218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftAngle); 1817218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("type"); 1818218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightAngle); 1819218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1820218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1821218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1822218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1823d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor 1824c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // reinterpret_cast < type-id > ( expression ) 1825218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("reinterpret_cast"); 1826218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftAngle); 1827218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("type"); 1828218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightAngle); 1829218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1830218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1831218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1832218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1833d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor 1834c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // const_cast < type-id > ( expression ) 1835218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("const_cast"); 1836218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftAngle); 1837218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("type"); 1838218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightAngle); 1839218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1840218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1841218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1842218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1843d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor 1844ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor if (SemaRef.getLangOptions().RTTI) { 1845ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor // typeid ( expression-or-type ) 18468ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("std::type_info"); 1847ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddTypedTextChunk("typeid"); 1848ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1849ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddPlaceholderChunk("expression-or-type"); 1850ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1851ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1852ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor } 1853ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor 1854c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // new T ( ... ) 1855218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("new"); 1856218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1857218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("type"); 1858218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1859218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expressions"); 1860218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1861218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 186201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1863c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // new T [ ] ( ... ) 1864218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("new"); 1865218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1866218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("type"); 1867218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBracket); 1868218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("size"); 1869218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBracket); 1870218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1871218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expressions"); 1872218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1873218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 187401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1875c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // delete expression 18768ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("void"); 1877218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("delete"); 1878218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1879218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1880218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 188101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1882c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // delete [] expression 18838ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("void"); 1884218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("delete"); 1885218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1886218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBracket); 1887218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBracket); 1888218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1889218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1890218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1891c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor 1892ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor if (SemaRef.getLangOptions().CXXExceptions) { 1893ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor // throw expression 18948ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("void"); 1895ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddTypedTextChunk("throw"); 1896ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1897ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1898ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1899ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor } 1900a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor 190112e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor // FIXME: Rethrow? 1902a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor 1903a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor if (SemaRef.getLangOptions().CPlusPlus0x) { 1904a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor // nullptr 19058ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("std::nullptr_t"); 1906a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddTypedTextChunk("nullptr"); 1907a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1908a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor 1909a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor // alignof 19108ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("size_t"); 1911a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddTypedTextChunk("alignof"); 1912a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1913a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddPlaceholderChunk("type"); 1914a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1915a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1916a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor 1917a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor // noexcept 19188ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("bool"); 1919a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddTypedTextChunk("noexcept"); 1920a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1921a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1922a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1923a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1924a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor 1925a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor // sizeof... expression 19268ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("size_t"); 1927a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddTypedTextChunk("sizeof..."); 1928a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1929a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddPlaceholderChunk("parameter-pack"); 1930a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1931a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1932a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor } 193301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 193401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 193501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (SemaRef.getLangOptions().ObjC1) { 193601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Add "super", if we're in an Objective-C class with a superclass. 1937681e256048cf9d3d226b9d0699f3df22c2500ef4Ted Kremenek if (ObjCMethodDecl *Method = SemaRef.getCurMethodDecl()) { 1938681e256048cf9d3d226b9d0699f3df22c2500ef4Ted Kremenek // The interface can be NULL. 1939681e256048cf9d3d226b9d0699f3df22c2500ef4Ted Kremenek if (ObjCInterfaceDecl *ID = Method->getClassInterface()) 19408ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor if (ID->getSuperClass()) { 19418ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor std::string SuperType; 19428ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor SuperType = ID->getSuperClass()->getNameAsString(); 19438ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor if (Method->isInstanceMethod()) 19448ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor SuperType += " *"; 19458ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor 19468ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk(Allocator.CopyString(SuperType)); 19478ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddTypedTextChunk("super"); 19488ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 19498ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor } 1950681e256048cf9d3d226b9d0699f3df22c2500ef4Ted Kremenek } 1951681e256048cf9d3d226b9d0699f3df22c2500ef4Ted Kremenek 1952bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCExpressionResults(Results, true); 195301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 195401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1955c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // sizeof expression 19568ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("size_t"); 1957218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("sizeof"); 1958218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1959218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression-or-type"); 1960218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1961218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 196201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 196386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 1964d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor 1965f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Type: 196668e3c2eef52701a178fbcc2bb424f31dd4b36931Douglas Gregor case Sema::PCC_LocalDeclarationSpecifiers: 1967d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor break; 196801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 196901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 19704710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor if (WantTypesInContext(CCC, SemaRef.getLangOptions())) 19714710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor AddTypeSpecifierResults(SemaRef.getLangOptions(), Results); 197201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1973f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall if (SemaRef.getLangOptions().CPlusPlus && CCC != Sema::PCC_Type) 1974a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("operator")); 197586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 197686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 1977ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor/// \brief If the given declaration has an associated type, add it as a result 1978ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor/// type chunk. 1979ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregorstatic void AddResultTypeChunk(ASTContext &Context, 19808987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor const PrintingPolicy &Policy, 1981ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor NamedDecl *ND, 1982218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder &Result) { 1983ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor if (!ND) 1984ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor return; 19856f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 19866f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor // Skip constructors and conversion functions, which have their return types 19876f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor // built into their names. 19886f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor if (isa<CXXConstructorDecl>(ND) || isa<CXXConversionDecl>(ND)) 19896f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor return; 19906f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 1991ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor // Determine the type of the declaration (if it has a type). 19926f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor QualType T; 1993ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor if (FunctionDecl *Function = dyn_cast<FunctionDecl>(ND)) 1994ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor T = Function->getResultType(); 1995ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor else if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(ND)) 1996ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor T = Method->getResultType(); 1997ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor else if (FunctionTemplateDecl *FunTmpl = dyn_cast<FunctionTemplateDecl>(ND)) 1998ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor T = FunTmpl->getTemplatedDecl()->getResultType(); 1999ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor else if (EnumConstantDecl *Enumerator = dyn_cast<EnumConstantDecl>(ND)) 2000ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor T = Context.getTypeDeclType(cast<TypeDecl>(Enumerator->getDeclContext())); 2001ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor else if (isa<UnresolvedUsingValueDecl>(ND)) { 2002ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor /* Do nothing: ignore unresolved using declarations*/ 2003f85e193739c953358c865005855253af4f68a497John McCall } else if (ValueDecl *Value = dyn_cast<ValueDecl>(ND)) { 2004ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor T = Value->getType(); 2005f85e193739c953358c865005855253af4f68a497John McCall } else if (ObjCPropertyDecl *Property = dyn_cast<ObjCPropertyDecl>(ND)) 2006ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor T = Property->getType(); 2007ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor 2008ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor if (T.isNull() || Context.hasSameType(T, Context.DependentTy)) 2009ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor return; 2010ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor 20118987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor Result.AddResultTypeChunk(GetCompletionTypeString(T, Context, Policy, 2012a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor Result.getAllocator())); 2013ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor} 2014ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor 2015aaa107acc8f906203101af259e8d764b5027700aDouglas Gregorstatic void MaybeAddSentinel(ASTContext &Context, NamedDecl *FunctionOrMethod, 2016218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder &Result) { 2017aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor if (SentinelAttr *Sentinel = FunctionOrMethod->getAttr<SentinelAttr>()) 2018aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor if (Sentinel->getSentinel() == 0) { 2019aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor if (Context.getLangOptions().ObjC1 && 2020aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor Context.Idents.get("nil").hasMacroDefinition()) 2021218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddTextChunk(", nil"); 2022aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor else if (Context.Idents.get("NULL").hasMacroDefinition()) 2023218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddTextChunk(", NULL"); 2024aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor else 2025218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddTextChunk(", (void*)0"); 2026aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor } 2027aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor} 2028aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor 20296fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregorstatic std::string formatObjCParamQualifiers(unsigned ObjCQuals) { 20306fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor std::string Result; 20316fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor if (ObjCQuals & Decl::OBJC_TQ_In) 20326ef920976a86aa710ccfeeeb7e14e9b38aef5007Douglas Gregor Result += "in "; 20336fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor else if (ObjCQuals & Decl::OBJC_TQ_Inout) 20346ef920976a86aa710ccfeeeb7e14e9b38aef5007Douglas Gregor Result += "inout "; 20356fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor else if (ObjCQuals & Decl::OBJC_TQ_Out) 20366ef920976a86aa710ccfeeeb7e14e9b38aef5007Douglas Gregor Result += "out "; 20376fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor if (ObjCQuals & Decl::OBJC_TQ_Bycopy) 20386ef920976a86aa710ccfeeeb7e14e9b38aef5007Douglas Gregor Result += "bycopy "; 20396fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor else if (ObjCQuals & Decl::OBJC_TQ_Byref) 20406ef920976a86aa710ccfeeeb7e14e9b38aef5007Douglas Gregor Result += "byref "; 20416fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor if (ObjCQuals & Decl::OBJC_TQ_Oneway) 20426ef920976a86aa710ccfeeeb7e14e9b38aef5007Douglas Gregor Result += "oneway "; 20436fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor return Result; 20446fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor} 20456fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor 204683482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregorstatic std::string FormatFunctionParameter(ASTContext &Context, 20478987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor const PrintingPolicy &Policy, 2048aba480862485ea1140a81f25c23f43bb080edc90Douglas Gregor ParmVarDecl *Param, 2049ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor bool SuppressName = false, 2050ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor bool SuppressBlock = false) { 205183482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor bool ObjCMethodParam = isa<ObjCMethodDecl>(Param->getDeclContext()); 205283482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor if (Param->getType()->isDependentType() || 205383482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor !Param->getType()->isBlockPointerType()) { 205483482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor // The argument for a dependent or non-block parameter is a placeholder 205583482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor // containing that parameter's type. 205683482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor std::string Result; 205783482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor 2058aba480862485ea1140a81f25c23f43bb080edc90Douglas Gregor if (Param->getIdentifier() && !ObjCMethodParam && !SuppressName) 205983482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor Result = Param->getIdentifier()->getName(); 206083482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor 2061f85e193739c953358c865005855253af4f68a497John McCall Param->getType().getAsStringInternal(Result, Policy); 206283482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor 206383482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor if (ObjCMethodParam) { 20646fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor Result = "(" + formatObjCParamQualifiers(Param->getObjCDeclQualifier()) 20656fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor + Result + ")"; 2066aba480862485ea1140a81f25c23f43bb080edc90Douglas Gregor if (Param->getIdentifier() && !SuppressName) 206783482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor Result += Param->getIdentifier()->getName(); 206883482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor } 206983482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor return Result; 207083482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor } 207183482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor 207283482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor // The argument for a block pointer parameter is a block literal with 207383482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor // the appropriate type. 2074830072c2de881aadfe0f6efd3baccc9129a77e37Douglas Gregor FunctionTypeLoc *Block = 0; 2075830072c2de881aadfe0f6efd3baccc9129a77e37Douglas Gregor FunctionProtoTypeLoc *BlockProto = 0; 207683482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor TypeLoc TL; 207783482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor if (TypeSourceInfo *TSInfo = Param->getTypeSourceInfo()) { 207883482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor TL = TSInfo->getTypeLoc().getUnqualifiedLoc(); 207983482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor while (true) { 208083482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor // Look through typedefs. 2081ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor if (!SuppressBlock) { 2082ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor if (TypedefTypeLoc *TypedefTL = dyn_cast<TypedefTypeLoc>(&TL)) { 2083ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor if (TypeSourceInfo *InnerTSInfo 2084ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor = TypedefTL->getTypedefNameDecl()->getTypeSourceInfo()) { 2085ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor TL = InnerTSInfo->getTypeLoc().getUnqualifiedLoc(); 2086ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor continue; 2087ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor } 2088ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor } 2089ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor 2090ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor // Look through qualified types 2091ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor if (QualifiedTypeLoc *QualifiedTL = dyn_cast<QualifiedTypeLoc>(&TL)) { 2092ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor TL = QualifiedTL->getUnqualifiedLoc(); 209383482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor continue; 209483482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor } 209583482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor } 209683482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor 209783482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor // Try to get the function prototype behind the block pointer type, 209883482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor // then we're done. 209983482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor if (BlockPointerTypeLoc *BlockPtr 210083482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor = dyn_cast<BlockPointerTypeLoc>(&TL)) { 2101723df245307a530da5433dfb43accf187dc3e243Abramo Bagnara TL = BlockPtr->getPointeeLoc().IgnoreParens(); 2102830072c2de881aadfe0f6efd3baccc9129a77e37Douglas Gregor Block = dyn_cast<FunctionTypeLoc>(&TL); 2103830072c2de881aadfe0f6efd3baccc9129a77e37Douglas Gregor BlockProto = dyn_cast<FunctionProtoTypeLoc>(&TL); 210483482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor } 210583482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor break; 210683482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor } 210783482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor } 210883482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor 210983482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor if (!Block) { 211083482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor // We were unable to find a FunctionProtoTypeLoc with parameter names 211183482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor // for the block; just use the parameter type as a placeholder. 211283482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor std::string Result; 2113ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor if (!ObjCMethodParam && Param->getIdentifier()) 2114ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Result = Param->getIdentifier()->getName(); 2115ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor 2116f85e193739c953358c865005855253af4f68a497John McCall Param->getType().getUnqualifiedType().getAsStringInternal(Result, Policy); 211783482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor 211883482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor if (ObjCMethodParam) { 21196fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor Result = "(" + formatObjCParamQualifiers(Param->getObjCDeclQualifier()) 21206fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor + Result + ")"; 212183482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor if (Param->getIdentifier()) 212283482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor Result += Param->getIdentifier()->getName(); 212383482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor } 212483482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor 212583482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor return Result; 212683482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor } 2127ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor 212883482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor // We have the function prototype behind the block pointer type, as it was 212983482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor // written in the source. 2130382762582c8fcbc06b395a806fd57879381897a8Douglas Gregor std::string Result; 2131382762582c8fcbc06b395a806fd57879381897a8Douglas Gregor QualType ResultType = Block->getTypePtr()->getResultType(); 2132ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor if (!ResultType->isVoidType() || SuppressBlock) 2133f85e193739c953358c865005855253af4f68a497John McCall ResultType.getAsStringInternal(Result, Policy); 2134ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor 2135ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor // Format the parameter list. 2136ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor std::string Params; 2137830072c2de881aadfe0f6efd3baccc9129a77e37Douglas Gregor if (!BlockProto || Block->getNumArgs() == 0) { 2138830072c2de881aadfe0f6efd3baccc9129a77e37Douglas Gregor if (BlockProto && BlockProto->getTypePtr()->isVariadic()) 2139ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Params = "(...)"; 2140c2760bc8e99510c4b3848fcd21323afd711ee269Douglas Gregor else 2141ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Params = "(void)"; 2142382762582c8fcbc06b395a806fd57879381897a8Douglas Gregor } else { 2143ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Params += "("; 2144382762582c8fcbc06b395a806fd57879381897a8Douglas Gregor for (unsigned I = 0, N = Block->getNumArgs(); I != N; ++I) { 2145382762582c8fcbc06b395a806fd57879381897a8Douglas Gregor if (I) 2146ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Params += ", "; 2147ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Params += FormatFunctionParameter(Context, Policy, Block->getArg(I), 2148ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor /*SuppressName=*/false, 2149ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor /*SuppressBlock=*/true); 2150382762582c8fcbc06b395a806fd57879381897a8Douglas Gregor 2151830072c2de881aadfe0f6efd3baccc9129a77e37Douglas Gregor if (I == N - 1 && BlockProto->getTypePtr()->isVariadic()) 2152ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Params += ", ..."; 2153382762582c8fcbc06b395a806fd57879381897a8Douglas Gregor } 2154ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Params += ")"; 2155ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor } 2156ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor 2157ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor if (SuppressBlock) { 2158ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor // Format as a parameter. 2159ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Result = Result + " (^"; 2160ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor if (Param->getIdentifier()) 2161ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Result += Param->getIdentifier()->getName(); 2162382762582c8fcbc06b395a806fd57879381897a8Douglas Gregor Result += ")"; 2163ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Result += Params; 2164ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor } else { 2165ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor // Format as a block literal argument. 2166ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Result = '^' + Result; 2167ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Result += Params; 2168ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor 2169ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor if (Param->getIdentifier()) 2170ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Result += Param->getIdentifier()->getName(); 2171e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor } 2172382762582c8fcbc06b395a806fd57879381897a8Douglas Gregor 217383482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor return Result; 217483482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor} 217583482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor 217686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Add function parameter chunks to the given code completion string. 217786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorstatic void AddFunctionParameterChunks(ASTContext &Context, 21788987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor const PrintingPolicy &Policy, 217986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor FunctionDecl *Function, 2180218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder &Result, 2181218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor unsigned Start = 0, 2182218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor bool InOptional = false) { 21830c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor typedef CodeCompletionString::Chunk Chunk; 2184218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor bool FirstParameter = true; 21850c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 2186218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor for (unsigned P = Start, N = Function->getNumParams(); P != N; ++P) { 218786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ParmVarDecl *Param = Function->getParamDecl(P); 218886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 2189218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor if (Param->hasDefaultArg() && !InOptional) { 219086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // When we see an optional default argument, put that argument and 219186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // the remaining default arguments into a new, optional string. 2192218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder Opt(Result.getAllocator()); 2193218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor if (!FirstParameter) 2194218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Opt.AddChunk(Chunk(CodeCompletionString::CK_Comma)); 21958987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor AddFunctionParameterChunks(Context, Policy, Function, Opt, P, true); 2196218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddOptionalChunk(Opt.TakeString()); 2197218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor break; 219886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 219986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 2200218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor if (FirstParameter) 2201218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor FirstParameter = false; 2202218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor else 2203218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(Chunk(CodeCompletionString::CK_Comma)); 2204218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor 2205218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor InOptional = false; 220686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 220786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Format the placeholder string. 22088987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor std::string PlaceholderStr = FormatFunctionParameter(Context, Policy, 22098987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor Param); 221083482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor 2211e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor if (Function->isVariadic() && P == N - 1) 2212e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor PlaceholderStr += ", ..."; 2213e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor 221486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add the placeholder string. 2215dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddPlaceholderChunk( 2216dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.getAllocator().CopyString(PlaceholderStr)); 221786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 2218b3d4525c65cf456d3f1f4338afdcac83afc7be02Douglas Gregor 2219b3d4525c65cf456d3f1f4338afdcac83afc7be02Douglas Gregor if (const FunctionProtoType *Proto 2220b3d4525c65cf456d3f1f4338afdcac83afc7be02Douglas Gregor = Function->getType()->getAs<FunctionProtoType>()) 2221aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor if (Proto->isVariadic()) { 2222e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor if (Proto->getNumArgs() == 0) 2223218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddPlaceholderChunk("..."); 2224aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor 2225218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor MaybeAddSentinel(Context, Function, Result); 2226aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor } 222786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 222886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 222986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Add template parameter chunks to the given code completion string. 223086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorstatic void AddTemplateParameterChunks(ASTContext &Context, 22318987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor const PrintingPolicy &Policy, 223286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor TemplateDecl *Template, 2233218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder &Result, 2234218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor unsigned MaxParameters = 0, 2235218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor unsigned Start = 0, 2236218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor bool InDefaultArg = false) { 22370c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor typedef CodeCompletionString::Chunk Chunk; 223886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool FirstParameter = true; 223986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 224086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor TemplateParameterList *Params = Template->getTemplateParameters(); 224186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor TemplateParameterList::iterator PEnd = Params->end(); 224286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (MaxParameters) 224386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PEnd = Params->begin() + MaxParameters; 2244218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor for (TemplateParameterList::iterator P = Params->begin() + Start; 2245218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor P != PEnd; ++P) { 224686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool HasDefaultArg = false; 224786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor std::string PlaceholderStr; 224886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(*P)) { 224986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (TTP->wasDeclaredWithTypename()) 225086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr = "typename"; 225186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor else 225286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr = "class"; 225386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 225486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (TTP->getIdentifier()) { 225586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr += ' '; 225686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr += TTP->getIdentifier()->getName(); 225786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 225886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 225986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor HasDefaultArg = TTP->hasDefaultArgument(); 226086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } else if (NonTypeTemplateParmDecl *NTTP 2261218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor = dyn_cast<NonTypeTemplateParmDecl>(*P)) { 226286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (NTTP->getIdentifier()) 226386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr = NTTP->getIdentifier()->getName(); 2264f85e193739c953358c865005855253af4f68a497John McCall NTTP->getType().getAsStringInternal(PlaceholderStr, Policy); 226586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor HasDefaultArg = NTTP->hasDefaultArgument(); 226686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } else { 226786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor assert(isa<TemplateTemplateParmDecl>(*P)); 226886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor TemplateTemplateParmDecl *TTP = cast<TemplateTemplateParmDecl>(*P); 226986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 227086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Since putting the template argument list into the placeholder would 227186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // be very, very long, we just use an abbreviation. 227286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr = "template<...> class"; 227386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (TTP->getIdentifier()) { 227486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr += ' '; 227586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr += TTP->getIdentifier()->getName(); 227686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 227786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 227886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor HasDefaultArg = TTP->hasDefaultArgument(); 227986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 228086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 2281218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor if (HasDefaultArg && !InDefaultArg) { 228286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // When we see an optional default argument, put that argument and 228386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // the remaining default arguments into a new, optional string. 2284218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder Opt(Result.getAllocator()); 2285218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor if (!FirstParameter) 2286218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Opt.AddChunk(Chunk(CodeCompletionString::CK_Comma)); 22878987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor AddTemplateParameterChunks(Context, Policy, Template, Opt, MaxParameters, 2288218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor P - Params->begin(), true); 2289218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddOptionalChunk(Opt.TakeString()); 2290218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor break; 229186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 229286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 2293218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor InDefaultArg = false; 2294218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor 229586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (FirstParameter) 229686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor FirstParameter = false; 229786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor else 2298218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(Chunk(CodeCompletionString::CK_Comma)); 229986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 230086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add the placeholder string. 2301dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddPlaceholderChunk( 2302dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.getAllocator().CopyString(PlaceholderStr)); 230386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 230486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 230586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 2306b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor/// \brief Add a qualifier to the given code-completion string, if the 2307b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor/// provided nested-name-specifier is non-NULL. 2308a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregorstatic void 2309218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas GregorAddQualifierToCompletionString(CodeCompletionBuilder &Result, 2310a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor NestedNameSpecifier *Qualifier, 2311a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor bool QualifierIsInformative, 23128987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor ASTContext &Context, 23138987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor const PrintingPolicy &Policy) { 2314b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor if (!Qualifier) 2315b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor return; 2316b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor 2317b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor std::string PrintedNNS; 2318b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor { 2319b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor llvm::raw_string_ostream OS(PrintedNNS); 23208987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor Qualifier->print(OS, Policy); 2321b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor } 23220563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor if (QualifierIsInformative) 2323dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddInformativeChunk(Result.getAllocator().CopyString(PrintedNNS)); 23240563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor else 2325dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTextChunk(Result.getAllocator().CopyString(PrintedNNS)); 2326b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor} 2327b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor 2328218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregorstatic void 2329218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas GregorAddFunctionTypeQualsToCompletionString(CodeCompletionBuilder &Result, 2330218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor FunctionDecl *Function) { 2331a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor const FunctionProtoType *Proto 2332a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor = Function->getType()->getAs<FunctionProtoType>(); 2333a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor if (!Proto || !Proto->getTypeQuals()) 2334a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor return; 2335a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor 2336a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor // FIXME: Add ref-qualifier! 2337a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor 2338a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor // Handle single qualifiers without copying 2339a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor if (Proto->getTypeQuals() == Qualifiers::Const) { 2340a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor Result.AddInformativeChunk(" const"); 2341a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor return; 2342a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor } 2343a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor 2344a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor if (Proto->getTypeQuals() == Qualifiers::Volatile) { 2345a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor Result.AddInformativeChunk(" volatile"); 2346a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor return; 2347a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor } 2348a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor 2349a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor if (Proto->getTypeQuals() == Qualifiers::Restrict) { 2350a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor Result.AddInformativeChunk(" restrict"); 2351a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor return; 2352a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor } 2353a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor 2354a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor // Handle multiple qualifiers. 2355a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor std::string QualsStr; 2356a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor if (Proto->getTypeQuals() & Qualifiers::Const) 2357a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor QualsStr += " const"; 2358a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor if (Proto->getTypeQuals() & Qualifiers::Volatile) 2359a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor QualsStr += " volatile"; 2360a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor if (Proto->getTypeQuals() & Qualifiers::Restrict) 2361a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor QualsStr += " restrict"; 2362dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddInformativeChunk(Result.getAllocator().CopyString(QualsStr)); 2363a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor} 2364a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor 23656f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor/// \brief Add the name of the given declaration 23668987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregorstatic void AddTypedNameChunk(ASTContext &Context, const PrintingPolicy &Policy, 23678987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor NamedDecl *ND, CodeCompletionBuilder &Result) { 23686f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor typedef CodeCompletionString::Chunk Chunk; 23696f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 23706f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor DeclarationName Name = ND->getDeclName(); 23716f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor if (!Name) 23726f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor return; 23736f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 23746f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor switch (Name.getNameKind()) { 2375a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor case DeclarationName::CXXOperatorName: { 2376a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor const char *OperatorName = 0; 2377a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor switch (Name.getCXXOverloadedOperator()) { 2378a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor case OO_None: 2379a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor case OO_Conditional: 2380a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor case NUM_OVERLOADED_OPERATORS: 2381a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor OperatorName = "operator"; 2382a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor break; 2383a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor 2384a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 2385a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor case OO_##Name: OperatorName = "operator" Spelling; break; 2386a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor#define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly) 2387a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor#include "clang/Basic/OperatorKinds.def" 2388a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor 2389a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor case OO_New: OperatorName = "operator new"; break; 2390a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor case OO_Delete: OperatorName = "operator delete"; break; 2391a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor case OO_Array_New: OperatorName = "operator new[]"; break; 2392a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor case OO_Array_Delete: OperatorName = "operator delete[]"; break; 2393a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor case OO_Call: OperatorName = "operator()"; break; 2394a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor case OO_Subscript: OperatorName = "operator[]"; break; 2395a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor } 2396a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor Result.AddTypedTextChunk(OperatorName); 2397a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor break; 2398a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor } 2399a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor 24006f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case DeclarationName::Identifier: 24016f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case DeclarationName::CXXConversionFunctionName: 24026f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case DeclarationName::CXXDestructorName: 24036f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case DeclarationName::CXXLiteralOperatorName: 2404dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTypedTextChunk( 2405dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.getAllocator().CopyString(ND->getNameAsString())); 24066f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor break; 24076f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 24086f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case DeclarationName::CXXUsingDirective: 24096f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case DeclarationName::ObjCZeroArgSelector: 24106f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case DeclarationName::ObjCOneArgSelector: 24116f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case DeclarationName::ObjCMultiArgSelector: 24126f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor break; 24136f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 24146f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case DeclarationName::CXXConstructorName: { 24156f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor CXXRecordDecl *Record = 0; 24166f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor QualType Ty = Name.getCXXNameType(); 24176f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor if (const RecordType *RecordTy = Ty->getAs<RecordType>()) 24186f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor Record = cast<CXXRecordDecl>(RecordTy->getDecl()); 24196f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor else if (const InjectedClassNameType *InjectedTy 24206f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor = Ty->getAs<InjectedClassNameType>()) 24216f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor Record = InjectedTy->getDecl(); 24226f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor else { 2423dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTypedTextChunk( 2424dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.getAllocator().CopyString(ND->getNameAsString())); 24256f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor break; 24266f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor } 24276f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 2428dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTypedTextChunk( 2429dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.getAllocator().CopyString(Record->getNameAsString())); 24306f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor if (ClassTemplateDecl *Template = Record->getDescribedClassTemplate()) { 2431218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(Chunk(CodeCompletionString::CK_LeftAngle)); 24328987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor AddTemplateParameterChunks(Context, Policy, Template, Result); 2433218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(Chunk(CodeCompletionString::CK_RightAngle)); 24346f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor } 24356f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor break; 24366f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor } 24376f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor } 24386f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor} 24396f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 2440ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios KyrtzidisCodeCompletionString *CodeCompletionResult::CreateCodeCompletionString(Sema &S, 2441ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis CodeCompletionAllocator &Allocator) { 2442ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis return CreateCodeCompletionString(S.Context, S.PP, Allocator); 2443ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis} 2444ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis 244586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief If possible, create a new code completion string for the given 244686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// result. 244786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// 244886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \returns Either a new, heap-allocated code completion string describing 244986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// how to use this result, or NULL to indicate that the string or name of the 245086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// result is all that is needed. 245186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas GregorCodeCompletionString * 2452ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios KyrtzidisCodeCompletionResult::CreateCodeCompletionString(ASTContext &Ctx, 2453ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis Preprocessor &PP, 2454dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor CodeCompletionAllocator &Allocator) { 24550c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor typedef CodeCompletionString::Chunk Chunk; 2456218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder Result(Allocator, Priority, Availability); 24570c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 2458ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis PrintingPolicy Policy = getCompletionPrintingPolicy(Ctx, PP); 2459218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor if (Kind == RK_Pattern) { 2460218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Pattern->Priority = Priority; 2461218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Pattern->Availability = Availability; 2462218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Pattern; 2463218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor } 24642b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 24652b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor if (Kind == RK_Keyword) { 2466218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddTypedTextChunk(Keyword); 2467218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Result.TakeString(); 24682b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor } 246986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 24703f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor if (Kind == RK_Macro) { 2471ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis MacroInfo *MI = PP.getMacroInfo(Macro); 24722b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor assert(MI && "Not a macro?"); 24732b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 2474dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTypedTextChunk( 2475dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.getAllocator().CopyString(Macro->getName())); 24762b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 24772b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor if (!MI->isFunctionLike()) 2478218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Result.TakeString(); 24793f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor 24803f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor // Format a function-like macro with placeholders for the arguments. 2481218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(Chunk(CodeCompletionString::CK_LeftParen)); 2482e42447021239015db97202fb04c304d82e84135fDouglas Gregor MacroInfo::arg_iterator A = MI->arg_begin(), AEnd = MI->arg_end(); 2483c8dc1352071575c36401158094a865ad682fb886Douglas Gregor 2484c8dc1352071575c36401158094a865ad682fb886Douglas Gregor // C99 variadic macros add __VA_ARGS__ at the end. Skip it. 2485c8dc1352071575c36401158094a865ad682fb886Douglas Gregor if (MI->isC99Varargs()) { 2486c8dc1352071575c36401158094a865ad682fb886Douglas Gregor --AEnd; 2487c8dc1352071575c36401158094a865ad682fb886Douglas Gregor 2488c8dc1352071575c36401158094a865ad682fb886Douglas Gregor if (A == AEnd) { 2489c8dc1352071575c36401158094a865ad682fb886Douglas Gregor Result.AddPlaceholderChunk("..."); 2490c8dc1352071575c36401158094a865ad682fb886Douglas Gregor } 2491e42447021239015db97202fb04c304d82e84135fDouglas Gregor } 2492c8dc1352071575c36401158094a865ad682fb886Douglas Gregor 2493e42447021239015db97202fb04c304d82e84135fDouglas Gregor for (MacroInfo::arg_iterator A = MI->arg_begin(); A != AEnd; ++A) { 24943f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor if (A != MI->arg_begin()) 2495218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(Chunk(CodeCompletionString::CK_Comma)); 2496c8dc1352071575c36401158094a865ad682fb886Douglas Gregor 2497c8dc1352071575c36401158094a865ad682fb886Douglas Gregor if (MI->isVariadic() && (A+1) == AEnd) { 2498f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith SmallString<32> Arg = (*A)->getName(); 2499c8dc1352071575c36401158094a865ad682fb886Douglas Gregor if (MI->isC99Varargs()) 2500c8dc1352071575c36401158094a865ad682fb886Douglas Gregor Arg += ", ..."; 2501c8dc1352071575c36401158094a865ad682fb886Douglas Gregor else 2502c8dc1352071575c36401158094a865ad682fb886Douglas Gregor Arg += "..."; 2503dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddPlaceholderChunk(Result.getAllocator().CopyString(Arg)); 2504c8dc1352071575c36401158094a865ad682fb886Douglas Gregor break; 25053f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor } 2506c8dc1352071575c36401158094a865ad682fb886Douglas Gregor 2507c8dc1352071575c36401158094a865ad682fb886Douglas Gregor // Non-variadic macros are simple. 2508c8dc1352071575c36401158094a865ad682fb886Douglas Gregor Result.AddPlaceholderChunk( 2509c8dc1352071575c36401158094a865ad682fb886Douglas Gregor Result.getAllocator().CopyString((*A)->getName())); 2510e42447021239015db97202fb04c304d82e84135fDouglas Gregor } 2511218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(Chunk(CodeCompletionString::CK_RightParen)); 2512218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Result.TakeString(); 25133f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor } 25143f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor 2515d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor assert(Kind == RK_Declaration && "Missed a result kind?"); 251686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NamedDecl *ND = Declaration; 251786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 25180c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor if (StartsNestedNameSpecifier) { 2519dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTypedTextChunk( 2520dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.getAllocator().CopyString(ND->getNameAsString())); 2521218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddTextChunk("::"); 2522218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Result.TakeString(); 25230c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor } 25246164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen 25256164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen for (Decl::attr_iterator i = ND->attr_begin(); i != ND->attr_end(); ++i) { 25266164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen if (AnnotateAttr *Attr = dyn_cast_or_null<AnnotateAttr>(*i)) { 25276164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen Result.AddAnnotation(Result.getAllocator().CopyString(Attr->getAnnotation())); 25286164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen } 25296164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen } 25300c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 2531ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis AddResultTypeChunk(Ctx, Policy, ND, Result); 2532ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor 253386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (FunctionDecl *Function = dyn_cast<FunctionDecl>(ND)) { 25340563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative, 2535ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis Ctx, Policy); 2536ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis AddTypedNameChunk(Ctx, Policy, ND, Result); 2537218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(Chunk(CodeCompletionString::CK_LeftParen)); 2538ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis AddFunctionParameterChunks(Ctx, Policy, Function, Result); 2539218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(Chunk(CodeCompletionString::CK_RightParen)); 2540a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor AddFunctionTypeQualsToCompletionString(Result, Function); 2541218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Result.TakeString(); 254286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 254386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 254486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (FunctionTemplateDecl *FunTmpl = dyn_cast<FunctionTemplateDecl>(ND)) { 25450563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative, 2546ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis Ctx, Policy); 254786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor FunctionDecl *Function = FunTmpl->getTemplatedDecl(); 2548ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis AddTypedNameChunk(Ctx, Policy, Function, Result); 25496f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 255086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Figure out which template parameters are deduced (or have default 255186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // arguments). 2552013b3668b67c8cb3ad2ee516c5607a3eba11829fBenjamin Kramer llvm::SmallBitVector Deduced; 2553ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis Sema::MarkDeducedTemplateParameters(Ctx, FunTmpl, Deduced); 255486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor unsigned LastDeducibleArgument; 255586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor for (LastDeducibleArgument = Deduced.size(); LastDeducibleArgument > 0; 255686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor --LastDeducibleArgument) { 255786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!Deduced[LastDeducibleArgument - 1]) { 255886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // C++0x: Figure out if the template argument has a default. If so, 255986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // the user doesn't need to type this argument. 256086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // FIXME: We need to abstract template parameters better! 256186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool HasDefaultArg = false; 256286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NamedDecl *Param = FunTmpl->getTemplateParameters()->getParam( 2563218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor LastDeducibleArgument - 1); 256486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(Param)) 256586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor HasDefaultArg = TTP->hasDefaultArgument(); 256686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor else if (NonTypeTemplateParmDecl *NTTP 256786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor = dyn_cast<NonTypeTemplateParmDecl>(Param)) 256886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor HasDefaultArg = NTTP->hasDefaultArgument(); 256986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor else { 257086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor assert(isa<TemplateTemplateParmDecl>(Param)); 257186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor HasDefaultArg 25720c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor = cast<TemplateTemplateParmDecl>(Param)->hasDefaultArgument(); 257386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 257486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 257586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!HasDefaultArg) 257686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor break; 257786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 257886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 257986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 258086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (LastDeducibleArgument) { 258186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Some of the function template arguments cannot be deduced from a 258286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // function call, so we introduce an explicit template argument list 258386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // containing all of the arguments up to the first deducible argument. 2584218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(Chunk(CodeCompletionString::CK_LeftAngle)); 2585ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis AddTemplateParameterChunks(Ctx, Policy, FunTmpl, Result, 258686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor LastDeducibleArgument); 2587218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(Chunk(CodeCompletionString::CK_RightAngle)); 258886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 258986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 259086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add the function parameters 2591218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(Chunk(CodeCompletionString::CK_LeftParen)); 2592ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis AddFunctionParameterChunks(Ctx, Policy, Function, Result); 2593218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(Chunk(CodeCompletionString::CK_RightParen)); 2594a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor AddFunctionTypeQualsToCompletionString(Result, Function); 2595218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Result.TakeString(); 259686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 259786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 259886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (TemplateDecl *Template = dyn_cast<TemplateDecl>(ND)) { 25990563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative, 2600ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis Ctx, Policy); 2601dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTypedTextChunk( 2602dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.getAllocator().CopyString(Template->getNameAsString())); 2603218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(Chunk(CodeCompletionString::CK_LeftAngle)); 2604ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis AddTemplateParameterChunks(Ctx, Policy, Template, Result); 2605218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(Chunk(CodeCompletionString::CK_RightAngle)); 2606218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Result.TakeString(); 260786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 260886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 26099630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(ND)) { 26109630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor Selector Sel = Method->getSelector(); 26119630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor if (Sel.isUnarySelector()) { 2612dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTypedTextChunk(Result.getAllocator().CopyString( 2613813d8346529bf094eb2b249648906ba7fd226688Douglas Gregor Sel.getNameForSlot(0))); 2614218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Result.TakeString(); 26159630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor } 26169630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor 2617813d8346529bf094eb2b249648906ba7fd226688Douglas Gregor std::string SelName = Sel.getNameForSlot(0).str(); 2618d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor SelName += ':'; 2619d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor if (StartParameter == 0) 2620dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTypedTextChunk(Result.getAllocator().CopyString(SelName)); 2621d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor else { 2622dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddInformativeChunk(Result.getAllocator().CopyString(SelName)); 2623d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor 2624d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor // If there is only one parameter, and we're past it, add an empty 2625d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor // typed-text chunk since there is nothing to type. 2626d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor if (Method->param_size() == 1) 2627218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddTypedTextChunk(""); 2628d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor } 26299630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor unsigned Idx = 0; 26309630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor for (ObjCMethodDecl::param_iterator P = Method->param_begin(), 26319630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor PEnd = Method->param_end(); 26329630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor P != PEnd; (void)++P, ++Idx) { 26339630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor if (Idx > 0) { 2634d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor std::string Keyword; 2635d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor if (Idx > StartParameter) 2636218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(CodeCompletionString::CK_HorizontalSpace); 26379630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor if (IdentifierInfo *II = Sel.getIdentifierInfoForSlot(Idx)) 2638a0651c5f5d1c8928d3ae062435ed9cf0aa0d04baBenjamin Kramer Keyword += II->getName(); 26399630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor Keyword += ":"; 26401f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor if (Idx < StartParameter || AllParametersAreInformative) 2641dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddInformativeChunk(Result.getAllocator().CopyString(Keyword)); 2642c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor else 2643dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTypedTextChunk(Result.getAllocator().CopyString(Keyword)); 26449630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor } 2645d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor 2646d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor // If we're before the starting parameter, skip the placeholder. 2647d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor if (Idx < StartParameter) 2648d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor continue; 26499630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor 26509630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor std::string Arg; 265183482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor 265283482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor if ((*P)->getType()->isBlockPointerType() && !DeclaringEntity) 2653ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis Arg = FormatFunctionParameter(Ctx, Policy, *P, true); 265483482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor else { 2655f85e193739c953358c865005855253af4f68a497John McCall (*P)->getType().getAsStringInternal(Arg, Policy); 26566fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor Arg = "(" + formatObjCParamQualifiers((*P)->getObjCDeclQualifier()) 26576fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor + Arg + ")"; 265883482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor if (IdentifierInfo *II = (*P)->getIdentifier()) 2659aba480862485ea1140a81f25c23f43bb080edc90Douglas Gregor if (DeclaringEntity || AllParametersAreInformative) 2660a0651c5f5d1c8928d3ae062435ed9cf0aa0d04baBenjamin Kramer Arg += II->getName(); 266183482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor } 266283482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor 2663e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor if (Method->isVariadic() && (P + 1) == PEnd) 2664e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor Arg += ", ..."; 2665e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor 26661f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor if (DeclaringEntity) 2667dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTextChunk(Result.getAllocator().CopyString(Arg)); 26681f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor else if (AllParametersAreInformative) 2669dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddInformativeChunk(Result.getAllocator().CopyString(Arg)); 26704ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor else 2671dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddPlaceholderChunk(Result.getAllocator().CopyString(Arg)); 26729630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor } 26739630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor 26742a17af0c7e05500e25d4cc71341f1f232085ebeaDouglas Gregor if (Method->isVariadic()) { 2675e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor if (Method->param_size() == 0) { 2676e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor if (DeclaringEntity) 2677218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddTextChunk(", ..."); 2678e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor else if (AllParametersAreInformative) 2679218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddInformativeChunk(", ..."); 2680e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor else 2681218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddPlaceholderChunk(", ..."); 2682e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor } 2683aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor 2684ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis MaybeAddSentinel(Ctx, Method, Result); 26852a17af0c7e05500e25d4cc71341f1f232085ebeaDouglas Gregor } 26862a17af0c7e05500e25d4cc71341f1f232085ebeaDouglas Gregor 2687218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Result.TakeString(); 26889630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor } 26899630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor 26902b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor if (Qualifier) 26910563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative, 2692ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis Ctx, Policy); 26932b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 2694dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTypedTextChunk( 2695dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.getAllocator().CopyString(ND->getNameAsString())); 2696218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Result.TakeString(); 269786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 269886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 269986d802e03a267af79663990c39865c67e0645238Douglas GregorCodeCompletionString * 270086d802e03a267af79663990c39865c67e0645238Douglas GregorCodeCompleteConsumer::OverloadCandidate::CreateSignatureString( 270186d802e03a267af79663990c39865c67e0645238Douglas Gregor unsigned CurrentArg, 270232be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor Sema &S, 2703dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor CodeCompletionAllocator &Allocator) const { 27040c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor typedef CodeCompletionString::Chunk Chunk; 27058987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor PrintingPolicy Policy = getCompletionPrintingPolicy(S); 2706f85e193739c953358c865005855253af4f68a497John McCall 2707218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor // FIXME: Set priority, availability appropriately. 2708218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder Result(Allocator, 1, CXAvailability_Available); 270986d802e03a267af79663990c39865c67e0645238Douglas Gregor FunctionDecl *FDecl = getFunction(); 27108987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor AddResultTypeChunk(S.Context, Policy, FDecl, Result); 271186d802e03a267af79663990c39865c67e0645238Douglas Gregor const FunctionProtoType *Proto 271286d802e03a267af79663990c39865c67e0645238Douglas Gregor = dyn_cast<FunctionProtoType>(getFunctionType()); 271386d802e03a267af79663990c39865c67e0645238Douglas Gregor if (!FDecl && !Proto) { 271486d802e03a267af79663990c39865c67e0645238Douglas Gregor // Function without a prototype. Just give the return type and a 271586d802e03a267af79663990c39865c67e0645238Douglas Gregor // highlighted ellipsis. 271686d802e03a267af79663990c39865c67e0645238Douglas Gregor const FunctionType *FT = getFunctionType(); 2717a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor Result.AddTextChunk(GetCompletionTypeString(FT->getResultType(), 27188987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor S.Context, Policy, 2719a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor Result.getAllocator())); 2720218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(Chunk(CodeCompletionString::CK_LeftParen)); 2721218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(Chunk(CodeCompletionString::CK_CurrentParameter, "...")); 2722218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(Chunk(CodeCompletionString::CK_RightParen)); 2723218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Result.TakeString(); 272486d802e03a267af79663990c39865c67e0645238Douglas Gregor } 272586d802e03a267af79663990c39865c67e0645238Douglas Gregor 272686d802e03a267af79663990c39865c67e0645238Douglas Gregor if (FDecl) 2727dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTextChunk( 2728dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.getAllocator().CopyString(FDecl->getNameAsString())); 272986d802e03a267af79663990c39865c67e0645238Douglas Gregor else 2730218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddTextChunk( 2731dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.getAllocator().CopyString( 2732f85e193739c953358c865005855253af4f68a497John McCall Proto->getResultType().getAsString(Policy))); 273386d802e03a267af79663990c39865c67e0645238Douglas Gregor 2734218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(Chunk(CodeCompletionString::CK_LeftParen)); 273586d802e03a267af79663990c39865c67e0645238Douglas Gregor unsigned NumParams = FDecl? FDecl->getNumParams() : Proto->getNumArgs(); 273686d802e03a267af79663990c39865c67e0645238Douglas Gregor for (unsigned I = 0; I != NumParams; ++I) { 273786d802e03a267af79663990c39865c67e0645238Douglas Gregor if (I) 2738218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(Chunk(CodeCompletionString::CK_Comma)); 273986d802e03a267af79663990c39865c67e0645238Douglas Gregor 274086d802e03a267af79663990c39865c67e0645238Douglas Gregor std::string ArgString; 274186d802e03a267af79663990c39865c67e0645238Douglas Gregor QualType ArgType; 274286d802e03a267af79663990c39865c67e0645238Douglas Gregor 274386d802e03a267af79663990c39865c67e0645238Douglas Gregor if (FDecl) { 274486d802e03a267af79663990c39865c67e0645238Douglas Gregor ArgString = FDecl->getParamDecl(I)->getNameAsString(); 274586d802e03a267af79663990c39865c67e0645238Douglas Gregor ArgType = FDecl->getParamDecl(I)->getOriginalType(); 274686d802e03a267af79663990c39865c67e0645238Douglas Gregor } else { 274786d802e03a267af79663990c39865c67e0645238Douglas Gregor ArgType = Proto->getArgType(I); 274886d802e03a267af79663990c39865c67e0645238Douglas Gregor } 274986d802e03a267af79663990c39865c67e0645238Douglas Gregor 2750f85e193739c953358c865005855253af4f68a497John McCall ArgType.getAsStringInternal(ArgString, Policy); 275186d802e03a267af79663990c39865c67e0645238Douglas Gregor 275286d802e03a267af79663990c39865c67e0645238Douglas Gregor if (I == CurrentArg) 2753218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(Chunk(CodeCompletionString::CK_CurrentParameter, 2754dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.getAllocator().CopyString(ArgString))); 275586d802e03a267af79663990c39865c67e0645238Douglas Gregor else 2756dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTextChunk(Result.getAllocator().CopyString(ArgString)); 275786d802e03a267af79663990c39865c67e0645238Douglas Gregor } 275886d802e03a267af79663990c39865c67e0645238Douglas Gregor 275986d802e03a267af79663990c39865c67e0645238Douglas Gregor if (Proto && Proto->isVariadic()) { 2760218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(Chunk(CodeCompletionString::CK_Comma)); 276186d802e03a267af79663990c39865c67e0645238Douglas Gregor if (CurrentArg < NumParams) 2762218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddTextChunk("..."); 276386d802e03a267af79663990c39865c67e0645238Douglas Gregor else 2764218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(Chunk(CodeCompletionString::CK_CurrentParameter, "...")); 276586d802e03a267af79663990c39865c67e0645238Douglas Gregor } 2766218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(Chunk(CodeCompletionString::CK_RightParen)); 276786d802e03a267af79663990c39865c67e0645238Douglas Gregor 2768218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Result.TakeString(); 276986d802e03a267af79663990c39865c67e0645238Douglas Gregor} 277086d802e03a267af79663990c39865c67e0645238Douglas Gregor 27715f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerunsigned clang::getMacroUsagePriority(StringRef MacroName, 2772b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor const LangOptions &LangOpts, 27731827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor bool PreferredTypeIsPointer) { 27741827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor unsigned Priority = CCP_Macro; 27751827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor 2776b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor // Treat the "nil", "Nil" and "NULL" macros as null pointer constants. 2777b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor if (MacroName.equals("nil") || MacroName.equals("NULL") || 2778b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor MacroName.equals("Nil")) { 27791827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor Priority = CCP_Constant; 27801827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor if (PreferredTypeIsPointer) 27811827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor Priority = Priority / CCF_SimilarTypeMatch; 2782b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor } 2783b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor // Treat "YES", "NO", "true", and "false" as constants. 2784b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor else if (MacroName.equals("YES") || MacroName.equals("NO") || 2785b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor MacroName.equals("true") || MacroName.equals("false")) 2786b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor Priority = CCP_Constant; 2787b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor // Treat "bool" as a type. 2788b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor else if (MacroName.equals("bool")) 2789b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor Priority = CCP_Type + (LangOpts.ObjC1? CCD_bool_in_ObjC : 0); 2790b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor 27911827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor 27921827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor return Priority; 27931827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor} 27941827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor 2795e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas GregorCXCursorKind clang::getCursorKindForDecl(Decl *D) { 2796e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor if (!D) 2797e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor return CXCursor_UnexposedDecl; 2798e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor 2799e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor switch (D->getKind()) { 2800e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::Enum: return CXCursor_EnumDecl; 2801e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::EnumConstant: return CXCursor_EnumConstantDecl; 2802e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::Field: return CXCursor_FieldDecl; 2803e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::Function: 2804e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor return CXCursor_FunctionDecl; 2805e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::ObjCCategory: return CXCursor_ObjCCategoryDecl; 2806e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::ObjCCategoryImpl: return CXCursor_ObjCCategoryImplDecl; 2807e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::ObjCImplementation: return CXCursor_ObjCImplementationDecl; 2808375bb1413c041055262c8a416f20d10474a5eda9Douglas Gregor 2809c15707d8da08df2eb22f6ed047743fa3f7c9831bArgyrios Kyrtzidis case Decl::ObjCInterface: return CXCursor_ObjCInterfaceDecl; 2810e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::ObjCIvar: return CXCursor_ObjCIvarDecl; 2811e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::ObjCMethod: 2812e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor return cast<ObjCMethodDecl>(D)->isInstanceMethod() 2813e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor ? CXCursor_ObjCInstanceMethodDecl : CXCursor_ObjCClassMethodDecl; 2814e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::CXXMethod: return CXCursor_CXXMethod; 2815e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::CXXConstructor: return CXCursor_Constructor; 2816e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::CXXDestructor: return CXCursor_Destructor; 2817e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::CXXConversion: return CXCursor_ConversionFunction; 2818e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::ObjCProperty: return CXCursor_ObjCPropertyDecl; 2819c15707d8da08df2eb22f6ed047743fa3f7c9831bArgyrios Kyrtzidis case Decl::ObjCProtocol: return CXCursor_ObjCProtocolDecl; 2820e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::ParmVar: return CXCursor_ParmDecl; 2821e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::Typedef: return CXCursor_TypedefDecl; 2822162e1c1b487352434552147967c3dd296ebee2f7Richard Smith case Decl::TypeAlias: return CXCursor_TypeAliasDecl; 2823e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::Var: return CXCursor_VarDecl; 2824e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::Namespace: return CXCursor_Namespace; 2825e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::NamespaceAlias: return CXCursor_NamespaceAlias; 2826e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::TemplateTypeParm: return CXCursor_TemplateTypeParameter; 2827e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::NonTypeTemplateParm:return CXCursor_NonTypeTemplateParameter; 2828e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::TemplateTemplateParm:return CXCursor_TemplateTemplateParameter; 2829e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::FunctionTemplate: return CXCursor_FunctionTemplate; 2830e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::ClassTemplate: return CXCursor_ClassTemplate; 28312dfdb948bef51a601e763191e4becfe59880d382Argyrios Kyrtzidis case Decl::AccessSpec: return CXCursor_CXXAccessSpecifier; 2832e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::ClassTemplatePartialSpecialization: 2833e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor return CXCursor_ClassTemplatePartialSpecialization; 2834e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::UsingDirective: return CXCursor_UsingDirective; 2835e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor 2836e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::Using: 2837e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::UnresolvedUsingValue: 2838e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::UnresolvedUsingTypename: 2839e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor return CXCursor_UsingDeclaration; 2840e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor 2841352697a87bca664356f21a838b162084013625eaDouglas Gregor case Decl::ObjCPropertyImpl: 2842352697a87bca664356f21a838b162084013625eaDouglas Gregor switch (cast<ObjCPropertyImplDecl>(D)->getPropertyImplementation()) { 2843352697a87bca664356f21a838b162084013625eaDouglas Gregor case ObjCPropertyImplDecl::Dynamic: 2844352697a87bca664356f21a838b162084013625eaDouglas Gregor return CXCursor_ObjCDynamicDecl; 2845352697a87bca664356f21a838b162084013625eaDouglas Gregor 2846352697a87bca664356f21a838b162084013625eaDouglas Gregor case ObjCPropertyImplDecl::Synthesize: 2847352697a87bca664356f21a838b162084013625eaDouglas Gregor return CXCursor_ObjCSynthesizeDecl; 2848352697a87bca664356f21a838b162084013625eaDouglas Gregor } 2849352697a87bca664356f21a838b162084013625eaDouglas Gregor 2850e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor default: 2851e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor if (TagDecl *TD = dyn_cast<TagDecl>(D)) { 2852e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor switch (TD->getTagKind()) { 2853e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case TTK_Struct: return CXCursor_StructDecl; 2854e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case TTK_Class: return CXCursor_ClassDecl; 2855e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case TTK_Union: return CXCursor_UnionDecl; 2856e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case TTK_Enum: return CXCursor_EnumDecl; 2857e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor } 2858e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor } 2859e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor } 2860e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor 2861e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor return CXCursor_UnexposedDecl; 2862e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor} 2863e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor 2864590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregorstatic void AddMacroResults(Preprocessor &PP, ResultBuilder &Results, 2865590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregor bool TargetTypeIsPointer = false) { 28660a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 2867590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregor 28683f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor Results.EnterNewScope(); 2869c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor 28700c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor for (Preprocessor::macro_iterator M = PP.macro_begin(), 28710c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor MEnd = PP.macro_end(); 2872590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregor M != MEnd; ++M) { 28731827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor Results.AddResult(Result(M->first, 28741827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor getMacroUsagePriority(M->first->getName(), 2875b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor PP.getLangOptions(), 28761827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor TargetTypeIsPointer))); 2877590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregor } 2878c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor 28793f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor Results.ExitScope(); 2880c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor 28813f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor} 28823f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor 2883aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregorstatic void AddPrettyFunctionResults(const LangOptions &LangOpts, 2884aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor ResultBuilder &Results) { 28850a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 2886aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor 2887aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor Results.EnterNewScope(); 2888c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor 2889aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor Results.AddResult(Result("__PRETTY_FUNCTION__", CCP_Constant)); 2890aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor Results.AddResult(Result("__FUNCTION__", CCP_Constant)); 2891aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor if (LangOpts.C99 || LangOpts.CPlusPlus0x) 2892aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor Results.AddResult(Result("__func__", CCP_Constant)); 2893aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor Results.ExitScope(); 2894aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor} 2895aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor 28963a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbarstatic void HandleCodeCompleteResults(Sema *S, 28973a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar CodeCompleteConsumer *CodeCompleter, 2898e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext Context, 28990a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall CodeCompletionResult *Results, 2900e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor unsigned NumResults) { 290186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (CodeCompleter) 2902e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompleter->ProcessCodeCompleteResults(*S, Context, Results, NumResults); 290386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 290486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 2905e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregorstatic enum CodeCompletionContext::Kind mapCodeCompletionContext(Sema &S, 2906e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Sema::ParserCompletionContext PCC) { 2907e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor switch (PCC) { 2908f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Namespace: 2909e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor return CodeCompletionContext::CCC_TopLevel; 2910e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor 2911f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Class: 2912e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor return CodeCompletionContext::CCC_ClassStructUnion; 2913e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor 2914f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ObjCInterface: 2915e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor return CodeCompletionContext::CCC_ObjCInterface; 2916e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor 2917f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ObjCImplementation: 2918e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor return CodeCompletionContext::CCC_ObjCImplementation; 2919e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor 2920f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ObjCInstanceVariableList: 2921e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor return CodeCompletionContext::CCC_ObjCIvarList; 2922e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor 2923f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Template: 2924f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_MemberTemplate: 292552779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor if (S.CurContext->isFileContext()) 292652779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor return CodeCompletionContext::CCC_TopLevel; 29277530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie if (S.CurContext->isRecord()) 292852779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor return CodeCompletionContext::CCC_ClassStructUnion; 29297530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie return CodeCompletionContext::CCC_Other; 293052779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor 2931f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_RecoveryInFunction: 293252779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor return CodeCompletionContext::CCC_Recovery; 2933a5450a097e83072c0e545ccd8df8b07e172f1b09Douglas Gregor 2934f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ForInit: 2935a5450a097e83072c0e545ccd8df8b07e172f1b09Douglas Gregor if (S.getLangOptions().CPlusPlus || S.getLangOptions().C99 || 2936a5450a097e83072c0e545ccd8df8b07e172f1b09Douglas Gregor S.getLangOptions().ObjC1) 2937a5450a097e83072c0e545ccd8df8b07e172f1b09Douglas Gregor return CodeCompletionContext::CCC_ParenthesizedExpression; 2938a5450a097e83072c0e545ccd8df8b07e172f1b09Douglas Gregor else 2939a5450a097e83072c0e545ccd8df8b07e172f1b09Douglas Gregor return CodeCompletionContext::CCC_Expression; 2940a5450a097e83072c0e545ccd8df8b07e172f1b09Douglas Gregor 2941a5450a097e83072c0e545ccd8df8b07e172f1b09Douglas Gregor case Sema::PCC_Expression: 2942f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Condition: 2943e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor return CodeCompletionContext::CCC_Expression; 2944e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor 2945f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Statement: 2946e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor return CodeCompletionContext::CCC_Statement; 294772db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor 2948f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Type: 294972db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor return CodeCompletionContext::CCC_Type; 29500268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor 29510268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor case Sema::PCC_ParenthesizedExpression: 29520268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor return CodeCompletionContext::CCC_ParenthesizedExpression; 295368e3c2eef52701a178fbcc2bb424f31dd4b36931Douglas Gregor 295468e3c2eef52701a178fbcc2bb424f31dd4b36931Douglas Gregor case Sema::PCC_LocalDeclarationSpecifiers: 295568e3c2eef52701a178fbcc2bb424f31dd4b36931Douglas Gregor return CodeCompletionContext::CCC_Type; 2956e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor } 29577530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie 29587530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie llvm_unreachable("Invalid ParserCompletionContext!"); 2959e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor} 2960e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor 2961f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor/// \brief If we're in a C++ virtual member function, add completion results 2962f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor/// that invoke the functions we override, since it's common to invoke the 2963f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor/// overridden function as well as adding new functionality. 2964f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor/// 2965f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor/// \param S The semantic analysis object for which we are generating results. 2966f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor/// 2967f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor/// \param InContext This context in which the nested-name-specifier preceding 2968f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor/// the code-completion point 2969f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregorstatic void MaybeAddOverrideCalls(Sema &S, DeclContext *InContext, 2970f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor ResultBuilder &Results) { 2971f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor // Look through blocks. 2972f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor DeclContext *CurContext = S.CurContext; 2973f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor while (isa<BlockDecl>(CurContext)) 2974f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor CurContext = CurContext->getParent(); 2975f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor 2976f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor 2977f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(CurContext); 2978f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor if (!Method || !Method->isVirtual()) 2979f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor return; 2980f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor 2981f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor // We need to have names for all of the parameters, if we're going to 2982f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor // generate a forwarding call. 2983f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor for (CXXMethodDecl::param_iterator P = Method->param_begin(), 2984f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor PEnd = Method->param_end(); 2985f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor P != PEnd; 2986f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor ++P) { 2987f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor if (!(*P)->getDeclName()) 2988f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor return; 2989f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor } 2990f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor 29918987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor PrintingPolicy Policy = getCompletionPrintingPolicy(S); 2992f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor for (CXXMethodDecl::method_iterator M = Method->begin_overridden_methods(), 2993f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor MEnd = Method->end_overridden_methods(); 2994f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor M != MEnd; ++M) { 2995218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder Builder(Results.getAllocator()); 2996f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor CXXMethodDecl *Overridden = const_cast<CXXMethodDecl *>(*M); 2997f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor if (Overridden->getCanonicalDecl() == Method->getCanonicalDecl()) 2998f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor continue; 2999f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor 3000f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor // If we need a nested-name-specifier, add one now. 3001f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor if (!InContext) { 3002f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor NestedNameSpecifier *NNS 3003f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor = getRequiredQualification(S.Context, CurContext, 3004f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor Overridden->getDeclContext()); 3005f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor if (NNS) { 3006f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor std::string Str; 3007f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor llvm::raw_string_ostream OS(Str); 30088987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor NNS->print(OS, Policy); 3009dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddTextChunk(Results.getAllocator().CopyString(OS.str())); 3010f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor } 3011f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor } else if (!InContext->Equals(Overridden->getDeclContext())) 3012f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor continue; 3013f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor 3014dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddTypedTextChunk(Results.getAllocator().CopyString( 3015218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Overridden->getNameAsString())); 3016218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 3017f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor bool FirstParam = true; 3018f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor for (CXXMethodDecl::param_iterator P = Method->param_begin(), 3019f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor PEnd = Method->param_end(); 3020f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor P != PEnd; ++P) { 3021f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor if (FirstParam) 3022f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor FirstParam = false; 3023f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor else 3024218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_Comma); 3025f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor 3026dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddPlaceholderChunk(Results.getAllocator().CopyString( 3027218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor (*P)->getIdentifier()->getName())); 3028f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor } 3029218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 3030218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(CodeCompletionResult(Builder.TakeString(), 3031f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor CCP_SuperCompletion, 3032f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor CXCursor_CXXMethod)); 3033f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor Results.Ignore(Overridden); 3034f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor } 3035f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor} 3036f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor 3037c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregorvoid Sema::CodeCompleteModuleImport(SourceLocation ImportLoc, 3038c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor ModuleIdPath Path) { 3039c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor typedef CodeCompletionResult Result; 3040c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 3041c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor CodeCompletionContext::CCC_Other); 3042c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor Results.EnterNewScope(); 3043c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor 3044c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor CodeCompletionAllocator &Allocator = Results.getAllocator(); 3045c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor CodeCompletionBuilder Builder(Allocator); 3046c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor typedef CodeCompletionResult Result; 3047c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor if (Path.empty()) { 3048c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor // Enumerate all top-level modules. 3049c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor llvm::SmallVector<Module *, 8> Modules; 3050c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor PP.getHeaderSearchInfo().collectAllModules(Modules); 3051c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor for (unsigned I = 0, N = Modules.size(); I != N; ++I) { 3052c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor Builder.AddTypedTextChunk( 3053c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor Builder.getAllocator().CopyString(Modules[I]->Name)); 3054c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor Results.AddResult(Result(Builder.TakeString(), 3055c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor CCP_Declaration, 3056c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor CXCursor_NotImplemented, 3057c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor Modules[I]->isAvailable() 3058c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor ? CXAvailability_Available 3059c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor : CXAvailability_NotAvailable)); 3060c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor } 3061c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor } else { 3062c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor // Load the named module. 3063c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor Module *Mod = PP.getModuleLoader().loadModule(ImportLoc, Path, 3064c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor Module::AllVisible, 3065c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor /*IsInclusionDirective=*/false); 3066c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor // Enumerate submodules. 3067c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor if (Mod) { 3068c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor for (Module::submodule_iterator Sub = Mod->submodule_begin(), 3069c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor SubEnd = Mod->submodule_end(); 3070c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor Sub != SubEnd; ++Sub) { 3071c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor 3072c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor Builder.AddTypedTextChunk( 3073c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor Builder.getAllocator().CopyString((*Sub)->Name)); 3074c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor Results.AddResult(Result(Builder.TakeString(), 3075c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor CCP_Declaration, 3076c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor CXCursor_NotImplemented, 3077c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor (*Sub)->isAvailable() 3078c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor ? CXAvailability_Available 3079c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor : CXAvailability_NotAvailable)); 3080c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor } 3081c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor } 3082c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor } 3083c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor Results.ExitScope(); 3084c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 3085c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor Results.data(),Results.size()); 3086c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor} 3087c5b2e58840748145d1706c1d1481369d1863fabfDouglas Gregor 308801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregorvoid Sema::CodeCompleteOrdinaryName(Scope *S, 3089e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor ParserCompletionContext CompletionContext) { 30900a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 3091218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 309252779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor mapCodeCompletionContext(*this, CompletionContext)); 3093f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor Results.EnterNewScope(); 3094cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor 309501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Determine how to filter results, e.g., so that the names of 309601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // values (functions, enumerators, function templates, etc.) are 309701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // only allowed where we can have an expression. 309801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor switch (CompletionContext) { 3099e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_Namespace: 3100e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_Class: 3101e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_ObjCInterface: 3102e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_ObjCImplementation: 3103e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_ObjCInstanceVariableList: 3104e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_Template: 3105e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_MemberTemplate: 310672db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_Type: 310768e3c2eef52701a178fbcc2bb424f31dd4b36931Douglas Gregor case PCC_LocalDeclarationSpecifiers: 310801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Results.setFilter(&ResultBuilder::IsOrdinaryNonValueName); 310901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 311001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 3111e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_Statement: 31120268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor case PCC_ParenthesizedExpression: 3113eb0d0145910f3024d9bdefe279a1e9b95495f2fdDouglas Gregor case PCC_Expression: 3114e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_ForInit: 3115e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_Condition: 31164710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor if (WantTypesInContext(CompletionContext, getLangOptions())) 31174710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor Results.setFilter(&ResultBuilder::IsOrdinaryName); 31184710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor else 31194710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor Results.setFilter(&ResultBuilder::IsOrdinaryNonTypeName); 3120f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor 3121f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor if (getLangOptions().CPlusPlus) 3122f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor MaybeAddOverrideCalls(*this, /*InContext=*/0, Results); 312301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 3124dc8453422bec3bbf70c03920e01498d75783d122Douglas Gregor 3125e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_RecoveryInFunction: 3126dc8453422bec3bbf70c03920e01498d75783d122Douglas Gregor // Unfiltered 3127dc8453422bec3bbf70c03920e01498d75783d122Douglas Gregor break; 312801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 312901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 31303cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor // If we are in a C++ non-static member function, check the qualifiers on 31313cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor // the member function to filter/prioritize the results list. 31323cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor if (CXXMethodDecl *CurMethod = dyn_cast<CXXMethodDecl>(CurContext)) 31333cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor if (CurMethod->isInstance()) 31343cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor Results.setObjectTypeQualifiers( 31353cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor Qualifiers::fromCVRMask(CurMethod->getTypeQualifiers())); 31363cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor 31371ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 31388071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 31398071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompleter->includeGlobals()); 31402a7925c4abe45650f3ab27be09468e3a3a98084aDouglas Gregor 3141bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddOrdinaryNameResults(CompletionContext, S, *this, Results); 31422a7925c4abe45650f3ab27be09468e3a3a98084aDouglas Gregor Results.ExitScope(); 31432a7925c4abe45650f3ab27be09468e3a3a98084aDouglas Gregor 3144aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor switch (CompletionContext) { 31450268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor case PCC_ParenthesizedExpression: 314672db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_Expression: 314772db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_Statement: 314872db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_RecoveryInFunction: 314972db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor if (S->getFnParent()) 315072db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor AddPrettyFunctionResults(PP.getLangOptions(), Results); 315172db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor break; 315272db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor 315372db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_Namespace: 315472db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_Class: 315572db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_ObjCInterface: 315672db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_ObjCImplementation: 315772db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_ObjCInstanceVariableList: 315872db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_Template: 315972db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_MemberTemplate: 316072db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_ForInit: 316172db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_Condition: 316272db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_Type: 316368e3c2eef52701a178fbcc2bb424f31dd4b36931Douglas Gregor case PCC_LocalDeclarationSpecifiers: 316472db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor break; 3165aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor } 3166aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor 31670c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor if (CodeCompleter->includeMacros()) 3168bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddMacroResults(PP, Results); 3169aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor 3170cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 3171e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 3172791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor} 3173791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor 3174c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregorstatic void AddClassMessageCompletions(Sema &SemaRef, Scope *S, 3175c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor ParsedType Receiver, 3176c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor IdentifierInfo **SelIdents, 3177c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor unsigned NumSelIdents, 317870c5ac70ace21b011dc2d4001bae26cdcf62ff8dDouglas Gregor bool AtArgumentExpression, 3179c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor bool IsSuper, 3180c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor ResultBuilder &Results); 3181c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor 3182c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregorvoid Sema::CodeCompleteDeclSpec(Scope *S, DeclSpec &DS, 3183c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor bool AllowNonIdentifiers, 3184c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor bool AllowNestedNameSpecifiers) { 31850a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 3186218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 318752779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor AllowNestedNameSpecifiers 318852779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor ? CodeCompletionContext::CCC_PotentiallyQualifiedName 318952779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor : CodeCompletionContext::CCC_Name); 31902ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor Results.EnterNewScope(); 31912ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor 31922ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor // Type qualifiers can come after names. 31932ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor Results.AddResult(Result("const")); 31942ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor Results.AddResult(Result("volatile")); 31952ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor if (getLangOptions().C99) 31962ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor Results.AddResult(Result("restrict")); 31972ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor 31982ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor if (getLangOptions().CPlusPlus) { 31992ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor if (AllowNonIdentifiers) { 32002ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor Results.AddResult(Result("operator")); 32012ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor } 32022ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor 32032ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor // Add nested-name-specifiers. 32042ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor if (AllowNestedNameSpecifiers) { 32052ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor Results.allowNestedNameSpecifiers(); 320652779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor Results.setFilter(&ResultBuilder::IsImpossibleToSatisfy); 32072ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 32082ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor LookupVisibleDecls(S, LookupNestedNameSpecifierName, Consumer, 32092ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor CodeCompleter->includeGlobals()); 321052779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor Results.setFilter(0); 32112ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor } 32122ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor } 32132ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor Results.ExitScope(); 32142ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor 3215c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor // If we're in a context where we might have an expression (rather than a 3216c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor // declaration), and what we've seen so far is an Objective-C type that could 3217c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor // be a receiver of a class message, this may be a class message send with 3218c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor // the initial opening bracket '[' missing. Add appropriate completions. 3219c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor if (AllowNonIdentifiers && !AllowNestedNameSpecifiers && 3220c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor DS.getTypeSpecType() == DeclSpec::TST_typename && 3221c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor DS.getStorageClassSpecAsWritten() == DeclSpec::SCS_unspecified && 3222c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor !DS.isThreadSpecified() && !DS.isExternInLinkageSpec() && 3223c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor DS.getTypeSpecComplex() == DeclSpec::TSC_unspecified && 3224c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor DS.getTypeSpecSign() == DeclSpec::TSS_unspecified && 3225c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor DS.getTypeQualifiers() == 0 && 3226c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor S && 3227c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor (S->getFlags() & Scope::DeclScope) != 0 && 3228c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor (S->getFlags() & (Scope::ClassScope | Scope::TemplateParamScope | 3229c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor Scope::FunctionPrototypeScope | 3230c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor Scope::AtCatchScope)) == 0) { 3231c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor ParsedType T = DS.getRepAsType(); 3232c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor if (!T.get().isNull() && T.get()->isObjCObjectOrInterfaceType()) 323370c5ac70ace21b011dc2d4001bae26cdcf62ff8dDouglas Gregor AddClassMessageCompletions(*this, S, T, 0, 0, false, false, Results); 3234c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor } 3235c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor 32364497dd49f78eb5e1a7c3f19d1a13564f79e12341Douglas Gregor // Note that we intentionally suppress macro results here, since we do not 32374497dd49f78eb5e1a7c3f19d1a13564f79e12341Douglas Gregor // encourage using macros to produce the names of entities. 32384497dd49f78eb5e1a7c3f19d1a13564f79e12341Douglas Gregor 323952779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 324052779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor Results.getCompletionContext(), 32412ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor Results.data(), Results.size()); 32422ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor} 32432ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor 3244fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregorstruct Sema::CodeCompleteExpressionData { 3245fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor CodeCompleteExpressionData(QualType PreferredType = QualType()) 3246fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor : PreferredType(PreferredType), IntegralConstantExpression(false), 3247fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor ObjCCollection(false) { } 3248fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor 3249fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor QualType PreferredType; 3250fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor bool IntegralConstantExpression; 3251fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor bool ObjCCollection; 32525f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<Decl *, 4> IgnoreDecls; 3253fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor}; 3254fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor 32555ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor/// \brief Perform code-completion in an expression context when we know what 32565ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor/// type we're looking for. 3257f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor/// 3258f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor/// \param IntegralConstantExpression Only permit integral constant 3259f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor/// expressions. 3260fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregorvoid Sema::CodeCompleteExpression(Scope *S, 3261fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor const CodeCompleteExpressionData &Data) { 32620a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 3263218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 3264218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Expression); 3265fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor if (Data.ObjCCollection) 3266fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor Results.setFilter(&ResultBuilder::IsObjCCollection); 3267fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor else if (Data.IntegralConstantExpression) 3268f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor Results.setFilter(&ResultBuilder::IsIntegralConstantValue); 3269e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor else if (WantTypesInContext(PCC_Expression, getLangOptions())) 32705ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor Results.setFilter(&ResultBuilder::IsOrdinaryName); 32715ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor else 32725ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor Results.setFilter(&ResultBuilder::IsOrdinaryNonTypeName); 3273fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor 3274fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor if (!Data.PreferredType.isNull()) 3275fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor Results.setPreferredType(Data.PreferredType.getNonReferenceType()); 3276fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor 3277fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor // Ignore any declarations that we were told that we don't care about. 3278fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor for (unsigned I = 0, N = Data.IgnoreDecls.size(); I != N; ++I) 3279fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor Results.Ignore(Data.IgnoreDecls[I]); 32805ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 32815ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 32828071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 32838071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompleter->includeGlobals()); 32845ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 32855ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor Results.EnterNewScope(); 3286e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor AddOrdinaryNameResults(PCC_Expression, S, *this, Results); 32875ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor Results.ExitScope(); 32885ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 3289590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregor bool PreferredTypeIsPointer = false; 3290fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor if (!Data.PreferredType.isNull()) 3291fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor PreferredTypeIsPointer = Data.PreferredType->isAnyPointerType() 3292fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor || Data.PreferredType->isMemberPointerType() 3293fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor || Data.PreferredType->isBlockPointerType(); 3294590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregor 3295aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor if (S->getFnParent() && 3296aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor !Data.ObjCCollection && 3297aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor !Data.IntegralConstantExpression) 3298aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor AddPrettyFunctionResults(PP.getLangOptions(), Results); 3299aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor 33005ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (CodeCompleter->includeMacros()) 3301590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregor AddMacroResults(PP, Results, PreferredTypeIsPointer); 3302e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 3303fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor CodeCompletionContext(CodeCompletionContext::CCC_Expression, 3304fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor Data.PreferredType), 3305e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 33065ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor} 33075ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 3308ac5fd8404fa8ecfae28be76f98fd0d926350354cDouglas Gregorvoid Sema::CodeCompletePostfixExpression(Scope *S, ExprResult E) { 3309ac5fd8404fa8ecfae28be76f98fd0d926350354cDouglas Gregor if (E.isInvalid()) 3310ac5fd8404fa8ecfae28be76f98fd0d926350354cDouglas Gregor CodeCompleteOrdinaryName(S, PCC_RecoveryInFunction); 3311ac5fd8404fa8ecfae28be76f98fd0d926350354cDouglas Gregor else if (getLangOptions().ObjC1) 3312ac5fd8404fa8ecfae28be76f98fd0d926350354cDouglas Gregor CodeCompleteObjCInstanceMessage(S, E.take(), 0, 0, false); 331378edf515544f0b9dddf69d6c1678fd83e94d8352Douglas Gregor} 33145ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 33157344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor/// \brief The set of properties that have already been added, referenced by 33167344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor/// property name. 33177344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregortypedef llvm::SmallPtrSet<IdentifierInfo*, 16> AddedPropertiesSet; 33187344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor 331995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregorstatic void AddObjCProperties(ObjCContainerDecl *Container, 3320322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor bool AllowCategories, 33214b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor bool AllowNullaryMethods, 332295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor DeclContext *CurContext, 33237344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor AddedPropertiesSet &AddedProperties, 332495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor ResultBuilder &Results) { 33250a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 332695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 332795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Add properties in this container. 332895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor for (ObjCContainerDecl::prop_iterator P = Container->prop_begin(), 332995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor PEnd = Container->prop_end(); 333095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor P != PEnd; 33317344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor ++P) { 33327344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor if (AddedProperties.insert(P->getIdentifier())) 33337344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor Results.MaybeAddResult(Result(*P, 0), CurContext); 33347344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor } 333595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 33364b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor // Add nullary methods 33374b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor if (AllowNullaryMethods) { 33384b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor ASTContext &Context = Container->getASTContext(); 33398987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor PrintingPolicy Policy = getCompletionPrintingPolicy(Results.getSema()); 33404b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor for (ObjCContainerDecl::method_iterator M = Container->meth_begin(), 33414b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor MEnd = Container->meth_end(); 33424b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor M != MEnd; ++M) { 33434b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor if (M->getSelector().isUnarySelector()) 33444b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor if (IdentifierInfo *Name = M->getSelector().getIdentifierInfoForSlot(0)) 33454b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor if (AddedProperties.insert(Name)) { 33464b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor CodeCompletionBuilder Builder(Results.getAllocator()); 33478987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor AddResultTypeChunk(Context, Policy, *M, Builder); 33484b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor Builder.AddTypedTextChunk( 33494b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor Results.getAllocator().CopyString(Name->getName())); 33504b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor 33514b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor CXAvailabilityKind Availability = CXAvailability_Available; 33524b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor switch (M->getAvailability()) { 33534b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor case AR_Available: 33544b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor case AR_NotYetIntroduced: 33554b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor Availability = CXAvailability_Available; 33564b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor break; 33574b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor 33584b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor case AR_Deprecated: 33594b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor Availability = CXAvailability_Deprecated; 33604b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor break; 33614b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor 33624b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor case AR_Unavailable: 33634b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor Availability = CXAvailability_NotAvailable; 33644b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor break; 33654b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor } 33664b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor 33674b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor Results.MaybeAddResult(Result(Builder.TakeString(), 33684b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor CCP_MemberDeclaration + CCD_MethodAsProperty, 33694b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor M->isInstanceMethod() 33704b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor ? CXCursor_ObjCInstanceMethodDecl 33714b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor : CXCursor_ObjCClassMethodDecl, 33724b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor Availability), 33734b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor CurContext); 33744b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor } 33754b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor } 33764b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor } 33774b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor 33784b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor 337995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Add properties in referenced protocols. 338095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) { 338195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor for (ObjCProtocolDecl::protocol_iterator P = Protocol->protocol_begin(), 338295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor PEnd = Protocol->protocol_end(); 338395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor P != PEnd; ++P) 33844b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddObjCProperties(*P, AllowCategories, AllowNullaryMethods, CurContext, 33854b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddedProperties, Results); 338695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } else if (ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container)){ 3387322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor if (AllowCategories) { 3388322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Look through categories. 3389322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor for (ObjCCategoryDecl *Category = IFace->getCategoryList(); 3390322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Category; Category = Category->getNextClassCategory()) 33914b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddObjCProperties(Category, AllowCategories, AllowNullaryMethods, 33924b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor CurContext, AddedProperties, Results); 3393322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor } 339495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 339595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Look through protocols. 339653b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek for (ObjCInterfaceDecl::all_protocol_iterator 339753b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek I = IFace->all_referenced_protocol_begin(), 339853b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek E = IFace->all_referenced_protocol_end(); I != E; ++I) 33994b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddObjCProperties(*I, AllowCategories, AllowNullaryMethods, CurContext, 34004b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddedProperties, Results); 340195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 340295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Look in the superclass. 340395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (IFace->getSuperClass()) 34044b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddObjCProperties(IFace->getSuperClass(), AllowCategories, 34054b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AllowNullaryMethods, CurContext, 34067344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor AddedProperties, Results); 340795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } else if (const ObjCCategoryDecl *Category 340895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor = dyn_cast<ObjCCategoryDecl>(Container)) { 340995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Look through protocols. 341053b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek for (ObjCCategoryDecl::protocol_iterator P = Category->protocol_begin(), 341153b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek PEnd = Category->protocol_end(); 341295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor P != PEnd; ++P) 34134b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddObjCProperties(*P, AllowCategories, AllowNullaryMethods, CurContext, 34144b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddedProperties, Results); 341595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } 341695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor} 341795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 3418f5cd27d7eef3fd4021545dd76a1faf7152fda344Douglas Gregorvoid Sema::CodeCompleteMemberReferenceExpr(Scope *S, Expr *Base, 341981b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor SourceLocation OpLoc, 342081b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor bool IsArrow) { 3421f5cd27d7eef3fd4021545dd76a1faf7152fda344Douglas Gregor if (!Base || !CodeCompleter) 342281b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor return; 342381b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor 3424f5cd27d7eef3fd4021545dd76a1faf7152fda344Douglas Gregor ExprResult ConvertedBase = PerformMemberExprBaseConversion(Base, IsArrow); 3425f5cd27d7eef3fd4021545dd76a1faf7152fda344Douglas Gregor if (ConvertedBase.isInvalid()) 3426f5cd27d7eef3fd4021545dd76a1faf7152fda344Douglas Gregor return; 3427f5cd27d7eef3fd4021545dd76a1faf7152fda344Douglas Gregor Base = ConvertedBase.get(); 3428f5cd27d7eef3fd4021545dd76a1faf7152fda344Douglas Gregor 34290a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 343086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 343181b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor QualType BaseType = Base->getType(); 343286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 343386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (IsArrow) { 343486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (const PointerType *Ptr = BaseType->getAs<PointerType>()) 343586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor BaseType = Ptr->getPointeeType(); 343686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor else if (BaseType->isObjCObjectPointerType()) 34373cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor /*Do nothing*/ ; 343886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor else 343986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return; 344086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 344186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 34423da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor enum CodeCompletionContext::Kind contextKind; 34433da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor 34443da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor if (IsArrow) { 34453da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contextKind = CodeCompletionContext::CCC_ArrowMemberAccess; 34463da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 34473da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor else { 34483da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor if (BaseType->isObjCObjectPointerType() || 34493da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor BaseType->isObjCObjectOrInterfaceType()) { 34503da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contextKind = CodeCompletionContext::CCC_ObjCPropertyAccess; 34513da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 34523da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor else { 34533da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contextKind = CodeCompletionContext::CCC_DotMemberAccess; 34543da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 34553da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 34563da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor 3457218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 34583da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CodeCompletionContext(contextKind, 345952779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor BaseType), 346052779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor &ResultBuilder::IsMember); 346195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor Results.EnterNewScope(); 346295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (const RecordType *Record = BaseType->getAs<RecordType>()) { 34633cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor // Indicate that we are performing a member access, and the cv-qualifiers 34643cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor // for the base object type. 34653cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor Results.setObjectTypeQualifiers(BaseType.getQualifiers()); 34663cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor 346795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Access to a C/C++ class, struct, or union. 346845bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor Results.allowNestedNameSpecifiers(); 34690cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 34708071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(Record->getDecl(), LookupMemberName, Consumer, 34718071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompleter->includeGlobals()); 34723a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar 347395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (getLangOptions().CPlusPlus) { 347495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (!Results.empty()) { 347595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // The "template" keyword can follow "->" or "." in the grammar. 347695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // However, we only want to suggest the template keyword if something 347795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // is dependent. 347895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor bool IsDependent = BaseType->isDependentType(); 347995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (!IsDependent) { 348095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor for (Scope *DepScope = S; DepScope; DepScope = DepScope->getParent()) 348195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (DeclContext *Ctx = (DeclContext *)DepScope->getEntity()) { 348295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor IsDependent = Ctx->isDependentContext(); 348395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor break; 348495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } 348595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } 34863a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar 348795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (IsDependent) 3488a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("template")); 348986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 349095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } 349195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } else if (!IsArrow && BaseType->getAsObjCInterfacePointerType()) { 349295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Objective-C property reference. 34937344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor AddedPropertiesSet AddedProperties; 349495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 349595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Add property results based on our interface. 349695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor const ObjCObjectPointerType *ObjCPtr 349795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor = BaseType->getAsObjCInterfacePointerType(); 349895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor assert(ObjCPtr && "Non-NULL pointer guaranteed above!"); 34994b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddObjCProperties(ObjCPtr->getInterfaceDecl(), true, 35004b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor /*AllowNullaryMethods=*/true, CurContext, 35017344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor AddedProperties, Results); 350295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 350395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Add properties from the protocols in a qualified interface. 350495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor for (ObjCObjectPointerType::qual_iterator I = ObjCPtr->qual_begin(), 350595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor E = ObjCPtr->qual_end(); 350695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor I != E; ++I) 35074b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddObjCProperties(*I, true, /*AllowNullaryMethods=*/true, CurContext, 35084b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddedProperties, Results); 350995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } else if ((IsArrow && BaseType->isObjCObjectPointerType()) || 3510c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall (!IsArrow && BaseType->isObjCObjectType())) { 351195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Objective-C instance variable access. 351295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor ObjCInterfaceDecl *Class = 0; 351395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (const ObjCObjectPointerType *ObjCPtr 351495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor = BaseType->getAs<ObjCObjectPointerType>()) 351595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor Class = ObjCPtr->getInterfaceDecl(); 351695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor else 3517c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall Class = BaseType->getAs<ObjCObjectType>()->getInterface(); 351895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 351995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Add all ivars from this class and its superclasses. 352080f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor if (Class) { 352180f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 352280f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor Results.setFilter(&ResultBuilder::IsObjCIvar); 35238071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(Class, LookupMemberName, Consumer, 35248071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompleter->includeGlobals()); 352586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 352686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 352795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 352895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // FIXME: How do we cope with isa? 352995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 353095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor Results.ExitScope(); 35313a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar 35323a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar // Hand off the results found for code completion. 3533e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 353452779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor Results.getCompletionContext(), 3535e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 353681b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor} 353781b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor 3538374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregorvoid Sema::CodeCompleteTag(Scope *S, unsigned TagSpec) { 3539374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor if (!CodeCompleter) 3540374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor return; 3541374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor 35420a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 354386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ResultBuilder::LookupFilter Filter = 0; 3544e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor enum CodeCompletionContext::Kind ContextKind 3545e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor = CodeCompletionContext::CCC_Other; 3546374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor switch ((DeclSpec::TST)TagSpec) { 3547374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor case DeclSpec::TST_enum: 354886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Filter = &ResultBuilder::IsEnum; 3549e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor ContextKind = CodeCompletionContext::CCC_EnumTag; 3550374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor break; 3551374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor 3552374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor case DeclSpec::TST_union: 355386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Filter = &ResultBuilder::IsUnion; 3554e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor ContextKind = CodeCompletionContext::CCC_UnionTag; 3555374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor break; 3556374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor 3557374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor case DeclSpec::TST_struct: 3558374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor case DeclSpec::TST_class: 355986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Filter = &ResultBuilder::IsClassOrStruct; 3560e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor ContextKind = CodeCompletionContext::CCC_ClassOrStructTag; 3561374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor break; 3562374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor 3563374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor default: 3564b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("Unknown type specifier kind in CodeCompleteTag"); 3565374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor } 356686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 3567218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), ContextKind); 35685d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 35690d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCall 35700d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCall // First pass: look for tags. 35710d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCall Results.setFilter(Filter); 35728071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(S, LookupTagName, Consumer, 35738071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompleter->includeGlobals()); 35740d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCall 35758071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor if (CodeCompleter->includeGlobals()) { 35768071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor // Second pass: look for nested name specifiers. 35778071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor Results.setFilter(&ResultBuilder::IsNestedNameSpecifier); 35788071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(S, LookupNestedNameSpecifierName, Consumer); 35798071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor } 358086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 358152779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 3582e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 3583374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor} 3584374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor 35851a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregorvoid Sema::CodeCompleteTypeQualifiers(DeclSpec &DS) { 3586218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 3587218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_TypeQualifiers); 35881a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor Results.EnterNewScope(); 35891a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor if (!(DS.getTypeQualifiers() & DeclSpec::TQ_const)) 35901a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor Results.AddResult("const"); 35911a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor if (!(DS.getTypeQualifiers() & DeclSpec::TQ_volatile)) 35921a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor Results.AddResult("volatile"); 35931a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor if (getLangOptions().C99 && 35941a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor !(DS.getTypeQualifiers() & DeclSpec::TQ_restrict)) 35951a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor Results.AddResult("restrict"); 35961a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor Results.ExitScope(); 35971a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 359852779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor Results.getCompletionContext(), 35991a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor Results.data(), Results.size()); 36001a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor} 36011a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor 36023e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregorvoid Sema::CodeCompleteCase(Scope *S) { 3603781472fe99a120098c631b0cbe33c89f8cef5e70John McCall if (getCurFunction()->SwitchStack.empty() || !CodeCompleter) 36043e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor return; 3605a8e0cd8cdecc7e0ba1792e46773b884c6eed4829John McCall 3606781472fe99a120098c631b0cbe33c89f8cef5e70John McCall SwitchStmt *Switch = getCurFunction()->SwitchStack.back(); 3607a8e0cd8cdecc7e0ba1792e46773b884c6eed4829John McCall QualType type = Switch->getCond()->IgnoreImplicit()->getType(); 3608a8e0cd8cdecc7e0ba1792e46773b884c6eed4829John McCall if (!type->isEnumeralType()) { 3609a8e0cd8cdecc7e0ba1792e46773b884c6eed4829John McCall CodeCompleteExpressionData Data(type); 3610fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor Data.IntegralConstantExpression = true; 3611fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor CodeCompleteExpression(S, Data); 36123e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor return; 3613f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor } 36143e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 36153e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // Code-complete the cases of a switch statement over an enumeration type 36163e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // by providing the list of 3617a8e0cd8cdecc7e0ba1792e46773b884c6eed4829John McCall EnumDecl *Enum = type->castAs<EnumType>()->getDecl(); 36183e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 36193e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // Determine which enumerators we have already seen in the switch statement. 36203e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // FIXME: Ideally, we would also be able to look *past* the code-completion 36213e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // token, in case we are code-completing in the middle of the switch and not 36223e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // at the end. However, we aren't able to do so at the moment. 36233e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor llvm::SmallPtrSet<EnumConstantDecl *, 8> EnumeratorsSeen; 3624b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor NestedNameSpecifier *Qualifier = 0; 36253e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor for (SwitchCase *SC = Switch->getSwitchCaseList(); SC; 36263e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor SC = SC->getNextSwitchCase()) { 36273e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor CaseStmt *Case = dyn_cast<CaseStmt>(SC); 36283e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor if (!Case) 36293e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor continue; 36303e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 36313e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor Expr *CaseVal = Case->getLHS()->IgnoreParenCasts(); 36323e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(CaseVal)) 36333e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor if (EnumConstantDecl *Enumerator 36343e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor = dyn_cast<EnumConstantDecl>(DRE->getDecl())) { 36353e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // We look into the AST of the case statement to determine which 36363e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // enumerator was named. Alternatively, we could compute the value of 36373e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // the integral constant expression, then compare it against the 36383e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // values of each enumerator. However, value-based approach would not 36393e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // work as well with C++ templates where enumerators declared within a 36403e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // template are type- and value-dependent. 36413e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor EnumeratorsSeen.insert(Enumerator); 36423e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 3643b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // If this is a qualified-id, keep track of the nested-name-specifier 3644b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // so that we can reproduce it as part of code completion, e.g., 36453e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // 36463e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // switch (TagD.getKind()) { 36473e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // case TagDecl::TK_enum: 36483e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // break; 36493e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // case XXX 36503e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // 3651b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // At the XXX, our completions are TagDecl::TK_union, 36523e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // TagDecl::TK_struct, and TagDecl::TK_class, rather than TK_union, 36533e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // TK_struct, and TK_class. 3654a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor Qualifier = DRE->getQualifier(); 36553e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor } 36563e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor } 36573e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 3658b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor if (getLangOptions().CPlusPlus && !Qualifier && EnumeratorsSeen.empty()) { 3659b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // If there are no prior enumerators in C++, check whether we have to 3660b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // qualify the names of the enumerators that we suggest, because they 3661b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // may not be visible in this scope. 3662b223d8c4266655fe7a9491a0aff0263597672823Douglas Gregor Qualifier = getRequiredQualification(Context, CurContext, Enum); 3663b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor } 3664b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor 36653e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // Add any enumerators that have not yet been mentioned. 3666218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 3667218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Expression); 36683e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor Results.EnterNewScope(); 36693e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor for (EnumDecl::enumerator_iterator E = Enum->enumerator_begin(), 36703e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor EEnd = Enum->enumerator_end(); 36713e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor E != EEnd; ++E) { 36723e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor if (EnumeratorsSeen.count(*E)) 36733e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor continue; 36743e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 36755c722c7020b33da57090422b854072258a50b3f0Douglas Gregor CodeCompletionResult R(*E, Qualifier); 36765c722c7020b33da57090422b854072258a50b3f0Douglas Gregor R.Priority = CCP_EnumInCase; 36775c722c7020b33da57090422b854072258a50b3f0Douglas Gregor Results.AddResult(R, CurContext, 0, false); 36783e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor } 36793e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor Results.ExitScope(); 36802f880e47ca32d007d7e9e5ff5efa05f5c3432744Douglas Gregor 36813da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor //We need to make sure we're setting the right context, 36823da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor //so only say we include macros if the code completer says we do 36833da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor enum CodeCompletionContext::Kind kind = CodeCompletionContext::CCC_Other; 36843da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor if (CodeCompleter->includeMacros()) { 3685bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddMacroResults(PP, Results); 36863da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor kind = CodeCompletionContext::CCC_OtherWithMacros; 36873da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 36883da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor 3689e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 36903da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor kind, 3691e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 36923e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor} 36933e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 36949c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregornamespace { 36959c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor struct IsBetterOverloadCandidate { 36969c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor Sema &S; 36975769d6195087229770d7ac90449443e026c47103John McCall SourceLocation Loc; 36989c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 36999c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor public: 37005769d6195087229770d7ac90449443e026c47103John McCall explicit IsBetterOverloadCandidate(Sema &S, SourceLocation Loc) 37015769d6195087229770d7ac90449443e026c47103John McCall : S(S), Loc(Loc) { } 37029c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 37039c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor bool 37049c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor operator()(const OverloadCandidate &X, const OverloadCandidate &Y) const { 3705120d63cd4465230c2cd56508c7cd8e0ad00848e7John McCall return isBetterOverloadCandidate(S, X, Y, Loc); 37069c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor } 37079c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor }; 37089c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor} 37099c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 371013a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charlesstatic bool anyNullArguments(llvm::ArrayRef<Expr*> Args) { 371113a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles if (Args.size() && !Args.data()) 3712d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor return true; 371313a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles 371413a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles for (unsigned I = 0; I != Args.size(); ++I) 3715d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor if (!Args[I]) 3716d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor return true; 371713a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles 3718d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor return false; 3719d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor} 3720d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor 3721f81e5a9e3f3ff80c56e4afb4fe6311a8735f36e8Richard Trieuvoid Sema::CodeCompleteCall(Scope *S, Expr *FnIn, 372213a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles llvm::ArrayRef<Expr *> Args) { 37239c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor if (!CodeCompleter) 37249c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor return; 3725ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor 3726ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor // When we're code-completing for a call, we fall back to ordinary 3727ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor // name code-completion whenever we can't produce specific 3728ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor // results. We may want to revisit this strategy in the future, 3729ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor // e.g., by merging the two kinds of results. 3730ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor 37319c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor Expr *Fn = (Expr *)FnIn; 3732ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor 37339c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor // Ignore type-dependent call expressions entirely. 373413a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles if (!Fn || Fn->isTypeDependent() || anyNullArguments(Args) || 373513a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles Expr::hasAnyTypeDependentArguments(Args)) { 3736e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompleteOrdinaryName(S, PCC_Expression); 37379c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor return; 3738ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor } 37399c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 37403b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall // Build an overload candidate set based on the functions we find. 37415769d6195087229770d7ac90449443e026c47103John McCall SourceLocation Loc = Fn->getExprLoc(); 37425769d6195087229770d7ac90449443e026c47103John McCall OverloadCandidateSet CandidateSet(Loc); 37433b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall 37449c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor // FIXME: What if we're calling something that isn't a function declaration? 37459c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor // FIXME: What if we're calling a pseudo-destructor? 37469c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor // FIXME: What if we're calling a member function? 37479c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 3748c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor typedef CodeCompleteConsumer::OverloadCandidate ResultCandidate; 37495f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<ResultCandidate, 8> Results; 3750c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor 37513b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall Expr *NakedFn = Fn->IgnoreParenCasts(); 37523b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(NakedFn)) 375313a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles AddOverloadedCallCandidates(ULE, Args, CandidateSet, 37543b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall /*PartialOverloading=*/ true); 37553b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall else if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(NakedFn)) { 37563b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall FunctionDecl *FDecl = dyn_cast<FunctionDecl>(DRE->getDecl()); 3757c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor if (FDecl) { 3758d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor if (!getLangOptions().CPlusPlus || 3759d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor !FDecl->getType()->getAs<FunctionProtoType>()) 3760c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor Results.push_back(ResultCandidate(FDecl)); 3761c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor else 376286820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall // FIXME: access? 376313a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles AddOverloadCandidate(FDecl, DeclAccessPair::make(FDecl, AS_none), Args, 376413a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles CandidateSet, false, /*PartialOverloading*/true); 3765c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor } 37663b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall } 37679c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 37685ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor QualType ParamType; 37695ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 3770c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor if (!CandidateSet.empty()) { 3771c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor // Sort the overload candidate set by placing the best overloads first. 3772c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor std::stable_sort(CandidateSet.begin(), CandidateSet.end(), 37735769d6195087229770d7ac90449443e026c47103John McCall IsBetterOverloadCandidate(*this, Loc)); 3774c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor 3775c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor // Add the remaining viable overload candidates as code-completion reslults. 3776c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor for (OverloadCandidateSet::iterator Cand = CandidateSet.begin(), 3777c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor CandEnd = CandidateSet.end(); 3778c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor Cand != CandEnd; ++Cand) { 3779c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor if (Cand->Viable) 3780c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor Results.push_back(ResultCandidate(Cand->Function)); 3781c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor } 37825ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 37835ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor // From the viable candidates, try to determine the type of this parameter. 37845ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor for (unsigned I = 0, N = Results.size(); I != N; ++I) { 37855ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (const FunctionType *FType = Results[I].getFunctionType()) 37865ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (const FunctionProtoType *Proto = dyn_cast<FunctionProtoType>(FType)) 378713a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles if (Args.size() < Proto->getNumArgs()) { 37885ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (ParamType.isNull()) 378913a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles ParamType = Proto->getArgType(Args.size()); 37905ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor else if (!Context.hasSameUnqualifiedType( 37915ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor ParamType.getNonReferenceType(), 379213a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles Proto->getArgType(Args.size()).getNonReferenceType())) { 37935ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor ParamType = QualType(); 37945ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor break; 37955ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor } 37965ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor } 37975ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor } 37985ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor } else { 37995ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor // Try to determine the parameter type from the type of the expression 38005ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor // being called. 38015ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor QualType FunctionType = Fn->getType(); 38025ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (const PointerType *Ptr = FunctionType->getAs<PointerType>()) 38035ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor FunctionType = Ptr->getPointeeType(); 38045ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor else if (const BlockPointerType *BlockPtr 38055ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor = FunctionType->getAs<BlockPointerType>()) 38065ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor FunctionType = BlockPtr->getPointeeType(); 38075ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor else if (const MemberPointerType *MemPtr 38085ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor = FunctionType->getAs<MemberPointerType>()) 38095ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor FunctionType = MemPtr->getPointeeType(); 38105ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 38115ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (const FunctionProtoType *Proto 38125ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor = FunctionType->getAs<FunctionProtoType>()) { 381313a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles if (Args.size() < Proto->getNumArgs()) 381413a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles ParamType = Proto->getArgType(Args.size()); 38155ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor } 38169c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor } 3817ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor 38185ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (ParamType.isNull()) 3819e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompleteOrdinaryName(S, PCC_Expression); 38205ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor else 38215ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor CodeCompleteExpression(S, ParamType); 38225ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 38232e4c7a5865739709a310d847da34096aa402d183Douglas Gregor if (!Results.empty()) 382413a140caba448a66ffcc5ff0d32a87d6e4f4ad3fAhmed Charles CodeCompleter->ProcessOverloadCandidates(*this, Args.size(), Results.data(), 3825ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor Results.size()); 38269c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor} 38279c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 3828d226f65006733ed7f709c3174f22ce33391cb58fJohn McCallvoid Sema::CodeCompleteInitializer(Scope *S, Decl *D) { 3829d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall ValueDecl *VD = dyn_cast_or_null<ValueDecl>(D); 38305ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (!VD) { 3831e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompleteOrdinaryName(S, PCC_Expression); 38325ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor return; 38335ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor } 38345ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 38355ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor CodeCompleteExpression(S, VD->getType()); 38365ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor} 38375ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 38385ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregorvoid Sema::CodeCompleteReturn(Scope *S) { 38395ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor QualType ResultType; 38405ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (isa<BlockDecl>(CurContext)) { 38415ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (BlockScopeInfo *BSI = getCurBlock()) 38425ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor ResultType = BSI->ReturnType; 38435ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor } else if (FunctionDecl *Function = dyn_cast<FunctionDecl>(CurContext)) 38445ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor ResultType = Function->getResultType(); 38455ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor else if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(CurContext)) 38465ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor ResultType = Method->getResultType(); 38475ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 38485ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (ResultType.isNull()) 3849e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompleteOrdinaryName(S, PCC_Expression); 38505ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor else 38515ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor CodeCompleteExpression(S, ResultType); 38525ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor} 38535ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 3854d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregorvoid Sema::CodeCompleteAfterIf(Scope *S) { 3855d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor typedef CodeCompletionResult Result; 3856d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 3857d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor mapCodeCompletionContext(*this, PCC_Statement)); 3858d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Results.setFilter(&ResultBuilder::IsOrdinaryName); 3859d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Results.EnterNewScope(); 3860d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor 3861d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 3862d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 3863d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor CodeCompleter->includeGlobals()); 3864d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor 3865d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor AddOrdinaryNameResults(PCC_Statement, S, *this, Results); 3866d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor 3867d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor // "else" block 3868d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor CodeCompletionBuilder Builder(Results.getAllocator()); 3869d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddTypedTextChunk("else"); 3870f11641a2c651e4e9733c5f5011993554d7c635e5Douglas Gregor if (Results.includeCodePatterns()) { 3871f11641a2c651e4e9733c5f5011993554d7c635e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 3872f11641a2c651e4e9733c5f5011993554d7c635e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 3873f11641a2c651e4e9733c5f5011993554d7c635e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 3874f11641a2c651e4e9733c5f5011993554d7c635e5Douglas Gregor Builder.AddPlaceholderChunk("statements"); 3875f11641a2c651e4e9733c5f5011993554d7c635e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 3876f11641a2c651e4e9733c5f5011993554d7c635e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 3877f11641a2c651e4e9733c5f5011993554d7c635e5Douglas Gregor } 3878d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Results.AddResult(Builder.TakeString()); 3879d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor 3880d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor // "else if" block 3881d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddTypedTextChunk("else"); 3882d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 3883d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddTextChunk("if"); 3884d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 3885d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 3886d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor if (getLangOptions().CPlusPlus) 3887d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddPlaceholderChunk("condition"); 3888d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor else 3889d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddPlaceholderChunk("expression"); 3890d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 3891f11641a2c651e4e9733c5f5011993554d7c635e5Douglas Gregor if (Results.includeCodePatterns()) { 3892f11641a2c651e4e9733c5f5011993554d7c635e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 3893f11641a2c651e4e9733c5f5011993554d7c635e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 3894f11641a2c651e4e9733c5f5011993554d7c635e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 3895f11641a2c651e4e9733c5f5011993554d7c635e5Douglas Gregor Builder.AddPlaceholderChunk("statements"); 3896f11641a2c651e4e9733c5f5011993554d7c635e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 3897f11641a2c651e4e9733c5f5011993554d7c635e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 3898f11641a2c651e4e9733c5f5011993554d7c635e5Douglas Gregor } 3899d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Results.AddResult(Builder.TakeString()); 3900d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor 3901d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Results.ExitScope(); 3902d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor 3903d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor if (S->getFnParent()) 3904d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor AddPrettyFunctionResults(PP.getLangOptions(), Results); 3905d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor 3906d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor if (CodeCompleter->includeMacros()) 3907d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor AddMacroResults(PP, Results); 3908d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor 3909d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 3910d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Results.data(),Results.size()); 3911d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor} 3912d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor 3913f81e5a9e3f3ff80c56e4afb4fe6311a8735f36e8Richard Trieuvoid Sema::CodeCompleteAssignmentRHS(Scope *S, Expr *LHS) { 39145ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (LHS) 39155ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor CodeCompleteExpression(S, static_cast<Expr *>(LHS)->getType()); 39165ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor else 3917e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompleteOrdinaryName(S, PCC_Expression); 39185ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor} 39195ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 39209ab14541716928894821cf5d53d6b4c95ffdf3a3Jeffrey Yasskinvoid Sema::CodeCompleteQualifiedId(Scope *S, CXXScopeSpec &SS, 392181b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor bool EnteringContext) { 392281b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor if (!SS.getScopeRep() || !CodeCompleter) 392381b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor return; 392481b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor 392586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor DeclContext *Ctx = computeDeclContext(SS, EnteringContext); 392686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!Ctx) 392786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return; 3928d1cd31aeb806077340be94e32429f3192cf139b0Douglas Gregor 3929d1cd31aeb806077340be94e32429f3192cf139b0Douglas Gregor // Try to instantiate any non-dependent declaration contexts before 3930d1cd31aeb806077340be94e32429f3192cf139b0Douglas Gregor // we look in them. 393177bb1aa78bcd26e42c0382043e65a2b03242be4dJohn McCall if (!isDependentScopeSpecifier(SS) && RequireCompleteDeclContext(SS, Ctx)) 3932d1cd31aeb806077340be94e32429f3192cf139b0Douglas Gregor return; 3933d1cd31aeb806077340be94e32429f3192cf139b0Douglas Gregor 3934218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 3935218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Name); 3936f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor Results.EnterNewScope(); 393752779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor 393886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // The "template" keyword can follow "::" in the grammar, but only 393986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // put it into the grammar if the nested-name-specifier is dependent. 394086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NestedNameSpecifier *NNS = (NestedNameSpecifier *)SS.getScopeRep(); 394186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!Results.empty() && NNS->isDependent()) 3942a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult("template"); 3943f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor 3944f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor // Add calls to overridden virtual functions, if there are any. 3945f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor // 3946f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor // FIXME: This isn't wonderful, because we don't know whether we're actually 3947f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor // in a context that permits expressions. This is a general issue with 3948f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor // qualified-id completions. 3949f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor if (!EnteringContext) 3950f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor MaybeAddOverrideCalls(*this, Ctx, Results); 3951f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor Results.ExitScope(); 395286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 3953f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 3954f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor LookupVisibleDecls(Ctx, LookupOrdinaryName, Consumer); 3955f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor 3956e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 3957430d7a1a621a126a9ffe442ad8987ba02b46dae9Douglas Gregor Results.getCompletionContext(), 3958e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 395981b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor} 396049f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 396149f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregorvoid Sema::CodeCompleteUsing(Scope *S) { 396249f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor if (!CodeCompleter) 396349f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor return; 396449f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 3965218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 396652779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor CodeCompletionContext::CCC_PotentiallyQualifiedName, 396752779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor &ResultBuilder::IsNestedNameSpecifier); 39688e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.EnterNewScope(); 396986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 397086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // If we aren't in class scope, we could see the "namespace" keyword. 397186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!S->isClassScope()) 39720a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall Results.AddResult(CodeCompletionResult("namespace")); 397386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 397486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // After "using", we can see anything that would start a 397586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // nested-name-specifier. 39765d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 39778071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 39788071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompleter->includeGlobals()); 39798e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.ExitScope(); 398086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 3981e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 398252779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor CodeCompletionContext::CCC_PotentiallyQualifiedName, 3983e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 398449f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor} 398549f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 398649f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregorvoid Sema::CodeCompleteUsingDirective(Scope *S) { 398749f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor if (!CodeCompleter) 398849f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor return; 398949f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 399086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // After "using namespace", we expect to see a namespace name or namespace 399186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // alias. 3992218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 3993218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Namespace, 399452779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor &ResultBuilder::IsNamespaceOrAlias); 39958e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.EnterNewScope(); 39965d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 39978071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 39988071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompleter->includeGlobals()); 39998e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.ExitScope(); 4000e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 40018071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompletionContext::CCC_Namespace, 4002e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 400349f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor} 400449f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 400549f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregorvoid Sema::CodeCompleteNamespaceDecl(Scope *S) { 400649f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor if (!CodeCompleter) 400749f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor return; 400849f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 400986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor DeclContext *Ctx = (DeclContext *)S->getEntity(); 401086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!S->getParent()) 401186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Ctx = Context.getTranslationUnitDecl(); 401286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 401352779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor bool SuppressedGlobalResults 401452779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor = Ctx && !CodeCompleter->includeGlobals() && isa<TranslationUnitDecl>(Ctx); 401552779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor 4016218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 401752779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor SuppressedGlobalResults 401852779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor ? CodeCompletionContext::CCC_Namespace 401952779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor : CodeCompletionContext::CCC_Other, 402052779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor &ResultBuilder::IsNamespace); 402152779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor 402252779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor if (Ctx && Ctx->isFileContext() && !SuppressedGlobalResults) { 402386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // We only want to see those namespaces that have already been defined 402486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // within this scope, because its likely that the user is creating an 402586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // extended namespace declaration. Keep track of the most recent 402686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // definition of each namespace. 402786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor std::map<NamespaceDecl *, NamespaceDecl *> OrigToLatest; 402886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor for (DeclContext::specific_decl_iterator<NamespaceDecl> 402986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NS(Ctx->decls_begin()), NSEnd(Ctx->decls_end()); 403086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NS != NSEnd; ++NS) 403186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor OrigToLatest[NS->getOriginalNamespace()] = *NS; 403286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 403386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add the most recent definition (or extended definition) of each 403486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // namespace to the list of results. 40358e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.EnterNewScope(); 403686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor for (std::map<NamespaceDecl *, NamespaceDecl *>::iterator 403786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NS = OrigToLatest.begin(), NSEnd = OrigToLatest.end(); 403886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NS != NSEnd; ++NS) 40390a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall Results.AddResult(CodeCompletionResult(NS->second, 0), 4040608300be1972c43fe99154d25d62d697e7c0a0c2Douglas Gregor CurContext, 0, false); 40418e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.ExitScope(); 404286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 404386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 4044e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 404552779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor Results.getCompletionContext(), 4046e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 404749f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor} 404849f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 404949f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregorvoid Sema::CodeCompleteNamespaceAliasDecl(Scope *S) { 405049f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor if (!CodeCompleter) 405149f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor return; 405249f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 405386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // After "namespace", we expect to see a namespace or alias. 4054218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 4055218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Namespace, 405652779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor &ResultBuilder::IsNamespaceOrAlias); 40575d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 40588071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 40598071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompleter->includeGlobals()); 4060e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 406152779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor Results.getCompletionContext(), 4062e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 406349f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor} 406449f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 4065ed8d322b4086b8b1e1f78b21389cabb23457dcb3Douglas Gregorvoid Sema::CodeCompleteOperatorName(Scope *S) { 4066ed8d322b4086b8b1e1f78b21389cabb23457dcb3Douglas Gregor if (!CodeCompleter) 4067ed8d322b4086b8b1e1f78b21389cabb23457dcb3Douglas Gregor return; 406886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 40690a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 4070218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 4071218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Type, 407252779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor &ResultBuilder::IsType); 40738e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.EnterNewScope(); 407486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 407586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add the names of overloadable operators. 407686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 407786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (std::strcmp(Spelling, "?")) \ 4078a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Spelling)); 407986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor#include "clang/Basic/OperatorKinds.def" 408086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 408186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add any type names visible from the current scope 408245bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor Results.allowNestedNameSpecifiers(); 40835d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 40848071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 40858071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompleter->includeGlobals()); 408686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 408786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add any type specifiers 4088bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddTypeSpecifierResults(getLangOptions(), Results); 40898e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.ExitScope(); 4090ed8d322b4086b8b1e1f78b21389cabb23457dcb3Douglas Gregor 4091e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 40928071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompletionContext::CCC_Type, 4093e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 4094c464ae8444edb6d07ea49b7a0eae1674c0fa1bb8Douglas Gregor} 4095c464ae8444edb6d07ea49b7a0eae1674c0fa1bb8Douglas Gregor 40960133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregorvoid Sema::CodeCompleteConstructorInitializer(Decl *ConstructorD, 4097cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt CXXCtorInitializer** Initializers, 40980133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor unsigned NumInitializers) { 40998987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor PrintingPolicy Policy = getCompletionPrintingPolicy(*this); 41000133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor CXXConstructorDecl *Constructor 41010133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor = static_cast<CXXConstructorDecl *>(ConstructorD); 41020133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor if (!Constructor) 41030133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor return; 41040133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor 4105218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 410652779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor CodeCompletionContext::CCC_PotentiallyQualifiedName); 41070133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor Results.EnterNewScope(); 41080133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor 41090133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor // Fill in any already-initialized fields or base classes. 41100133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor llvm::SmallPtrSet<FieldDecl *, 4> InitializedFields; 41110133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor llvm::SmallPtrSet<CanQualType, 4> InitializedBases; 41120133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor for (unsigned I = 0; I != NumInitializers; ++I) { 41130133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor if (Initializers[I]->isBaseInitializer()) 41140133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor InitializedBases.insert( 41150133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor Context.getCanonicalType(QualType(Initializers[I]->getBaseClass(), 0))); 41160133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor else 411700eb3f9c5b33e3d99aee1f8b75dd9c9678fdd66bFrancois Pichet InitializedFields.insert(cast<FieldDecl>( 411800eb3f9c5b33e3d99aee1f8b75dd9c9678fdd66bFrancois Pichet Initializers[I]->getAnyMember())); 41190133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor } 41200133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor 41210133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor // Add completions for base classes. 4122218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder Builder(Results.getAllocator()); 41230c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor bool SawLastInitializer = (NumInitializers == 0); 41240133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor CXXRecordDecl *ClassDecl = Constructor->getParent(); 41250133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor for (CXXRecordDecl::base_class_iterator Base = ClassDecl->bases_begin(), 41260133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor BaseEnd = ClassDecl->bases_end(); 41270133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor Base != BaseEnd; ++Base) { 41280c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor if (!InitializedBases.insert(Context.getCanonicalType(Base->getType()))) { 41290c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor SawLastInitializer 41300c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor = NumInitializers > 0 && 41310c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor Initializers[NumInitializers - 1]->isBaseInitializer() && 41320c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor Context.hasSameUnqualifiedType(Base->getType(), 41330c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor QualType(Initializers[NumInitializers - 1]->getBaseClass(), 0)); 41340133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor continue; 41350c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor } 41360133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor 4137218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk( 4138dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Results.getAllocator().CopyString( 4139f85e193739c953358c865005855253af4f68a497John McCall Base->getType().getAsString(Policy))); 4140218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4141218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("args"); 4142218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 4143218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(CodeCompletionResult(Builder.TakeString(), 41440c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor SawLastInitializer? CCP_NextInitializer 41450c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor : CCP_MemberDeclaration)); 41460c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor SawLastInitializer = false; 41470133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor } 41480133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor 41490133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor // Add completions for virtual base classes. 41500133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor for (CXXRecordDecl::base_class_iterator Base = ClassDecl->vbases_begin(), 41510133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor BaseEnd = ClassDecl->vbases_end(); 41520133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor Base != BaseEnd; ++Base) { 41530c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor if (!InitializedBases.insert(Context.getCanonicalType(Base->getType()))) { 41540c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor SawLastInitializer 41550c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor = NumInitializers > 0 && 41560c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor Initializers[NumInitializers - 1]->isBaseInitializer() && 41570c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor Context.hasSameUnqualifiedType(Base->getType(), 41580c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor QualType(Initializers[NumInitializers - 1]->getBaseClass(), 0)); 41590133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor continue; 41600c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor } 41610133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor 4162218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk( 4163dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.getAllocator().CopyString( 4164f85e193739c953358c865005855253af4f68a497John McCall Base->getType().getAsString(Policy))); 4165218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4166218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("args"); 4167218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 4168218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(CodeCompletionResult(Builder.TakeString(), 41690c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor SawLastInitializer? CCP_NextInitializer 41700c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor : CCP_MemberDeclaration)); 41710c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor SawLastInitializer = false; 41720133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor } 41730133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor 41740133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor // Add completions for members. 41750133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor for (CXXRecordDecl::field_iterator Field = ClassDecl->field_begin(), 41760133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor FieldEnd = ClassDecl->field_end(); 41770133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor Field != FieldEnd; ++Field) { 41780c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor if (!InitializedFields.insert(cast<FieldDecl>(Field->getCanonicalDecl()))) { 41790c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor SawLastInitializer 41800c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor = NumInitializers > 0 && 418100eb3f9c5b33e3d99aee1f8b75dd9c9678fdd66bFrancois Pichet Initializers[NumInitializers - 1]->isAnyMemberInitializer() && 418200eb3f9c5b33e3d99aee1f8b75dd9c9678fdd66bFrancois Pichet Initializers[NumInitializers - 1]->getAnyMember() == *Field; 41830133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor continue; 41840c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor } 41850133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor 41860133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor if (!Field->getDeclName()) 41870133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor continue; 41880133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor 4189dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddTypedTextChunk(Builder.getAllocator().CopyString( 4190218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Field->getIdentifier()->getName())); 4191218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4192218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("args"); 4193218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 4194218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(CodeCompletionResult(Builder.TakeString(), 41950c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor SawLastInitializer? CCP_NextInitializer 4196a67e03fdf1ae8a1f92463a307d0b6281f1161f40Douglas Gregor : CCP_MemberDeclaration, 4197a67e03fdf1ae8a1f92463a307d0b6281f1161f40Douglas Gregor CXCursor_MemberRef)); 41980c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor SawLastInitializer = false; 41990133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor } 42000133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor Results.ExitScope(); 42010133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor 420252779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 42030133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor Results.data(), Results.size()); 42040133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor} 42050133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor 420681f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor/// \brief Determine whether this scope denotes a namespace. 420781f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregorstatic bool isNamespaceScope(Scope *S) { 420881f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor DeclContext *DC = static_cast<DeclContext *>(S->getEntity()); 420981f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor if (!DC) 421081f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor return false; 421181f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor 421281f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor return DC->isFileContext(); 421381f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor} 421481f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor 421581f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregorvoid Sema::CodeCompleteLambdaIntroducer(Scope *S, LambdaIntroducer &Intro, 421681f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor bool AfterAmpersand) { 421781f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 421881f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor CodeCompletionContext::CCC_Other); 421981f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor Results.EnterNewScope(); 422081f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor 422181f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor // Note what has already been captured. 422281f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor llvm::SmallPtrSet<IdentifierInfo *, 4> Known; 422381f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor bool IncludedThis = false; 422481f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor for (SmallVectorImpl<LambdaCapture>::iterator C = Intro.Captures.begin(), 422581f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor CEnd = Intro.Captures.end(); 422681f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor C != CEnd; ++C) { 422781f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor if (C->Kind == LCK_This) { 422881f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor IncludedThis = true; 422981f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor continue; 423081f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor } 423181f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor 423281f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor Known.insert(C->Id); 423381f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor } 423481f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor 423581f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor // Look for other capturable variables. 423681f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor for (; S && !isNamespaceScope(S); S = S->getParent()) { 423781f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor for (Scope::decl_iterator D = S->decl_begin(), DEnd = S->decl_end(); 423881f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor D != DEnd; ++D) { 423981f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor VarDecl *Var = dyn_cast<VarDecl>(*D); 424081f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor if (!Var || 424181f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor !Var->hasLocalStorage() || 424281f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor Var->hasAttr<BlocksAttr>()) 424381f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor continue; 424481f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor 424581f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor if (Known.insert(Var->getIdentifier())) 424681f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor Results.AddResult(CodeCompletionResult(Var), CurContext, 0, false); 424781f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor } 424881f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor } 424981f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor 425081f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor // Add 'this', if it would be valid. 425181f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor if (!IncludedThis && !AfterAmpersand && Intro.Default != LCD_ByCopy) 425281f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor addThisCompletion(*this, Results); 425381f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor 425481f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor Results.ExitScope(); 425581f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor 425681f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 425781f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor Results.data(), Results.size()); 425881f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor} 425981f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor 4260b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor// Macro that expands to @Keyword or Keyword, depending on whether NeedAt is 4261b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor// true or false. 4262b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor#define OBJC_AT_KEYWORD_NAME(NeedAt,Keyword) NeedAt? "@" #Keyword : #Keyword 4263bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCImplementationResults(const LangOptions &LangOpts, 4264b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor ResultBuilder &Results, 4265b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor bool NeedAt) { 42660a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 4267b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // Since we have an implementation, we can end it. 4268a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,end))); 4269b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 4270218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder Builder(Results.getAllocator()); 4271b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor if (LangOpts.ObjC2) { 4272b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @dynamic 4273218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,dynamic)); 4274218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4275218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("property"); 4276218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 4277b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 4278b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @synthesize 4279218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,synthesize)); 4280218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4281218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("property"); 4282218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 4283b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor } 4284b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor} 4285c464ae8444edb6d07ea49b7a0eae1674c0fa1bb8Douglas Gregor 4286bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCInterfaceResults(const LangOptions &LangOpts, 4287b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor ResultBuilder &Results, 4288b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor bool NeedAt) { 42890a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 4290b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 4291b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // Since we have an interface or protocol, we can end it. 4292a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,end))); 4293b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 4294b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor if (LangOpts.ObjC2) { 4295b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @property 4296a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,property))); 4297b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 4298b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @required 4299a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,required))); 4300b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 4301b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @optional 4302a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,optional))); 4303b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor } 4304b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor} 4305834389b87451b24618513b907b4dfb5b00d211f3Douglas Gregor 4306bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCTopLevelResults(ResultBuilder &Results, bool NeedAt) { 43070a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 4308218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder Builder(Results.getAllocator()); 4309b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 4310b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @class name ; 4311218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,class)); 4312218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4313218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("name"); 4314218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 4315b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 4316c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor if (Results.includeCodePatterns()) { 4317c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // @interface name 4318c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // FIXME: Could introduce the whole pattern, including superclasses and 4319c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // such. 4320218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,interface)); 4321218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4322218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("class"); 4323218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 4324b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 4325c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // @protocol name 4326218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,protocol)); 4327218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4328218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("protocol"); 4329218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 4330c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor 4331c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // @implementation name 4332218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,implementation)); 4333218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4334218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("class"); 4335218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 4336c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor } 4337b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 4338b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @compatibility_alias name 4339218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,compatibility_alias)); 4340218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4341218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("alias"); 4342218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4343218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("class"); 4344218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 4345b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor} 4346834389b87451b24618513b907b4dfb5b00d211f3Douglas Gregor 4347a28948f34817476d02412fa204cae038e228c827Fariborz Jahanianvoid Sema::CodeCompleteObjCAtDirective(Scope *S) { 43480a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 4349218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 4350218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 4351b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Results.EnterNewScope(); 4352a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian if (isa<ObjCImplDecl>(CurContext)) 4353bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCImplementationResults(getLangOptions(), Results, false); 4354a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian else if (CurContext->isObjCContainer()) 4355bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCInterfaceResults(getLangOptions(), Results, false); 4356b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor else 4357bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCTopLevelResults(Results, false); 4358c464ae8444edb6d07ea49b7a0eae1674c0fa1bb8Douglas Gregor Results.ExitScope(); 4359e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 4360e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 4361e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 43629a0c85e640a08174569a303db22981612f05d385Douglas Gregor} 43639a0c85e640a08174569a303db22981612f05d385Douglas Gregor 4364bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCExpressionResults(ResultBuilder &Results, bool NeedAt) { 43650a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 4366218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder Builder(Results.getAllocator()); 43679a0c85e640a08174569a303db22981612f05d385Douglas Gregor 43689a0c85e640a08174569a303db22981612f05d385Douglas Gregor // @encode ( type-name ) 43698ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor const char *EncodeType = "char[]"; 43708ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor if (Results.getSema().getLangOptions().CPlusPlus || 43718ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Results.getSema().getLangOptions().ConstStrings) 43728ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor EncodeType = " const char[]"; 43738ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk(EncodeType); 4374218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,encode)); 4375218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4376218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("type-name"); 4377218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 4378218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 43799a0c85e640a08174569a303db22981612f05d385Douglas Gregor 43809a0c85e640a08174569a303db22981612f05d385Douglas Gregor // @protocol ( protocol-name ) 43818ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("Protocol *"); 4382218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,protocol)); 4383218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4384218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("protocol-name"); 4385218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 4386218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 43879a0c85e640a08174569a303db22981612f05d385Douglas Gregor 43889a0c85e640a08174569a303db22981612f05d385Douglas Gregor // @selector ( selector ) 43898ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("SEL"); 4390218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,selector)); 4391218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4392218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("selector"); 4393218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 4394218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 4395ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek 4396ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek // @[ objects, ... ] 4397ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,[)); 4398ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4399ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek Builder.AddPlaceholderChunk("objects, ..."); 4400ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4401ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek Builder.AddChunk(CodeCompletionString::CK_RightBracket); 4402ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek Results.AddResult(Result(Builder.TakeString())); 4403ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek 4404ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek // @{ key : object, ... } 4405ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,{)); 4406ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4407ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek Builder.AddPlaceholderChunk("key"); 4408ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4409ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek Builder.AddChunk(CodeCompletionString::CK_Colon); 4410ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4411ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek Builder.AddPlaceholderChunk("object, ..."); 4412ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4413ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek Builder.AddChunk(CodeCompletionString::CK_RightBrace); 4414ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek Results.AddResult(Result(Builder.TakeString())); 44159a0c85e640a08174569a303db22981612f05d385Douglas Gregor} 44169a0c85e640a08174569a303db22981612f05d385Douglas Gregor 4417bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCStatementResults(ResultBuilder &Results, bool NeedAt) { 44180a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 4419218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder Builder(Results.getAllocator()); 4420b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 4421c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor if (Results.includeCodePatterns()) { 4422c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // @try { statements } @catch ( declaration ) { statements } @finally 4423c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // { statements } 4424218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,try)); 4425218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 4426218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("statements"); 4427218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 4428218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("@catch"); 4429218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4430218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("parameter"); 4431218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 4432218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 4433218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("statements"); 4434218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 4435218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("@finally"); 4436218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 4437218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("statements"); 4438218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 4439218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 4440c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor } 4441b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 44429a0c85e640a08174569a303db22981612f05d385Douglas Gregor // @throw 4443218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,throw)); 4444218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4445218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 4446218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 4447b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 4448c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor if (Results.includeCodePatterns()) { 4449c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // @synchronized ( expression ) { statements } 4450218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,synchronized)); 4451218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4452218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4453218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 4454218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 4455218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 4456218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("statements"); 4457218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 4458218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 4459c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor } 4460b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor} 44619a0c85e640a08174569a303db22981612f05d385Douglas Gregor 4462bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCVisibilityResults(const LangOptions &LangOpts, 4463c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor ResultBuilder &Results, 4464c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor bool NeedAt) { 44650a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 4466a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,private))); 4467a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,protected))); 4468a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,public))); 4469c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor if (LangOpts.ObjC2) 4470a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,package))); 4471c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor} 4472c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor 4473c38c3e1e726630458154534227d74eda833d26a0Douglas Gregorvoid Sema::CodeCompleteObjCAtVisibility(Scope *S) { 4474218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 4475218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 4476c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor Results.EnterNewScope(); 4477bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCVisibilityResults(getLangOptions(), Results, false); 4478c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor Results.ExitScope(); 4479e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 4480e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 4481e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 4482c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor} 4483c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor 4484c38c3e1e726630458154534227d74eda833d26a0Douglas Gregorvoid Sema::CodeCompleteObjCAtStatement(Scope *S) { 4485218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 4486218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 4487b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Results.EnterNewScope(); 4488bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCStatementResults(Results, false); 4489bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCExpressionResults(Results, false); 44909a0c85e640a08174569a303db22981612f05d385Douglas Gregor Results.ExitScope(); 4491e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 4492e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 4493e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 44949a0c85e640a08174569a303db22981612f05d385Douglas Gregor} 44959a0c85e640a08174569a303db22981612f05d385Douglas Gregor 44969a0c85e640a08174569a303db22981612f05d385Douglas Gregorvoid Sema::CodeCompleteObjCAtExpression(Scope *S) { 4497218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 4498218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 44999a0c85e640a08174569a303db22981612f05d385Douglas Gregor Results.EnterNewScope(); 4500bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCExpressionResults(Results, false); 45019a0c85e640a08174569a303db22981612f05d385Douglas Gregor Results.ExitScope(); 4502e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 4503e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 4504e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 4505ed8d322b4086b8b1e1f78b21389cabb23457dcb3Douglas Gregor} 450649f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 4507988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor/// \brief Determine whether the addition of the given flag to an Objective-C 4508988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor/// property's attributes will cause a conflict. 4509988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregorstatic bool ObjCPropertyFlagConflicts(unsigned Attributes, unsigned NewFlag) { 4510988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor // Check if we've already added this flag. 4511988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (Attributes & NewFlag) 4512988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor return true; 4513988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor 4514988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor Attributes |= NewFlag; 4515988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor 4516988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor // Check for collisions with "readonly". 4517988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if ((Attributes & ObjCDeclSpec::DQ_PR_readonly) && 4518988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor (Attributes & (ObjCDeclSpec::DQ_PR_readwrite | 4519988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor ObjCDeclSpec::DQ_PR_assign | 4520f85e193739c953358c865005855253af4f68a497John McCall ObjCDeclSpec::DQ_PR_unsafe_unretained | 4521988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor ObjCDeclSpec::DQ_PR_copy | 4522f85e193739c953358c865005855253af4f68a497John McCall ObjCDeclSpec::DQ_PR_retain | 4523f85e193739c953358c865005855253af4f68a497John McCall ObjCDeclSpec::DQ_PR_strong))) 4524988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor return true; 4525988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor 4526f85e193739c953358c865005855253af4f68a497John McCall // Check for more than one of { assign, copy, retain, strong }. 4527988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor unsigned AssignCopyRetMask = Attributes & (ObjCDeclSpec::DQ_PR_assign | 4528f85e193739c953358c865005855253af4f68a497John McCall ObjCDeclSpec::DQ_PR_unsafe_unretained | 4529988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor ObjCDeclSpec::DQ_PR_copy | 4530f85e193739c953358c865005855253af4f68a497John McCall ObjCDeclSpec::DQ_PR_retain| 4531f85e193739c953358c865005855253af4f68a497John McCall ObjCDeclSpec::DQ_PR_strong); 4532988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (AssignCopyRetMask && 4533988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor AssignCopyRetMask != ObjCDeclSpec::DQ_PR_assign && 4534f85e193739c953358c865005855253af4f68a497John McCall AssignCopyRetMask != ObjCDeclSpec::DQ_PR_unsafe_unretained && 4535988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor AssignCopyRetMask != ObjCDeclSpec::DQ_PR_copy && 4536f85e193739c953358c865005855253af4f68a497John McCall AssignCopyRetMask != ObjCDeclSpec::DQ_PR_retain && 4537f85e193739c953358c865005855253af4f68a497John McCall AssignCopyRetMask != ObjCDeclSpec::DQ_PR_strong) 4538988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor return true; 4539988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor 4540988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor return false; 4541988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor} 4542988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor 4543a93b108e025ef2480fa867cc533e7781a40a639bDouglas Gregorvoid Sema::CodeCompleteObjCPropertyFlags(Scope *S, ObjCDeclSpec &ODS) { 4544ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff if (!CodeCompleter) 4545ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff return; 4546d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor 4547ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff unsigned Attributes = ODS.getPropertyAttributes(); 4548ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff 45490a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 4550218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 4551218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 4552ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff Results.EnterNewScope(); 4553988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_readonly)) 45540a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall Results.AddResult(CodeCompletionResult("readonly")); 4555988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_assign)) 45560a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall Results.AddResult(CodeCompletionResult("assign")); 4557f85e193739c953358c865005855253af4f68a497John McCall if (!ObjCPropertyFlagConflicts(Attributes, 4558f85e193739c953358c865005855253af4f68a497John McCall ObjCDeclSpec::DQ_PR_unsafe_unretained)) 4559f85e193739c953358c865005855253af4f68a497John McCall Results.AddResult(CodeCompletionResult("unsafe_unretained")); 4560988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_readwrite)) 45610a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall Results.AddResult(CodeCompletionResult("readwrite")); 4562988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_retain)) 45630a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall Results.AddResult(CodeCompletionResult("retain")); 4564f85e193739c953358c865005855253af4f68a497John McCall if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_strong)) 4565f85e193739c953358c865005855253af4f68a497John McCall Results.AddResult(CodeCompletionResult("strong")); 4566988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_copy)) 45670a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall Results.AddResult(CodeCompletionResult("copy")); 4568988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_nonatomic)) 45690a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall Results.AddResult(CodeCompletionResult("nonatomic")); 457027f45236005d9dd2bbbfeb1682eb349cb8b6998bFariborz Jahanian if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_atomic)) 457127f45236005d9dd2bbbfeb1682eb349cb8b6998bFariborz Jahanian Results.AddResult(CodeCompletionResult("atomic")); 4572988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_setter)) { 4573218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder Setter(Results.getAllocator()); 4574218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Setter.AddTypedTextChunk("setter"); 4575218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Setter.AddTextChunk(" = "); 4576218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Setter.AddPlaceholderChunk("method"); 4577218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(CodeCompletionResult(Setter.TakeString())); 457854f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor } 4579988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_getter)) { 4580218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder Getter(Results.getAllocator()); 4581218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Getter.AddTypedTextChunk("getter"); 4582218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Getter.AddTextChunk(" = "); 4583218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Getter.AddPlaceholderChunk("method"); 4584218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(CodeCompletionResult(Getter.TakeString())); 458554f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor } 4586ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff Results.ExitScope(); 4587e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 4588e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 4589e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 4590ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff} 4591c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff 45924ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor/// \brief Descripts the kind of Objective-C method that we want to find 45934ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor/// via code completion. 45944ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregorenum ObjCMethodKind { 45954ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor MK_Any, //< Any kind of method, provided it means other specified criteria. 45964ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor MK_ZeroArgSelector, //< Zero-argument (unary) selector. 45974ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor MK_OneArgSelector //< One-argument selector. 45984ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor}; 45994ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 4600458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregorstatic bool isAcceptableObjCSelector(Selector Sel, 4601458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor ObjCMethodKind WantKind, 4602458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor IdentifierInfo **SelIdents, 4603cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor unsigned NumSelIdents, 4604cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor bool AllowSameLength = true) { 46054ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (NumSelIdents > Sel.getNumArgs()) 46064ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor return false; 4607458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor 46084ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor switch (WantKind) { 4609458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor case MK_Any: break; 4610458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor case MK_ZeroArgSelector: return Sel.isUnarySelector(); 4611458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor case MK_OneArgSelector: return Sel.getNumArgs() == 1; 46124ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor } 4613458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor 4614cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor if (!AllowSameLength && NumSelIdents && NumSelIdents == Sel.getNumArgs()) 4615cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor return false; 4616cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor 46174ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor for (unsigned I = 0; I != NumSelIdents; ++I) 46184ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (SelIdents[I] != Sel.getIdentifierInfoForSlot(I)) 46194ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor return false; 4620458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor 46214ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor return true; 46224ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor} 4623458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor 4624458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregorstatic bool isAcceptableObjCMethod(ObjCMethodDecl *Method, 4625458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor ObjCMethodKind WantKind, 4626458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor IdentifierInfo **SelIdents, 4627cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor unsigned NumSelIdents, 4628cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor bool AllowSameLength = true) { 4629458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor return isAcceptableObjCSelector(Method->getSelector(), WantKind, SelIdents, 4630cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor NumSelIdents, AllowSameLength); 4631458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor} 4632d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor 4633d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregornamespace { 4634d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor /// \brief A set of selectors, which is used to avoid introducing multiple 4635d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor /// completions with the same selector into the result set. 4636d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor typedef llvm::SmallPtrSet<Selector, 16> VisitedSelectorSet; 4637d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor} 4638d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor 463936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// \brief Add all of the Objective-C methods in the given Objective-C 464036ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// container to the set of results. 464136ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// 464236ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// The container will be a class, protocol, category, or implementation of 464336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// any of the above. This mether will recurse to include methods from 464436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// the superclasses of classes along with their categories, protocols, and 464536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// implementations. 464636ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// 464736ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// \param Container the container in which we'll look to find methods. 464836ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// 464936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// \param WantInstance whether to add instance methods (only); if false, this 465036ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// routine will add factory methods (only). 465136ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// 465236ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// \param CurContext the context in which we're performing the lookup that 465336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// finds methods. 465436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// 4655cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor/// \param AllowSameLength Whether we allow a method to be added to the list 4656cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor/// when it has the same number of parameters as we have selector identifiers. 4657cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor/// 465836ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// \param Results the structure into which we'll add results. 465936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregorstatic void AddObjCMethods(ObjCContainerDecl *Container, 466036ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor bool WantInstanceMethods, 46614ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor ObjCMethodKind WantKind, 4662d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor IdentifierInfo **SelIdents, 4663d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor unsigned NumSelIdents, 466436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor DeclContext *CurContext, 4665d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor VisitedSelectorSet &Selectors, 4666cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor bool AllowSameLength, 4667408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor ResultBuilder &Results, 4668408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor bool InOriginalClass = true) { 46690a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 467036ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor for (ObjCContainerDecl::method_iterator M = Container->meth_begin(), 467136ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor MEnd = Container->meth_end(); 467236ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor M != MEnd; ++M) { 4673d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor if ((*M)->isInstanceMethod() == WantInstanceMethods) { 4674d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor // Check whether the selector identifiers we've been given are a 4675d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor // subset of the identifiers for this particular method. 4676cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor if (!isAcceptableObjCMethod(*M, WantKind, SelIdents, NumSelIdents, 4677cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor AllowSameLength)) 4678d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor continue; 46794ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 4680d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor if (!Selectors.insert((*M)->getSelector())) 4681d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor continue; 4682d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor 4683d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor Result R = Result(*M, 0); 4684d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor R.StartParameter = NumSelIdents; 46854ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor R.AllParametersAreInformative = (WantKind != MK_Any); 4686408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor if (!InOriginalClass) 4687408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor R.Priority += CCD_InBaseClass; 4688d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor Results.MaybeAddResult(R, CurContext); 4689d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor } 469036ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor } 469136ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 4692e396c7bd99ed99fd8136fadc8945791754c61b16Douglas Gregor // Visit the protocols of protocols. 4693e396c7bd99ed99fd8136fadc8945791754c61b16Douglas Gregor if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) { 46945e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor if (Protocol->hasDefinition()) { 46955e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor const ObjCList<ObjCProtocolDecl> &Protocols 46965e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor = Protocol->getReferencedProtocols(); 46975e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 46985e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor E = Protocols.end(); 46995e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor I != E; ++I) 47005e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents, 47015e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor NumSelIdents, CurContext, Selectors, AllowSameLength, 47025e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor Results, false); 47035e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor } 4704e396c7bd99ed99fd8136fadc8945791754c61b16Douglas Gregor } 4705e396c7bd99ed99fd8136fadc8945791754c61b16Douglas Gregor 470636ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container); 47072e5c15be82f362611c5928ce853d0685ff98c766Douglas Gregor if (!IFace || !IFace->hasDefinition()) 470836ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor return; 470936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 471036ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add methods in protocols. 471136ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor const ObjCList<ObjCProtocolDecl> &Protocols= IFace->getReferencedProtocols(); 471236ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 471336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor E = Protocols.end(); 471436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor I != E; ++I) 47154ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents, NumSelIdents, 4716cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor CurContext, Selectors, AllowSameLength, Results, false); 471736ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 471836ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add methods in categories. 471936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor for (ObjCCategoryDecl *CatDecl = IFace->getCategoryList(); CatDecl; 472036ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor CatDecl = CatDecl->getNextClassCategory()) { 47214ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(CatDecl, WantInstanceMethods, WantKind, SelIdents, 4722cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor NumSelIdents, CurContext, Selectors, AllowSameLength, 4723cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor Results, InOriginalClass); 472436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 472536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add a categories protocol methods. 472636ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor const ObjCList<ObjCProtocolDecl> &Protocols 472736ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor = CatDecl->getReferencedProtocols(); 472836ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 472936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor E = Protocols.end(); 473036ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor I != E; ++I) 47314ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents, 4732cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor NumSelIdents, CurContext, Selectors, AllowSameLength, 4733cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor Results, false); 473436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 473536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add methods in category implementations. 473636ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor if (ObjCCategoryImplDecl *Impl = CatDecl->getImplementation()) 47374ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(Impl, WantInstanceMethods, WantKind, SelIdents, 4738cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor NumSelIdents, CurContext, Selectors, AllowSameLength, 4739cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor Results, InOriginalClass); 474036ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor } 474136ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 474236ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add methods in superclass. 474336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor if (IFace->getSuperClass()) 47444ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(IFace->getSuperClass(), WantInstanceMethods, WantKind, 4745cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor SelIdents, NumSelIdents, CurContext, Selectors, 4746cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor AllowSameLength, Results, false); 474736ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 474836ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add methods in our implementation, if any. 474936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor if (ObjCImplementationDecl *Impl = IFace->getImplementation()) 47504ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(Impl, WantInstanceMethods, WantKind, SelIdents, 4751cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor NumSelIdents, CurContext, Selectors, AllowSameLength, 4752cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor Results, InOriginalClass); 47534ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor} 47544ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 47554ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 4756a28948f34817476d02412fa204cae038e228c827Fariborz Jahanianvoid Sema::CodeCompleteObjCPropertyGetter(Scope *S) { 47570a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 47584ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 47594ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor // Try to find the interface where getters might live. 4760a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurContext); 47614ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (!Class) { 47624ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (ObjCCategoryDecl *Category 4763a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian = dyn_cast_or_null<ObjCCategoryDecl>(CurContext)) 47644ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Class = Category->getClassInterface(); 47654ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 47664ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (!Class) 47674ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor return; 47684ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor } 47694ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 47704ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor // Find all of the potential getters. 4771218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 4772218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 47734ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Results.EnterNewScope(); 47744ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 4775d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor VisitedSelectorSet Selectors; 4776d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor AddObjCMethods(Class, true, MK_ZeroArgSelector, 0, 0, CurContext, Selectors, 4777cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor /*AllowSameLength=*/true, Results); 47784ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Results.ExitScope(); 4779e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 4780e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 4781e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 47824ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor} 47834ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 4784a28948f34817476d02412fa204cae038e228c827Fariborz Jahanianvoid Sema::CodeCompleteObjCPropertySetter(Scope *S) { 47850a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 47864ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 47874ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor // Try to find the interface where setters might live. 47884ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor ObjCInterfaceDecl *Class 4789a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian = dyn_cast_or_null<ObjCInterfaceDecl>(CurContext); 47904ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (!Class) { 47914ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (ObjCCategoryDecl *Category 4792a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian = dyn_cast_or_null<ObjCCategoryDecl>(CurContext)) 47934ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Class = Category->getClassInterface(); 47944ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 47954ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (!Class) 47964ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor return; 47974ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor } 47984ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 47994ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor // Find all of the potential getters. 4800218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 4801218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 48024ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Results.EnterNewScope(); 48034ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 4804d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor VisitedSelectorSet Selectors; 4805d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor AddObjCMethods(Class, true, MK_OneArgSelector, 0, 0, CurContext, 4806cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor Selectors, /*AllowSameLength=*/true, Results); 48074ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 48084ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Results.ExitScope(); 4809e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 4810e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 4811e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 481236ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor} 481336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 4814afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregorvoid Sema::CodeCompleteObjCPassingType(Scope *S, ObjCDeclSpec &DS, 4815afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor bool IsParameter) { 48160a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 4817218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 4818218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Type); 4819d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor Results.EnterNewScope(); 4820d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor 4821d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor // Add context-sensitive, Objective-C parameter-passing keywords. 4822d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor bool AddedInOut = false; 4823d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor if ((DS.getObjCDeclQualifier() & 4824d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor (ObjCDeclSpec::DQ_In | ObjCDeclSpec::DQ_Inout)) == 0) { 4825d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor Results.AddResult("in"); 4826d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor Results.AddResult("inout"); 4827d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor AddedInOut = true; 4828d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor } 4829d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor if ((DS.getObjCDeclQualifier() & 4830d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor (ObjCDeclSpec::DQ_Out | ObjCDeclSpec::DQ_Inout)) == 0) { 4831d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor Results.AddResult("out"); 4832d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor if (!AddedInOut) 4833d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor Results.AddResult("inout"); 4834d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor } 4835d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor if ((DS.getObjCDeclQualifier() & 4836d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor (ObjCDeclSpec::DQ_Bycopy | ObjCDeclSpec::DQ_Byref | 4837d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor ObjCDeclSpec::DQ_Oneway)) == 0) { 4838d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor Results.AddResult("bycopy"); 4839d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor Results.AddResult("byref"); 4840d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor Results.AddResult("oneway"); 4841d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor } 4842d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor 4843afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor // If we're completing the return type of an Objective-C method and the 4844afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor // identifier IBAction refers to a macro, provide a completion item for 4845afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor // an action, e.g., 4846afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor // IBAction)<#selector#>:(id)sender 4847afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor if (DS.getObjCDeclQualifier() == 0 && !IsParameter && 4848afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor Context.Idents.get("IBAction").hasMacroDefinition()) { 4849afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor typedef CodeCompletionString::Chunk Chunk; 4850afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor CodeCompletionBuilder Builder(Results.getAllocator(), CCP_CodePattern, 4851afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor CXAvailability_Available); 4852afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor Builder.AddTypedTextChunk("IBAction"); 4853afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor Builder.AddChunk(Chunk(CodeCompletionString::CK_RightParen)); 4854afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor Builder.AddPlaceholderChunk("selector"); 4855afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor Builder.AddChunk(Chunk(CodeCompletionString::CK_Colon)); 4856afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor Builder.AddChunk(Chunk(CodeCompletionString::CK_LeftParen)); 4857afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor Builder.AddTextChunk("id"); 4858afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor Builder.AddChunk(Chunk(CodeCompletionString::CK_RightParen)); 4859afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor Builder.AddTextChunk("sender"); 4860afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor Results.AddResult(CodeCompletionResult(Builder.TakeString())); 4861afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor } 4862afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor 4863d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor // Add various builtin type names and specifiers. 4864d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor AddOrdinaryNameResults(PCC_Type, S, *this, Results); 4865d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor Results.ExitScope(); 4866d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor 4867d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor // Add the various type names 4868d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor Results.setFilter(&ResultBuilder::IsOrdinaryNonValueName); 4869d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 4870d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 4871d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor CodeCompleter->includeGlobals()); 4872d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor 4873d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor if (CodeCompleter->includeMacros()) 4874d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor AddMacroResults(PP, Results); 4875d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor 4876d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 4877d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor CodeCompletionContext::CCC_Type, 4878d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor Results.data(), Results.size()); 4879d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor} 4880d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor 488122f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor/// \brief When we have an expression with type "id", we may assume 488222f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor/// that it has some more-specific class type based on knowledge of 488322f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor/// common uses of Objective-C. This routine returns that class type, 488422f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor/// or NULL if no better result could be determined. 488522f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregorstatic ObjCInterfaceDecl *GetAssumedMessageSendExprType(Expr *E) { 488678edf515544f0b9dddf69d6c1678fd83e94d8352Douglas Gregor ObjCMessageExpr *Msg = dyn_cast_or_null<ObjCMessageExpr>(E); 488722f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor if (!Msg) 488822f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor return 0; 488922f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor 489022f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor Selector Sel = Msg->getSelector(); 489122f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor if (Sel.isNull()) 489222f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor return 0; 489322f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor 489422f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor IdentifierInfo *Id = Sel.getIdentifierInfoForSlot(0); 489522f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor if (!Id) 489622f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor return 0; 489722f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor 489822f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor ObjCMethodDecl *Method = Msg->getMethodDecl(); 489922f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor if (!Method) 490022f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor return 0; 490122f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor 490222f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor // Determine the class that we're sending the message to. 490304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor ObjCInterfaceDecl *IFace = 0; 490404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor switch (Msg->getReceiverKind()) { 490504badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor case ObjCMessageExpr::Class: 4906c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (const ObjCObjectType *ObjType 4907c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall = Msg->getClassReceiver()->getAs<ObjCObjectType>()) 4908c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall IFace = ObjType->getInterface(); 490904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor break; 491004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor 491104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor case ObjCMessageExpr::Instance: { 491204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor QualType T = Msg->getInstanceReceiver()->getType(); 491304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor if (const ObjCObjectPointerType *Ptr = T->getAs<ObjCObjectPointerType>()) 491404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor IFace = Ptr->getInterfaceDecl(); 491504badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor break; 491604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor } 491704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor 491804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor case ObjCMessageExpr::SuperInstance: 491904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor case ObjCMessageExpr::SuperClass: 492004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor break; 492122f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor } 492222f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor 492322f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor if (!IFace) 492422f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor return 0; 492522f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor 492622f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor ObjCInterfaceDecl *Super = IFace->getSuperClass(); 492722f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor if (Method->isInstanceMethod()) 492822f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor return llvm::StringSwitch<ObjCInterfaceDecl *>(Id->getName()) 492922f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("retain", IFace) 4930f85e193739c953358c865005855253af4f68a497John McCall .Case("strong", IFace) 493122f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("autorelease", IFace) 493222f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("copy", IFace) 493322f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("copyWithZone", IFace) 493422f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("mutableCopy", IFace) 493522f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("mutableCopyWithZone", IFace) 493622f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("awakeFromCoder", IFace) 493722f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("replacementObjectFromCoder", IFace) 493822f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("class", IFace) 493922f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("classForCoder", IFace) 494022f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("superclass", Super) 494122f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Default(0); 494222f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor 494322f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor return llvm::StringSwitch<ObjCInterfaceDecl *>(Id->getName()) 494422f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("new", IFace) 494522f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("alloc", IFace) 494622f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("allocWithZone", IFace) 494722f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("class", IFace) 494822f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("superclass", Super) 494922f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Default(0); 495022f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor} 495122f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor 495203d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor// Add a special completion for a message send to "super", which fills in the 495303d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor// most likely case of forwarding all of our arguments to the superclass 495403d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor// function. 495503d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// 495603d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// \param S The semantic analysis object. 495703d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// 495803d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// \param S NeedSuperKeyword Whether we need to prefix this completion with 495903d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// the "super" keyword. Otherwise, we just need to provide the arguments. 496003d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// 496103d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// \param SelIdents The identifiers in the selector that have already been 496203d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// provided as arguments for a send to "super". 496303d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// 496403d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// \param NumSelIdents The number of identifiers in \p SelIdents. 496503d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// 496603d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// \param Results The set of results to augment. 496703d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// 496803d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// \returns the Objective-C method declaration that would be invoked by 496903d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// this "super" completion. If NULL, no completion was added. 497003d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregorstatic ObjCMethodDecl *AddSuperSendCompletion(Sema &S, bool NeedSuperKeyword, 497103d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor IdentifierInfo **SelIdents, 497203d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor unsigned NumSelIdents, 497303d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor ResultBuilder &Results) { 497403d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor ObjCMethodDecl *CurMethod = S.getCurMethodDecl(); 497503d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (!CurMethod) 497603d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor return 0; 497703d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 497803d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor ObjCInterfaceDecl *Class = CurMethod->getClassInterface(); 497903d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (!Class) 498003d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor return 0; 498103d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 498203d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor // Try to find a superclass method with the same selector. 498303d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor ObjCMethodDecl *SuperMethod = 0; 498478bcd9139f4b35be75190446c95614120d9b4c09Douglas Gregor while ((Class = Class->getSuperClass()) && !SuperMethod) { 498578bcd9139f4b35be75190446c95614120d9b4c09Douglas Gregor // Check in the class 498603d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor SuperMethod = Class->getMethod(CurMethod->getSelector(), 498703d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor CurMethod->isInstanceMethod()); 498803d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 498978bcd9139f4b35be75190446c95614120d9b4c09Douglas Gregor // Check in categories or class extensions. 499078bcd9139f4b35be75190446c95614120d9b4c09Douglas Gregor if (!SuperMethod) { 499178bcd9139f4b35be75190446c95614120d9b4c09Douglas Gregor for (ObjCCategoryDecl *Category = Class->getCategoryList(); Category; 499278bcd9139f4b35be75190446c95614120d9b4c09Douglas Gregor Category = Category->getNextClassCategory()) 499378bcd9139f4b35be75190446c95614120d9b4c09Douglas Gregor if ((SuperMethod = Category->getMethod(CurMethod->getSelector(), 499478bcd9139f4b35be75190446c95614120d9b4c09Douglas Gregor CurMethod->isInstanceMethod()))) 499578bcd9139f4b35be75190446c95614120d9b4c09Douglas Gregor break; 499678bcd9139f4b35be75190446c95614120d9b4c09Douglas Gregor } 499778bcd9139f4b35be75190446c95614120d9b4c09Douglas Gregor } 499878bcd9139f4b35be75190446c95614120d9b4c09Douglas Gregor 499903d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (!SuperMethod) 500003d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor return 0; 500103d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 500203d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor // Check whether the superclass method has the same signature. 500303d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (CurMethod->param_size() != SuperMethod->param_size() || 500403d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor CurMethod->isVariadic() != SuperMethod->isVariadic()) 500503d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor return 0; 500603d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 500703d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor for (ObjCMethodDecl::param_iterator CurP = CurMethod->param_begin(), 500803d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor CurPEnd = CurMethod->param_end(), 500903d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor SuperP = SuperMethod->param_begin(); 501003d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor CurP != CurPEnd; ++CurP, ++SuperP) { 501103d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor // Make sure the parameter types are compatible. 501203d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (!S.Context.hasSameUnqualifiedType((*CurP)->getType(), 501303d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor (*SuperP)->getType())) 501403d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor return 0; 501503d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 501603d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor // Make sure we have a parameter name to forward! 501703d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (!(*CurP)->getIdentifier()) 501803d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor return 0; 501903d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor } 502003d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 502103d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor // We have a superclass method. Now, form the send-to-super completion. 5022218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder Builder(Results.getAllocator()); 502303d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 502403d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor // Give this completion a return type. 50258987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor AddResultTypeChunk(S.Context, getCompletionPrintingPolicy(S), SuperMethod, 50268987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor Builder); 502703d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 502803d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor // If we need the "super" keyword, add it (plus some spacing). 502903d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (NeedSuperKeyword) { 5030218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("super"); 5031218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 503203d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor } 503303d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 503403d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor Selector Sel = CurMethod->getSelector(); 503503d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (Sel.isUnarySelector()) { 503603d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (NeedSuperKeyword) 5037dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddTextChunk(Builder.getAllocator().CopyString( 5038813d8346529bf094eb2b249648906ba7fd226688Douglas Gregor Sel.getNameForSlot(0))); 503903d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor else 5040dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddTypedTextChunk(Builder.getAllocator().CopyString( 5041813d8346529bf094eb2b249648906ba7fd226688Douglas Gregor Sel.getNameForSlot(0))); 504203d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor } else { 504303d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor ObjCMethodDecl::param_iterator CurP = CurMethod->param_begin(); 504403d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor for (unsigned I = 0, N = Sel.getNumArgs(); I != N; ++I, ++CurP) { 504503d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (I > NumSelIdents) 5046218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 504703d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 504803d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (I < NumSelIdents) 5049218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddInformativeChunk( 5050dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.getAllocator().CopyString( 5051813d8346529bf094eb2b249648906ba7fd226688Douglas Gregor Sel.getNameForSlot(I) + ":")); 505203d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor else if (NeedSuperKeyword || I > NumSelIdents) { 5053218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk( 5054dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.getAllocator().CopyString( 5055813d8346529bf094eb2b249648906ba7fd226688Douglas Gregor Sel.getNameForSlot(I) + ":")); 5056dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddPlaceholderChunk(Builder.getAllocator().CopyString( 5057218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor (*CurP)->getIdentifier()->getName())); 505803d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor } else { 5059218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk( 5060dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.getAllocator().CopyString( 5061813d8346529bf094eb2b249648906ba7fd226688Douglas Gregor Sel.getNameForSlot(I) + ":")); 5062dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddPlaceholderChunk(Builder.getAllocator().CopyString( 5063218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor (*CurP)->getIdentifier()->getName())); 506403d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor } 506503d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor } 506603d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor } 506703d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 5068218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(CodeCompletionResult(Builder.TakeString(), CCP_SuperCompletion, 506903d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor SuperMethod->isInstanceMethod() 507003d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor ? CXCursor_ObjCInstanceMethodDecl 507103d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor : CXCursor_ObjCClassMethodDecl)); 507203d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor return SuperMethod; 507303d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor} 507403d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 50758e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregorvoid Sema::CodeCompleteObjCMessageReceiver(Scope *S) { 50760a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 5077218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5078218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_ObjCMessageReceiver, 507981f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor getLangOptions().CPlusPlus0x 508081f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor ? &ResultBuilder::IsObjCMessageReceiverOrLambdaCapture 508181f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor : &ResultBuilder::IsObjCMessageReceiver); 50828e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 50838e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 50848e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor Results.EnterNewScope(); 50858071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 50868071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompleter->includeGlobals()); 50878e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 50888e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor // If we are in an Objective-C method inside a class that has a superclass, 50898e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor // add "super" as an option. 50908e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor if (ObjCMethodDecl *Method = getCurMethodDecl()) 50918e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor if (ObjCInterfaceDecl *Iface = Method->getClassInterface()) 509203d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (Iface->getSuperClass()) { 50938e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor Results.AddResult(Result("super")); 509403d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 509503d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor AddSuperSendCompletion(*this, /*NeedSuperKeyword=*/true, 0, 0, Results); 509603d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor } 50978e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 509881f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor if (getLangOptions().CPlusPlus0x) 509981f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor addThisCompletion(*this, Results); 510081f3bff7c202d688c9298bc049fdb5b6f77057b1Douglas Gregor 51018e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor Results.ExitScope(); 51028e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 51038e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor if (CodeCompleter->includeMacros()) 51048e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor AddMacroResults(PP, Results); 5105cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 5106e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(), Results.size()); 51078e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 51088e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor} 51098e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 51102725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregorvoid Sema::CodeCompleteObjCSuperMessage(Scope *S, SourceLocation SuperLoc, 5111d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor IdentifierInfo **SelIdents, 511270c5ac70ace21b011dc2d4001bae26cdcf62ff8dDouglas Gregor unsigned NumSelIdents, 511370c5ac70ace21b011dc2d4001bae26cdcf62ff8dDouglas Gregor bool AtArgumentExpression) { 511424a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor ObjCInterfaceDecl *CDecl = 0; 51152725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) { 51162725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // Figure out which interface we're in. 51172725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor CDecl = CurMethod->getClassInterface(); 51182725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (!CDecl) 51192725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor return; 51202725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor 51212725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // Find the superclass of this class. 51222725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor CDecl = CDecl->getSuperClass(); 51232725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (!CDecl) 51242725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor return; 512524a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor 51262725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (CurMethod->isInstanceMethod()) { 51272725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // We are inside an instance method, which means that the message 51282725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // send [super ...] is actually calling an instance method on the 51296b0656a7c386662e1bec5f23a3bd0bf2687a9635Douglas Gregor // current object. 51306b0656a7c386662e1bec5f23a3bd0bf2687a9635Douglas Gregor return CodeCompleteObjCInstanceMessage(S, 0, 513103d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor SelIdents, NumSelIdents, 513270c5ac70ace21b011dc2d4001bae26cdcf62ff8dDouglas Gregor AtArgumentExpression, 51336b0656a7c386662e1bec5f23a3bd0bf2687a9635Douglas Gregor CDecl); 51342725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor } 513524a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor 51362725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // Fall through to send to the superclass in CDecl. 51372725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor } else { 51382725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // "super" may be the name of a type or variable. Figure out which 51392725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // it is. 51402725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor IdentifierInfo *Super = &Context.Idents.get("super"); 51412725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor NamedDecl *ND = LookupSingleName(S, Super, SuperLoc, 51422725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor LookupOrdinaryName); 51432725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if ((CDecl = dyn_cast_or_null<ObjCInterfaceDecl>(ND))) { 51442725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // "super" names an interface. Use it. 51452725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor } else if (TypeDecl *TD = dyn_cast_or_null<TypeDecl>(ND)) { 5146c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (const ObjCObjectType *Iface 5147c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall = Context.getTypeDeclType(TD)->getAs<ObjCObjectType>()) 5148c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall CDecl = Iface->getInterface(); 51492725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor } else if (ND && isa<UnresolvedUsingTypenameDecl>(ND)) { 51502725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // "super" names an unresolved type; we can't be more specific. 51512725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor } else { 51522725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // Assume that "super" names some kind of value and parse that way. 51532725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor CXXScopeSpec SS; 5154e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara SourceLocation TemplateKWLoc; 51552725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor UnqualifiedId id; 51562725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor id.setIdentifier(Super, SuperLoc); 5157e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara ExprResult SuperExpr = ActOnIdExpression(S, SS, TemplateKWLoc, id, 5158e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara false, false); 51592725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor return CodeCompleteObjCInstanceMessage(S, (Expr *)SuperExpr.get(), 516070c5ac70ace21b011dc2d4001bae26cdcf62ff8dDouglas Gregor SelIdents, NumSelIdents, 516170c5ac70ace21b011dc2d4001bae26cdcf62ff8dDouglas Gregor AtArgumentExpression); 51622725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor } 516324a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor 51642725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // Fall through 516524a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor } 516624a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor 5167b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall ParsedType Receiver; 51682725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (CDecl) 5169b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall Receiver = ParsedType::make(Context.getObjCInterfaceType(CDecl)); 51702725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor return CodeCompleteObjCClassMessage(S, Receiver, SelIdents, 517170c5ac70ace21b011dc2d4001bae26cdcf62ff8dDouglas Gregor NumSelIdents, AtArgumentExpression, 517270c5ac70ace21b011dc2d4001bae26cdcf62ff8dDouglas Gregor /*IsSuper=*/true); 51732725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor} 51742725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor 5175b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor/// \brief Given a set of code-completion results for the argument of a message 5176b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor/// send, determine the preferred type (if any) for that argument expression. 5177b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregorstatic QualType getPreferredArgumentTypeForMessageSend(ResultBuilder &Results, 5178b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor unsigned NumSelIdents) { 5179b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor typedef CodeCompletionResult Result; 5180b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor ASTContext &Context = Results.getSema().Context; 5181b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor 5182b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor QualType PreferredType; 5183b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor unsigned BestPriority = CCP_Unlikely * 2; 5184b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor Result *ResultsData = Results.data(); 5185b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor for (unsigned I = 0, N = Results.size(); I != N; ++I) { 5186b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor Result &R = ResultsData[I]; 5187b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor if (R.Kind == Result::RK_Declaration && 5188b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor isa<ObjCMethodDecl>(R.Declaration)) { 5189b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor if (R.Priority <= BestPriority) { 5190b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor ObjCMethodDecl *Method = cast<ObjCMethodDecl>(R.Declaration); 5191b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor if (NumSelIdents <= Method->param_size()) { 5192b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor QualType MyPreferredType = Method->param_begin()[NumSelIdents - 1] 5193b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor ->getType(); 5194b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor if (R.Priority < BestPriority || PreferredType.isNull()) { 5195b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor BestPriority = R.Priority; 5196b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor PreferredType = MyPreferredType; 5197b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor } else if (!Context.hasSameUnqualifiedType(PreferredType, 5198b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor MyPreferredType)) { 5199b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor PreferredType = QualType(); 5200b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor } 5201b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor } 5202b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor } 5203b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor } 5204b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor } 5205b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor 5206b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor return PreferredType; 5207b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor} 5208b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor 5209c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregorstatic void AddClassMessageCompletions(Sema &SemaRef, Scope *S, 5210c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor ParsedType Receiver, 5211c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor IdentifierInfo **SelIdents, 5212c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor unsigned NumSelIdents, 521370c5ac70ace21b011dc2d4001bae26cdcf62ff8dDouglas Gregor bool AtArgumentExpression, 5214c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor bool IsSuper, 5215c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor ResultBuilder &Results) { 52160a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 52172725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor ObjCInterfaceDecl *CDecl = 0; 5218c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor 521924a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor // If the given name refers to an interface type, retrieve the 522024a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor // corresponding declaration. 52212725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (Receiver) { 5222c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor QualType T = SemaRef.GetTypeFromParser(Receiver, 0); 52232725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (!T.isNull()) 5224c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (const ObjCObjectType *Interface = T->getAs<ObjCObjectType>()) 5225c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall CDecl = Interface->getInterface(); 522624a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor } 5227c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor 522836ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add all of the factory methods in this Objective-C class, its protocols, 522936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // superclasses, categories, implementation, etc. 5230c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff Results.EnterNewScope(); 5231c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor 523203d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor // If this is a send-to-super, try to add the special "super" send 523303d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor // completion. 523403d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (IsSuper) { 523503d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (ObjCMethodDecl *SuperMethod 5236c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor = AddSuperSendCompletion(SemaRef, false, SelIdents, NumSelIdents, 5237c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor Results)) 523803d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor Results.Ignore(SuperMethod); 523903d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor } 5240c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor 5241265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor // If we're inside an Objective-C method definition, prefer its selector to 5242265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor // others. 5243c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor if (ObjCMethodDecl *CurMethod = SemaRef.getCurMethodDecl()) 5244265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor Results.setPreferredSelector(CurMethod->getSelector()); 5245c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor 5246d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor VisitedSelectorSet Selectors; 524713438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor if (CDecl) 5248c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor AddObjCMethods(CDecl, false, MK_Any, SelIdents, NumSelIdents, 5249cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor SemaRef.CurContext, Selectors, AtArgumentExpression, 5250cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor Results); 52512725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor else { 525213438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor // We're messaging "id" as a type; provide all class/factory methods. 5253c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor 5254719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor // If we have an external source, load the entire class method 52553c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl // pool from the AST file. 5256c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor if (SemaRef.ExternalSource) { 5257c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor for (uint32_t I = 0, 5258c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor N = SemaRef.ExternalSource->GetNumExternalSelectors(); 525976bd1f387e6a7b7abfe53f63b3bd429b97bb80f0John McCall I != N; ++I) { 5260c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor Selector Sel = SemaRef.ExternalSource->GetExternalSelector(I); 5261c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor if (Sel.isNull() || SemaRef.MethodPool.count(Sel)) 5262719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor continue; 5263c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor 5264c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor SemaRef.ReadMethodPool(Sel); 5265719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor } 5266719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor } 5267c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor 5268c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor for (Sema::GlobalMethodPool::iterator M = SemaRef.MethodPool.begin(), 5269c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor MEnd = SemaRef.MethodPool.end(); 5270db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl M != MEnd; ++M) { 5271db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl for (ObjCMethodList *MethList = &M->second.second; 5272db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl MethList && MethList->Method; 527313438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor MethList = MethList->Next) { 527413438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor if (!isAcceptableObjCMethod(MethList->Method, MK_Any, SelIdents, 527513438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor NumSelIdents)) 527613438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor continue; 5277c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor 527813438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor Result R(MethList->Method, 0); 527913438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor R.StartParameter = NumSelIdents; 528013438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor R.AllParametersAreInformative = false; 5281c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor Results.MaybeAddResult(R, SemaRef.CurContext); 528213438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor } 528313438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor } 528413438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor } 5285c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor 5286c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor Results.ExitScope(); 5287c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor} 528813438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor 5289c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregorvoid Sema::CodeCompleteObjCClassMessage(Scope *S, ParsedType Receiver, 5290c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor IdentifierInfo **SelIdents, 5291c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor unsigned NumSelIdents, 529270c5ac70ace21b011dc2d4001bae26cdcf62ff8dDouglas Gregor bool AtArgumentExpression, 5293c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor bool IsSuper) { 5294e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor 5295e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor QualType T = this->GetTypeFromParser(Receiver); 5296e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor 5297218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5298e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor CodeCompletionContext(CodeCompletionContext::CCC_ObjCClassMessage, 52990a47d69af8bda945352997af3da4687a3356096aDouglas Gregor T, SelIdents, NumSelIdents)); 5300e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor 530170c5ac70ace21b011dc2d4001bae26cdcf62ff8dDouglas Gregor AddClassMessageCompletions(*this, S, Receiver, SelIdents, NumSelIdents, 530270c5ac70ace21b011dc2d4001bae26cdcf62ff8dDouglas Gregor AtArgumentExpression, IsSuper, Results); 5303b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor 5304b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor // If we're actually at the argument expression (rather than prior to the 5305b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor // selector), we're actually performing code completion for an expression. 5306b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor // Determine whether we have a single, best method. If so, we can 5307b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor // code-complete the expression using the corresponding parameter type as 5308b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor // our preferred type, improving completion results. 5309b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor if (AtArgumentExpression) { 5310b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor QualType PreferredType = getPreferredArgumentTypeForMessageSend(Results, 5311e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor NumSelIdents); 5312b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor if (PreferredType.isNull()) 5313b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor CodeCompleteOrdinaryName(S, PCC_Expression); 5314b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor else 5315b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor CodeCompleteExpression(S, PreferredType); 5316b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor return; 5317b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor } 5318b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor 5319e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 5320e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor Results.getCompletionContext(), 532103d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor Results.data(), Results.size()); 5322c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff} 5323c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff 5324f81e5a9e3f3ff80c56e4afb4fe6311a8735f36e8Richard Trieuvoid Sema::CodeCompleteObjCInstanceMessage(Scope *S, Expr *Receiver, 5325d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor IdentifierInfo **SelIdents, 532603d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor unsigned NumSelIdents, 532770c5ac70ace21b011dc2d4001bae26cdcf62ff8dDouglas Gregor bool AtArgumentExpression, 53286b0656a7c386662e1bec5f23a3bd0bf2687a9635Douglas Gregor ObjCInterfaceDecl *Super) { 53290a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 5330c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff 5331c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff Expr *RecExpr = static_cast<Expr *>(Receiver); 5332c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff 533336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // If necessary, apply function/array conversion to the receiver. 533436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // C99 6.7.5.3p[7,8]. 5335429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley if (RecExpr) { 5336429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley ExprResult Conv = DefaultFunctionArrayLvalueConversion(RecExpr); 5337429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley if (Conv.isInvalid()) // conversion failed. bail. 5338429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley return; 5339429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley RecExpr = Conv.take(); 5340429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley } 53416b0656a7c386662e1bec5f23a3bd0bf2687a9635Douglas Gregor QualType ReceiverType = RecExpr? RecExpr->getType() 53426b0656a7c386662e1bec5f23a3bd0bf2687a9635Douglas Gregor : Super? Context.getObjCObjectPointerType( 53436b0656a7c386662e1bec5f23a3bd0bf2687a9635Douglas Gregor Context.getObjCInterfaceType(Super)) 53446b0656a7c386662e1bec5f23a3bd0bf2687a9635Douglas Gregor : Context.getObjCIdType(); 5345c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff 5346da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor // If we're messaging an expression with type "id" or "Class", check 5347da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor // whether we know something special about the receiver that allows 5348da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor // us to assume a more-specific receiver type. 5349da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor if (ReceiverType->isObjCIdType() || ReceiverType->isObjCClassType()) 5350da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor if (ObjCInterfaceDecl *IFace = GetAssumedMessageSendExprType(RecExpr)) { 5351da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor if (ReceiverType->isObjCClassType()) 5352da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor return CodeCompleteObjCClassMessage(S, 5353da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor ParsedType::make(Context.getObjCInterfaceType(IFace)), 5354da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor SelIdents, NumSelIdents, 5355da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor AtArgumentExpression, Super); 5356da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor 5357da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor ReceiverType = Context.getObjCObjectPointerType( 5358da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor Context.getObjCInterfaceType(IFace)); 5359da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor } 5360da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor 536136ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Build the set of methods we can see. 5362218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5363e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor CodeCompletionContext(CodeCompletionContext::CCC_ObjCInstanceMessage, 53640a47d69af8bda945352997af3da4687a3356096aDouglas Gregor ReceiverType, SelIdents, NumSelIdents)); 5365e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor 536636ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor Results.EnterNewScope(); 536722f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor 536803d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor // If this is a send-to-super, try to add the special "super" send 536903d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor // completion. 53706b0656a7c386662e1bec5f23a3bd0bf2687a9635Douglas Gregor if (Super) { 537103d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (ObjCMethodDecl *SuperMethod 537203d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor = AddSuperSendCompletion(*this, false, SelIdents, NumSelIdents, 537303d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor Results)) 537403d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor Results.Ignore(SuperMethod); 537503d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor } 537603d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 5377265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor // If we're inside an Objective-C method definition, prefer its selector to 5378265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor // others. 5379265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) 5380265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor Results.setPreferredSelector(CurMethod->getSelector()); 538136ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 5382d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor // Keep track of the selectors we've already added. 5383d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor VisitedSelectorSet Selectors; 5384d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor 5385f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // Handle messages to Class. This really isn't a message to an instance 5386f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // method, so we treat it the same way we would treat a message send to a 5387f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // class method. 5388f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor if (ReceiverType->isObjCClassType() || 5389f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor ReceiverType->isObjCQualifiedClassType()) { 5390f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) { 5391f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor if (ObjCInterfaceDecl *ClassDecl = CurMethod->getClassInterface()) 53924ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(ClassDecl, false, MK_Any, SelIdents, NumSelIdents, 5393cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor CurContext, Selectors, AtArgumentExpression, Results); 5394f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor } 5395f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor } 5396f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // Handle messages to a qualified ID ("id<foo>"). 5397f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor else if (const ObjCObjectPointerType *QualID 5398f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor = ReceiverType->getAsObjCQualifiedIdType()) { 5399f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // Search protocols for instance methods. 5400f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor for (ObjCObjectPointerType::qual_iterator I = QualID->qual_begin(), 5401f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor E = QualID->qual_end(); 5402f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor I != E; ++I) 54034ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(*I, true, MK_Any, SelIdents, NumSelIdents, CurContext, 5404cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor Selectors, AtArgumentExpression, Results); 5405f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor } 5406f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // Handle messages to a pointer to interface type. 5407f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor else if (const ObjCObjectPointerType *IFacePtr 5408f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor = ReceiverType->getAsObjCInterfacePointerType()) { 5409f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // Search the class, its superclasses, etc., for instance methods. 54104ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(IFacePtr->getInterfaceDecl(), true, MK_Any, SelIdents, 5411cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor NumSelIdents, CurContext, Selectors, AtArgumentExpression, 5412cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor Results); 5413f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor 5414f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // Search protocols for instance methods. 5415f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor for (ObjCObjectPointerType::qual_iterator I = IFacePtr->qual_begin(), 5416f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor E = IFacePtr->qual_end(); 5417f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor I != E; ++I) 54184ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(*I, true, MK_Any, SelIdents, NumSelIdents, CurContext, 5419cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor Selectors, AtArgumentExpression, Results); 5420f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor } 542113438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor // Handle messages to "id". 542213438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor else if (ReceiverType->isObjCIdType()) { 5423719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor // We're messaging "id", so provide all instance methods we know 5424719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor // about as code-completion results. 5425719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor 5426719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor // If we have an external source, load the entire class method 54273c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl // pool from the AST file. 5428719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor if (ExternalSource) { 542976bd1f387e6a7b7abfe53f63b3bd429b97bb80f0John McCall for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors(); 543076bd1f387e6a7b7abfe53f63b3bd429b97bb80f0John McCall I != N; ++I) { 543176bd1f387e6a7b7abfe53f63b3bd429b97bb80f0John McCall Selector Sel = ExternalSource->GetExternalSelector(I); 5432db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl if (Sel.isNull() || MethodPool.count(Sel)) 5433719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor continue; 5434719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor 5435db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl ReadMethodPool(Sel); 5436719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor } 5437719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor } 5438719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor 5439db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl for (GlobalMethodPool::iterator M = MethodPool.begin(), 5440db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl MEnd = MethodPool.end(); 5441db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl M != MEnd; ++M) { 5442db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl for (ObjCMethodList *MethList = &M->second.first; 5443db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl MethList && MethList->Method; 544413438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor MethList = MethList->Next) { 544513438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor if (!isAcceptableObjCMethod(MethList->Method, MK_Any, SelIdents, 544613438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor NumSelIdents)) 544713438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor continue; 5448d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor 5449d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor if (!Selectors.insert(MethList->Method->getSelector())) 5450d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor continue; 5451d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor 545213438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor Result R(MethList->Method, 0); 545313438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor R.StartParameter = NumSelIdents; 545413438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor R.AllParametersAreInformative = false; 545513438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor Results.MaybeAddResult(R, CurContext); 545613438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor } 545713438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor } 545813438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor } 5459f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor Results.ExitScope(); 5460b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor 5461b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor 5462b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor // If we're actually at the argument expression (rather than prior to the 5463b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor // selector), we're actually performing code completion for an expression. 5464b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor // Determine whether we have a single, best method. If so, we can 5465b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor // code-complete the expression using the corresponding parameter type as 5466b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor // our preferred type, improving completion results. 5467b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor if (AtArgumentExpression) { 5468b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor QualType PreferredType = getPreferredArgumentTypeForMessageSend(Results, 5469b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor NumSelIdents); 5470b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor if (PreferredType.isNull()) 5471b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor CodeCompleteOrdinaryName(S, PCC_Expression); 5472b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor else 5473b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor CodeCompleteExpression(S, PreferredType); 5474b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor return; 5475b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor } 5476b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor 5477e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 5478e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor Results.getCompletionContext(), 5479e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 5480c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff} 548155385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor 5482fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregorvoid Sema::CodeCompleteObjCForCollection(Scope *S, 5483fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor DeclGroupPtrTy IterationVar) { 5484fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor CodeCompleteExpressionData Data; 5485fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor Data.ObjCCollection = true; 5486fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor 5487fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor if (IterationVar.getAsOpaquePtr()) { 5488fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor DeclGroupRef DG = IterationVar.getAsVal<DeclGroupRef>(); 5489fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor for (DeclGroupRef::iterator I = DG.begin(), End = DG.end(); I != End; ++I) { 5490fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor if (*I) 5491fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor Data.IgnoreDecls.push_back(*I); 5492fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor } 5493fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor } 5494fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor 5495fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor CodeCompleteExpression(S, Data); 5496fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor} 5497fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor 5498458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregorvoid Sema::CodeCompleteObjCSelector(Scope *S, IdentifierInfo **SelIdents, 5499458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor unsigned NumSelIdents) { 5500458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor // If we have an external source, load the entire class method 5501458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor // pool from the AST file. 5502458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor if (ExternalSource) { 5503458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors(); 5504458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor I != N; ++I) { 5505458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor Selector Sel = ExternalSource->GetExternalSelector(I); 5506458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor if (Sel.isNull() || MethodPool.count(Sel)) 5507458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor continue; 5508458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor 5509458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor ReadMethodPool(Sel); 5510458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor } 5511458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor } 5512458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor 5513218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5514218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_SelectorName); 5515458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor Results.EnterNewScope(); 5516458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor for (GlobalMethodPool::iterator M = MethodPool.begin(), 5517458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor MEnd = MethodPool.end(); 5518458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor M != MEnd; ++M) { 5519458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor 5520458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor Selector Sel = M->first; 5521458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor if (!isAcceptableObjCSelector(Sel, MK_Any, SelIdents, NumSelIdents)) 5522458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor continue; 5523458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor 5524218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder Builder(Results.getAllocator()); 5525458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor if (Sel.isUnarySelector()) { 5526dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddTypedTextChunk(Builder.getAllocator().CopyString( 5527813d8346529bf094eb2b249648906ba7fd226688Douglas Gregor Sel.getNameForSlot(0))); 5528218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 5529458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor continue; 5530458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor } 5531458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor 55322d9e21f4675232a39a39611a5b4bb1f4914b2742Douglas Gregor std::string Accumulator; 5533458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor for (unsigned I = 0, N = Sel.getNumArgs(); I != N; ++I) { 55342d9e21f4675232a39a39611a5b4bb1f4914b2742Douglas Gregor if (I == NumSelIdents) { 55352d9e21f4675232a39a39611a5b4bb1f4914b2742Douglas Gregor if (!Accumulator.empty()) { 5536dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddInformativeChunk(Builder.getAllocator().CopyString( 5537218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Accumulator)); 55382d9e21f4675232a39a39611a5b4bb1f4914b2742Douglas Gregor Accumulator.clear(); 55392d9e21f4675232a39a39611a5b4bb1f4914b2742Douglas Gregor } 55402d9e21f4675232a39a39611a5b4bb1f4914b2742Douglas Gregor } 55412d9e21f4675232a39a39611a5b4bb1f4914b2742Douglas Gregor 5542a0651c5f5d1c8928d3ae062435ed9cf0aa0d04baBenjamin Kramer Accumulator += Sel.getNameForSlot(I); 55432d9e21f4675232a39a39611a5b4bb1f4914b2742Douglas Gregor Accumulator += ':'; 5544458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor } 5545dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddTypedTextChunk(Builder.getAllocator().CopyString( Accumulator)); 5546218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 5547458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor } 5548458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor Results.ExitScope(); 5549458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor 5550458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 5551458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor CodeCompletionContext::CCC_SelectorName, 5552458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor Results.data(), Results.size()); 5553458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor} 5554458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor 555555385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor/// \brief Add all of the protocol declarations that we find in the given 555655385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor/// (translation unit) context. 555755385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregorstatic void AddProtocolResults(DeclContext *Ctx, DeclContext *CurContext, 5558083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor bool OnlyForwardDeclarations, 555955385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor ResultBuilder &Results) { 55600a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 556155385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor 556255385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor for (DeclContext::decl_iterator D = Ctx->decls_begin(), 556355385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor DEnd = Ctx->decls_end(); 556455385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor D != DEnd; ++D) { 556555385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor // Record any protocols we find. 556655385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor if (ObjCProtocolDecl *Proto = dyn_cast<ObjCProtocolDecl>(*D)) 55675e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor if (!OnlyForwardDeclarations || !Proto->hasDefinition()) 5568608300be1972c43fe99154d25d62d697e7c0a0c2Douglas Gregor Results.AddResult(Result(Proto, 0), CurContext, 0, false); 556955385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor } 557055385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor} 557155385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor 557255385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregorvoid Sema::CodeCompleteObjCProtocolReferences(IdentifierLocPair *Protocols, 557355385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor unsigned NumProtocols) { 5574218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5575218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_ObjCProtocolName); 557655385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor 557770c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor if (CodeCompleter && CodeCompleter->includeGlobals()) { 557870c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor Results.EnterNewScope(); 557970c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor 558070c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor // Tell the result set to ignore all of the protocols we have 558170c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor // already seen. 558270c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor // FIXME: This doesn't work when caching code-completion results. 558370c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor for (unsigned I = 0; I != NumProtocols; ++I) 558470c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor if (ObjCProtocolDecl *Protocol = LookupProtocol(Protocols[I].first, 558570c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor Protocols[I].second)) 558670c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor Results.Ignore(Protocol); 558770c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor 558870c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor // Add all protocols. 558970c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor AddProtocolResults(Context.getTranslationUnitDecl(), CurContext, false, 559070c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor Results); 5591083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor 559270c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor Results.ExitScope(); 559370c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor } 559470c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor 5595e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 5596e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_ObjCProtocolName, 5597e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 5598083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor} 5599083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor 5600083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregorvoid Sema::CodeCompleteObjCProtocolDecl(Scope *) { 5601218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5602218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_ObjCProtocolName); 5603083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor 560470c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor if (CodeCompleter && CodeCompleter->includeGlobals()) { 560570c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor Results.EnterNewScope(); 560670c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor 560770c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor // Add all protocols. 560870c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor AddProtocolResults(Context.getTranslationUnitDecl(), CurContext, true, 560970c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor Results); 561055385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor 561170c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor Results.ExitScope(); 561270c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor } 561370c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor 5614e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 5615e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_ObjCProtocolName, 5616e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 561755385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor} 56183b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 56193b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor/// \brief Add all of the Objective-C interface declarations that we find in 56203b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor/// the given (translation unit) context. 56213b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregorstatic void AddInterfaceResults(DeclContext *Ctx, DeclContext *CurContext, 56223b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor bool OnlyForwardDeclarations, 56233b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor bool OnlyUnimplemented, 56243b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor ResultBuilder &Results) { 56250a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 56263b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 56273b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor for (DeclContext::decl_iterator D = Ctx->decls_begin(), 56283b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor DEnd = Ctx->decls_end(); 56293b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor D != DEnd; ++D) { 5630deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor // Record any interfaces we find. 5631deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor if (ObjCInterfaceDecl *Class = dyn_cast<ObjCInterfaceDecl>(*D)) 56327723fec9b45b7258c0eddf4cbfd0d335348f5edcDouglas Gregor if ((!OnlyForwardDeclarations || !Class->hasDefinition()) && 5633deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor (!OnlyUnimplemented || !Class->getImplementation())) 5634deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor Results.AddResult(Result(Class, 0), CurContext, 0, false); 56353b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor } 56363b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor} 56373b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 56383b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregorvoid Sema::CodeCompleteObjCInterfaceDecl(Scope *S) { 5639218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5640218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 56413b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.EnterNewScope(); 56423b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 56430f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor if (CodeCompleter->includeGlobals()) { 56440f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor // Add all classes. 56450f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false, 56460f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor false, Results); 56470f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor } 56480f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor 56493b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.ExitScope(); 56500f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor 5651e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 56520f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor CodeCompletionContext::CCC_ObjCInterfaceName, 5653e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 56543b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor} 56553b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 5656c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregorvoid Sema::CodeCompleteObjCSuperclass(Scope *S, IdentifierInfo *ClassName, 5657c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor SourceLocation ClassNameLoc) { 5658218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 56590f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor CodeCompletionContext::CCC_ObjCInterfaceName); 56603b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.EnterNewScope(); 56613b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 56623b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor // Make sure that we ignore the class we're currently defining. 56633b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor NamedDecl *CurClass 5664c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor = LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName); 566533ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor if (CurClass && isa<ObjCInterfaceDecl>(CurClass)) 56663b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.Ignore(CurClass); 56673b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 56680f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor if (CodeCompleter->includeGlobals()) { 56690f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor // Add all classes. 56700f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false, 56710f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor false, Results); 56720f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor } 56730f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor 56743b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.ExitScope(); 56750f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor 5676e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 56770f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor CodeCompletionContext::CCC_ObjCInterfaceName, 5678e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 56793b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor} 56803b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 56813b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregorvoid Sema::CodeCompleteObjCImplementationDecl(Scope *S) { 5682218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5683218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 56843b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.EnterNewScope(); 56853b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 56860f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor if (CodeCompleter->includeGlobals()) { 56870f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor // Add all unimplemented classes. 56880f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false, 56890f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor true, Results); 56900f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor } 56910f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor 56923b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.ExitScope(); 56930f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor 5694e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 56950f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor CodeCompletionContext::CCC_ObjCInterfaceName, 5696e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 56973b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor} 569833ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 569933ced0b8550f3e7169f326944731ee02e9338659Douglas Gregorvoid Sema::CodeCompleteObjCInterfaceCategory(Scope *S, 5700c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor IdentifierInfo *ClassName, 5701c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor SourceLocation ClassNameLoc) { 57020a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 570333ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 5704218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 57053da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CodeCompletionContext::CCC_ObjCCategoryName); 570633ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 570733ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // Ignore any categories we find that have already been implemented by this 570833ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // interface. 570933ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor llvm::SmallPtrSet<IdentifierInfo *, 16> CategoryNames; 571033ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor NamedDecl *CurClass 5711c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor = LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName); 571233ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor if (ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurClass)) 571333ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor for (ObjCCategoryDecl *Category = Class->getCategoryList(); Category; 571433ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Category = Category->getNextClassCategory()) 571533ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor CategoryNames.insert(Category->getIdentifier()); 571633ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 571733ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // Add all of the categories we know about. 571833ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Results.EnterNewScope(); 571933ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor TranslationUnitDecl *TU = Context.getTranslationUnitDecl(); 572033ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor for (DeclContext::decl_iterator D = TU->decls_begin(), 572133ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor DEnd = TU->decls_end(); 572233ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor D != DEnd; ++D) 572333ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(*D)) 572433ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor if (CategoryNames.insert(Category->getIdentifier())) 5725608300be1972c43fe99154d25d62d697e7c0a0c2Douglas Gregor Results.AddResult(Result(Category, 0), CurContext, 0, false); 572633ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Results.ExitScope(); 572733ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 5728e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 57293da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CodeCompletionContext::CCC_ObjCCategoryName, 5730e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 573133ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor} 573233ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 573333ced0b8550f3e7169f326944731ee02e9338659Douglas Gregorvoid Sema::CodeCompleteObjCImplementationCategory(Scope *S, 5734c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor IdentifierInfo *ClassName, 5735c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor SourceLocation ClassNameLoc) { 57360a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 573733ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 573833ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // Find the corresponding interface. If we couldn't find the interface, the 573933ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // program itself is ill-formed. However, we'll try to be helpful still by 574033ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // providing the list of all of the categories we know about. 574133ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor NamedDecl *CurClass 5742c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor = LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName); 574333ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurClass); 574433ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor if (!Class) 5745c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor return CodeCompleteObjCInterfaceCategory(S, ClassName, ClassNameLoc); 574633ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 5747218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 57483da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CodeCompletionContext::CCC_ObjCCategoryName); 574933ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 575033ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // Add all of the categories that have have corresponding interface 575133ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // declarations in this class and any of its superclasses, except for 575233ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // already-implemented categories in the class itself. 575333ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor llvm::SmallPtrSet<IdentifierInfo *, 16> CategoryNames; 575433ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Results.EnterNewScope(); 575533ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor bool IgnoreImplemented = true; 575633ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor while (Class) { 575733ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor for (ObjCCategoryDecl *Category = Class->getCategoryList(); Category; 575833ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Category = Category->getNextClassCategory()) 575933ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor if ((!IgnoreImplemented || !Category->getImplementation()) && 576033ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor CategoryNames.insert(Category->getIdentifier())) 5761608300be1972c43fe99154d25d62d697e7c0a0c2Douglas Gregor Results.AddResult(Result(Category, 0), CurContext, 0, false); 576233ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 576333ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Class = Class->getSuperClass(); 576433ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor IgnoreImplemented = false; 576533ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor } 576633ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Results.ExitScope(); 576733ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 5768e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 57693da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CodeCompletionContext::CCC_ObjCCategoryName, 5770e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 577133ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor} 5772322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 5773a28948f34817476d02412fa204cae038e228c827Fariborz Jahanianvoid Sema::CodeCompleteObjCPropertyDefinition(Scope *S) { 57740a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 5775218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5776218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 5777322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 5778322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Figure out where this @synthesize lives. 5779322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor ObjCContainerDecl *Container 5780a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian = dyn_cast_or_null<ObjCContainerDecl>(CurContext); 5781322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor if (!Container || 5782322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor (!isa<ObjCImplementationDecl>(Container) && 5783322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor !isa<ObjCCategoryImplDecl>(Container))) 5784322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor return; 5785322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 5786322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Ignore any properties that have already been implemented. 5787322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor for (DeclContext::decl_iterator D = Container->decls_begin(), 5788322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor DEnd = Container->decls_end(); 5789322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor D != DEnd; ++D) 5790322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor if (ObjCPropertyImplDecl *PropertyImpl = dyn_cast<ObjCPropertyImplDecl>(*D)) 5791322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Results.Ignore(PropertyImpl->getPropertyDecl()); 5792322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 5793322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Add any properties that we find. 57947344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor AddedPropertiesSet AddedProperties; 5795322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Results.EnterNewScope(); 5796322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor if (ObjCImplementationDecl *ClassImpl 5797322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor = dyn_cast<ObjCImplementationDecl>(Container)) 57984b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddObjCProperties(ClassImpl->getClassInterface(), false, 57994b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor /*AllowNullaryMethods=*/false, CurContext, 58007344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor AddedProperties, Results); 5801322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor else 5802322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor AddObjCProperties(cast<ObjCCategoryImplDecl>(Container)->getCategoryDecl(), 58034b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor false, /*AllowNullaryMethods=*/false, CurContext, 58044b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddedProperties, Results); 5805322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Results.ExitScope(); 5806322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 5807e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 5808e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 5809e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 5810322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor} 5811322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 5812322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregorvoid Sema::CodeCompleteObjCPropertySynthesizeIvar(Scope *S, 5813a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian IdentifierInfo *PropertyName) { 58140a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 5815218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5816218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 5817322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 5818322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Figure out where this @synthesize lives. 5819322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor ObjCContainerDecl *Container 5820a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian = dyn_cast_or_null<ObjCContainerDecl>(CurContext); 5821322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor if (!Container || 5822322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor (!isa<ObjCImplementationDecl>(Container) && 5823322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor !isa<ObjCCategoryImplDecl>(Container))) 5824322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor return; 5825322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 5826322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Figure out which interface we're looking into. 5827322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor ObjCInterfaceDecl *Class = 0; 5828322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor if (ObjCImplementationDecl *ClassImpl 5829322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor = dyn_cast<ObjCImplementationDecl>(Container)) 5830322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Class = ClassImpl->getClassInterface(); 5831322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor else 5832322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Class = cast<ObjCCategoryImplDecl>(Container)->getCategoryDecl() 5833322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor ->getClassInterface(); 5834322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 5835e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor // Determine the type of the property we're synthesizing. 5836e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor QualType PropertyType = Context.getObjCIdType(); 5837e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor if (Class) { 5838e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor if (ObjCPropertyDecl *Property 5839e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor = Class->FindPropertyDeclaration(PropertyName)) { 5840e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor PropertyType 5841e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor = Property->getType().getNonReferenceType().getUnqualifiedType(); 5842e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor 5843e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor // Give preference to ivars 5844e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor Results.setPreferredType(PropertyType); 5845e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor } 5846e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor } 5847e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor 5848322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Add all of the instance variables in this class and its superclasses. 5849322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Results.EnterNewScope(); 5850aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor bool SawSimilarlyNamedIvar = false; 5851aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor std::string NameWithPrefix; 5852aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor NameWithPrefix += '_'; 5853a0651c5f5d1c8928d3ae062435ed9cf0aa0d04baBenjamin Kramer NameWithPrefix += PropertyName->getName(); 5854aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor std::string NameWithSuffix = PropertyName->getName().str(); 5855aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor NameWithSuffix += '_'; 5856322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor for(; Class; Class = Class->getSuperClass()) { 5857aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor for (ObjCIvarDecl *Ivar = Class->all_declared_ivar_begin(); Ivar; 5858aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor Ivar = Ivar->getNextIvar()) { 5859e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor Results.AddResult(Result(Ivar, 0), CurContext, 0, false); 5860e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor 5861aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor // Determine whether we've seen an ivar with a name similar to the 5862aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor // property. 5863e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor if ((PropertyName == Ivar->getIdentifier() || 5864aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor NameWithPrefix == Ivar->getName() || 5865e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor NameWithSuffix == Ivar->getName())) { 5866aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor SawSimilarlyNamedIvar = true; 5867e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor 5868e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor // Reduce the priority of this result by one, to give it a slight 5869e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor // advantage over other results whose names don't match so closely. 5870e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor if (Results.size() && 5871e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor Results.data()[Results.size() - 1].Kind 5872e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor == CodeCompletionResult::RK_Declaration && 5873e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor Results.data()[Results.size() - 1].Declaration == Ivar) 5874e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor Results.data()[Results.size() - 1].Priority--; 5875e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor } 5876aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor } 5877322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor } 5878aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor 5879aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor if (!SawSimilarlyNamedIvar) { 5880aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor // Create ivar result _propName, that the user can use to synthesize 5881e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor // an ivar of the appropriate type. 5882e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor unsigned Priority = CCP_MemberDeclaration + 1; 5883aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor typedef CodeCompletionResult Result; 5884aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor CodeCompletionAllocator &Allocator = Results.getAllocator(); 5885aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor CodeCompletionBuilder Builder(Allocator, Priority,CXAvailability_Available); 5886aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor 58878987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor PrintingPolicy Policy = getCompletionPrintingPolicy(*this); 5888e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor Builder.AddResultTypeChunk(GetCompletionTypeString(PropertyType, Context, 58898987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor Policy, Allocator)); 5890aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(NameWithPrefix)); 5891aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor Results.AddResult(Result(Builder.TakeString(), Priority, 5892aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor CXCursor_ObjCIvarDecl)); 5893aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor } 5894aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor 5895322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Results.ExitScope(); 5896322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 5897e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 5898e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 5899e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 5900322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor} 5901e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 5902408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor// Mapping from selectors to the methods that implement that selector, along 5903408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor// with the "in original class" flag. 5904408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregortypedef llvm::DenseMap<Selector, std::pair<ObjCMethodDecl *, bool> > 5905408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor KnownMethodsMap; 5906e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 5907e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor/// \brief Find all of the methods that reside in the given container 5908e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor/// (and its superclasses, protocols, etc.) that meet the given 5909e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor/// criteria. Insert those methods into the map of known methods, 5910e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor/// indexed by selector so they can be easily found. 5911e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregorstatic void FindImplementableMethods(ASTContext &Context, 5912e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor ObjCContainerDecl *Container, 5913e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor bool WantInstanceMethods, 5914e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor QualType ReturnType, 5915408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor KnownMethodsMap &KnownMethods, 5916408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor bool InOriginalClass = true) { 5917e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container)) { 5918e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Recurse into protocols. 59192e5c15be82f362611c5928ce853d0685ff98c766Douglas Gregor if (!IFace->hasDefinition()) 59202e5c15be82f362611c5928ce853d0685ff98c766Douglas Gregor return; 59212e5c15be82f362611c5928ce853d0685ff98c766Douglas Gregor 5922e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor const ObjCList<ObjCProtocolDecl> &Protocols 5923e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor = IFace->getReferencedProtocols(); 5924e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 5925ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor E = Protocols.end(); 5926e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor I != E; ++I) 5927e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType, 5928ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor KnownMethods, InOriginalClass); 5929e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 5930ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor // Add methods from any class extensions and categories. 5931ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor for (const ObjCCategoryDecl *Cat = IFace->getCategoryList(); Cat; 5932ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor Cat = Cat->getNextClassCategory()) 593380aa1cd7973561889e51c1c152c8990a8de9c953Fariborz Jahanian FindImplementableMethods(Context, const_cast<ObjCCategoryDecl*>(Cat), 593480aa1cd7973561889e51c1c152c8990a8de9c953Fariborz Jahanian WantInstanceMethods, ReturnType, 5935ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor KnownMethods, false); 5936ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor 5937ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor // Visit the superclass. 5938ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor if (IFace->getSuperClass()) 5939ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor FindImplementableMethods(Context, IFace->getSuperClass(), 5940ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor WantInstanceMethods, ReturnType, 5941ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor KnownMethods, false); 5942e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 5943e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 5944e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(Container)) { 5945e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Recurse into protocols. 5946e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor const ObjCList<ObjCProtocolDecl> &Protocols 5947e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor = Category->getReferencedProtocols(); 5948e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 5949ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor E = Protocols.end(); 5950e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor I != E; ++I) 5951e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType, 5952ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor KnownMethods, InOriginalClass); 5953ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor 5954ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor // If this category is the original class, jump to the interface. 5955ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor if (InOriginalClass && Category->getClassInterface()) 5956ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor FindImplementableMethods(Context, Category->getClassInterface(), 5957ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor WantInstanceMethods, ReturnType, KnownMethods, 5958ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor false); 5959e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 5960e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 5961e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) { 59625e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor if (Protocol->hasDefinition()) { 59635e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor // Recurse into protocols. 59645e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor const ObjCList<ObjCProtocolDecl> &Protocols 59655e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor = Protocol->getReferencedProtocols(); 59665e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 59675e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor E = Protocols.end(); 59685e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor I != E; ++I) 59695e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType, 59705e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor KnownMethods, false); 59715e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor } 5972e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 5973e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 5974e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Add methods in this container. This operation occurs last because 5975e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // we want the methods from this container to override any methods 5976e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // we've previously seen with the same selector. 5977e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor for (ObjCContainerDecl::method_iterator M = Container->meth_begin(), 5978e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor MEnd = Container->meth_end(); 5979e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor M != MEnd; ++M) { 5980e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if ((*M)->isInstanceMethod() == WantInstanceMethods) { 5981e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (!ReturnType.isNull() && 5982e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor !Context.hasSameUnqualifiedType(ReturnType, (*M)->getResultType())) 5983e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor continue; 5984e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 5985408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor KnownMethods[(*M)->getSelector()] = std::make_pair(*M, InOriginalClass); 5986e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 5987e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 5988e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor} 5989e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 5990577cdfdb20840350e841a483df630237326126d5Douglas Gregor/// \brief Add the parenthesized return or parameter type chunk to a code 5991577cdfdb20840350e841a483df630237326126d5Douglas Gregor/// completion string. 5992577cdfdb20840350e841a483df630237326126d5Douglas Gregorstatic void AddObjCPassingTypeChunk(QualType Type, 5993577cdfdb20840350e841a483df630237326126d5Douglas Gregor ASTContext &Context, 59948987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor const PrintingPolicy &Policy, 5995577cdfdb20840350e841a483df630237326126d5Douglas Gregor CodeCompletionBuilder &Builder) { 5996577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 59978987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor Builder.AddTextChunk(GetCompletionTypeString(Type, Context, Policy, 5998577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.getAllocator())); 5999577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6000577cdfdb20840350e841a483df630237326126d5Douglas Gregor} 6001577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6002577cdfdb20840350e841a483df630237326126d5Douglas Gregor/// \brief Determine whether the given class is or inherits from a class by 6003577cdfdb20840350e841a483df630237326126d5Douglas Gregor/// the given name. 6004577cdfdb20840350e841a483df630237326126d5Douglas Gregorstatic bool InheritsFromClassNamed(ObjCInterfaceDecl *Class, 60055f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef Name) { 6006577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (!Class) 6007577cdfdb20840350e841a483df630237326126d5Douglas Gregor return false; 6008577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6009577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (Class->getIdentifier() && Class->getIdentifier()->getName() == Name) 6010577cdfdb20840350e841a483df630237326126d5Douglas Gregor return true; 6011577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6012577cdfdb20840350e841a483df630237326126d5Douglas Gregor return InheritsFromClassNamed(Class->getSuperClass(), Name); 6013577cdfdb20840350e841a483df630237326126d5Douglas Gregor} 6014577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6015577cdfdb20840350e841a483df630237326126d5Douglas Gregor/// \brief Add code completions for Objective-C Key-Value Coding (KVC) and 6016577cdfdb20840350e841a483df630237326126d5Douglas Gregor/// Key-Value Observing (KVO). 6017577cdfdb20840350e841a483df630237326126d5Douglas Gregorstatic void AddObjCKeyValueCompletions(ObjCPropertyDecl *Property, 6018577cdfdb20840350e841a483df630237326126d5Douglas Gregor bool IsInstanceMethod, 6019577cdfdb20840350e841a483df630237326126d5Douglas Gregor QualType ReturnType, 6020577cdfdb20840350e841a483df630237326126d5Douglas Gregor ASTContext &Context, 6021e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor VisitedSelectorSet &KnownSelectors, 6022577cdfdb20840350e841a483df630237326126d5Douglas Gregor ResultBuilder &Results) { 6023577cdfdb20840350e841a483df630237326126d5Douglas Gregor IdentifierInfo *PropName = Property->getIdentifier(); 6024577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (!PropName || PropName->getLength() == 0) 6025577cdfdb20840350e841a483df630237326126d5Douglas Gregor return; 6026577cdfdb20840350e841a483df630237326126d5Douglas Gregor 60278987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor PrintingPolicy Policy = getCompletionPrintingPolicy(Results.getSema()); 60288987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor 6029577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Builder that will create each code completion. 6030577cdfdb20840350e841a483df630237326126d5Douglas Gregor typedef CodeCompletionResult Result; 6031577cdfdb20840350e841a483df630237326126d5Douglas Gregor CodeCompletionAllocator &Allocator = Results.getAllocator(); 6032577cdfdb20840350e841a483df630237326126d5Douglas Gregor CodeCompletionBuilder Builder(Allocator); 6033577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6034577cdfdb20840350e841a483df630237326126d5Douglas Gregor // The selector table. 6035577cdfdb20840350e841a483df630237326126d5Douglas Gregor SelectorTable &Selectors = Context.Selectors; 6036577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6037577cdfdb20840350e841a483df630237326126d5Douglas Gregor // The property name, copied into the code completion allocation region 6038577cdfdb20840350e841a483df630237326126d5Douglas Gregor // on demand. 6039577cdfdb20840350e841a483df630237326126d5Douglas Gregor struct KeyHolder { 6040577cdfdb20840350e841a483df630237326126d5Douglas Gregor CodeCompletionAllocator &Allocator; 60415f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef Key; 6042577cdfdb20840350e841a483df630237326126d5Douglas Gregor const char *CopiedKey; 6043577cdfdb20840350e841a483df630237326126d5Douglas Gregor 60445f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner KeyHolder(CodeCompletionAllocator &Allocator, StringRef Key) 6045577cdfdb20840350e841a483df630237326126d5Douglas Gregor : Allocator(Allocator), Key(Key), CopiedKey(0) { } 6046577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6047577cdfdb20840350e841a483df630237326126d5Douglas Gregor operator const char *() { 6048577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (CopiedKey) 6049577cdfdb20840350e841a483df630237326126d5Douglas Gregor return CopiedKey; 6050577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6051577cdfdb20840350e841a483df630237326126d5Douglas Gregor return CopiedKey = Allocator.CopyString(Key); 6052577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6053577cdfdb20840350e841a483df630237326126d5Douglas Gregor } Key(Allocator, PropName->getName()); 6054577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6055577cdfdb20840350e841a483df630237326126d5Douglas Gregor // The uppercased name of the property name. 6056577cdfdb20840350e841a483df630237326126d5Douglas Gregor std::string UpperKey = PropName->getName(); 6057577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (!UpperKey.empty()) 6058577cdfdb20840350e841a483df630237326126d5Douglas Gregor UpperKey[0] = toupper(UpperKey[0]); 6059577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6060577cdfdb20840350e841a483df630237326126d5Douglas Gregor bool ReturnTypeMatchesProperty = ReturnType.isNull() || 6061577cdfdb20840350e841a483df630237326126d5Douglas Gregor Context.hasSameUnqualifiedType(ReturnType.getNonReferenceType(), 6062577cdfdb20840350e841a483df630237326126d5Douglas Gregor Property->getType()); 6063577cdfdb20840350e841a483df630237326126d5Douglas Gregor bool ReturnTypeMatchesVoid 6064577cdfdb20840350e841a483df630237326126d5Douglas Gregor = ReturnType.isNull() || ReturnType->isVoidType(); 6065577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6066577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Add the normal accessor -(type)key. 6067577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && 6068e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor KnownSelectors.insert(Selectors.getNullarySelector(PropName)) && 6069577cdfdb20840350e841a483df630237326126d5Douglas Gregor ReturnTypeMatchesProperty && !Property->getGetterMethodDecl()) { 6070577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) 60718987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor AddObjCPassingTypeChunk(Property->getType(), Context, Policy, Builder); 6072577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6073577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Key); 6074577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern, 6075577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6076577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6077577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6078577cdfdb20840350e841a483df630237326126d5Douglas Gregor // If we have an integral or boolean property (or the user has provided 6079577cdfdb20840350e841a483df630237326126d5Douglas Gregor // an integral or boolean return type), add the accessor -(type)isKey. 6080577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && 6081577cdfdb20840350e841a483df630237326126d5Douglas Gregor ((!ReturnType.isNull() && 6082577cdfdb20840350e841a483df630237326126d5Douglas Gregor (ReturnType->isIntegerType() || ReturnType->isBooleanType())) || 6083577cdfdb20840350e841a483df630237326126d5Douglas Gregor (ReturnType.isNull() && 6084577cdfdb20840350e841a483df630237326126d5Douglas Gregor (Property->getType()->isIntegerType() || 6085577cdfdb20840350e841a483df630237326126d5Douglas Gregor Property->getType()->isBooleanType())))) { 60865f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::string SelectorName = (Twine("is") + UpperKey).str(); 60876204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6088e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))) { 6089577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6090577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6091577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("BOOL"); 6092577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6093577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6094577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6095577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk( 6096577cdfdb20840350e841a483df630237326126d5Douglas Gregor Allocator.CopyString(SelectorId->getName())); 6097577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern, 6098577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6099577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6100577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6101577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6102577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Add the normal mutator. 6103577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid && 6104577cdfdb20840350e841a483df630237326126d5Douglas Gregor !Property->getSetterMethodDecl()) { 61055f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::string SelectorName = (Twine("set") + UpperKey).str(); 61066204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6107e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6108577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6109577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6110577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6111577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6112577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6113577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6114577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk( 6115577cdfdb20840350e841a483df630237326126d5Douglas Gregor Allocator.CopyString(SelectorId->getName())); 6116577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(":"); 61178987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor AddObjCPassingTypeChunk(Property->getType(), Context, Policy, Builder); 6118577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk(Key); 6119577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern, 6120577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6121577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6122577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6123577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6124577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Indexed and unordered accessors 6125577cdfdb20840350e841a483df630237326126d5Douglas Gregor unsigned IndexedGetterPriority = CCP_CodePattern; 6126577cdfdb20840350e841a483df630237326126d5Douglas Gregor unsigned IndexedSetterPriority = CCP_CodePattern; 6127577cdfdb20840350e841a483df630237326126d5Douglas Gregor unsigned UnorderedGetterPriority = CCP_CodePattern; 6128577cdfdb20840350e841a483df630237326126d5Douglas Gregor unsigned UnorderedSetterPriority = CCP_CodePattern; 6129577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (const ObjCObjectPointerType *ObjCPointer 6130577cdfdb20840350e841a483df630237326126d5Douglas Gregor = Property->getType()->getAs<ObjCObjectPointerType>()) { 6131577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ObjCInterfaceDecl *IFace = ObjCPointer->getInterfaceDecl()) { 6132577cdfdb20840350e841a483df630237326126d5Douglas Gregor // If this interface type is not provably derived from a known 6133577cdfdb20840350e841a483df630237326126d5Douglas Gregor // collection, penalize the corresponding completions. 6134577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (!InheritsFromClassNamed(IFace, "NSMutableArray")) { 6135577cdfdb20840350e841a483df630237326126d5Douglas Gregor IndexedSetterPriority += CCD_ProbablyNotObjCCollection; 6136577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (!InheritsFromClassNamed(IFace, "NSArray")) 6137577cdfdb20840350e841a483df630237326126d5Douglas Gregor IndexedGetterPriority += CCD_ProbablyNotObjCCollection; 6138577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6139577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6140577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (!InheritsFromClassNamed(IFace, "NSMutableSet")) { 6141577cdfdb20840350e841a483df630237326126d5Douglas Gregor UnorderedSetterPriority += CCD_ProbablyNotObjCCollection; 6142577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (!InheritsFromClassNamed(IFace, "NSSet")) 6143577cdfdb20840350e841a483df630237326126d5Douglas Gregor UnorderedGetterPriority += CCD_ProbablyNotObjCCollection; 6144577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6145577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6146577cdfdb20840350e841a483df630237326126d5Douglas Gregor } else { 6147577cdfdb20840350e841a483df630237326126d5Douglas Gregor IndexedGetterPriority += CCD_ProbablyNotObjCCollection; 6148577cdfdb20840350e841a483df630237326126d5Douglas Gregor IndexedSetterPriority += CCD_ProbablyNotObjCCollection; 6149577cdfdb20840350e841a483df630237326126d5Douglas Gregor UnorderedGetterPriority += CCD_ProbablyNotObjCCollection; 6150577cdfdb20840350e841a483df630237326126d5Douglas Gregor UnorderedSetterPriority += CCD_ProbablyNotObjCCollection; 6151577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6152577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6153577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Add -(NSUInteger)countOf<key> 6154577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && 6155577cdfdb20840350e841a483df630237326126d5Douglas Gregor (ReturnType.isNull() || ReturnType->isIntegerType())) { 61565f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::string SelectorName = (Twine("countOf") + UpperKey).str(); 61576204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6158e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))) { 6159577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6160577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6161577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSUInteger"); 6162577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6163577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6164577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6165577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk( 6166577cdfdb20840350e841a483df630237326126d5Douglas Gregor Allocator.CopyString(SelectorId->getName())); 6167577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), 6168577cdfdb20840350e841a483df630237326126d5Douglas Gregor std::min(IndexedGetterPriority, 6169577cdfdb20840350e841a483df630237326126d5Douglas Gregor UnorderedGetterPriority), 6170577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6171577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6172577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6173577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6174577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Indexed getters 6175577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Add -(id)objectInKeyAtIndex:(NSUInteger)index 6176577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && 6177577cdfdb20840350e841a483df630237326126d5Douglas Gregor (ReturnType.isNull() || ReturnType->isObjCObjectPointerType())) { 61786204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor std::string SelectorName 61795f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner = (Twine("objectIn") + UpperKey + "AtIndex").str(); 61806204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6181e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6182577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6183577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6184577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("id"); 6185577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6186577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6187577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6188577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6189577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6190577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSUInteger"); 6191577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6192577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("index"); 6193577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority, 6194577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6195577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6196577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6197577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6198577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Add -(NSArray *)keyAtIndexes:(NSIndexSet *)indexes 6199577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && 6200577cdfdb20840350e841a483df630237326126d5Douglas Gregor (ReturnType.isNull() || 6201577cdfdb20840350e841a483df630237326126d5Douglas Gregor (ReturnType->isObjCObjectPointerType() && 6202577cdfdb20840350e841a483df630237326126d5Douglas Gregor ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() && 6203577cdfdb20840350e841a483df630237326126d5Douglas Gregor ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() 6204577cdfdb20840350e841a483df630237326126d5Douglas Gregor ->getName() == "NSArray"))) { 62056204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor std::string SelectorName 62065f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner = (Twine(Property->getName()) + "AtIndexes").str(); 62076204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6208e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6209577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6210577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6211577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSArray *"); 6212577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6213577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6214577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6215577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6216577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6217577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSIndexSet *"); 6218577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6219577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("indexes"); 6220577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority, 6221577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6222577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6223577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6224577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6225577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Add -(void)getKey:(type **)buffer range:(NSRange)inRange 6226577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid) { 62275f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::string SelectorName = (Twine("get") + UpperKey).str(); 6228577cdfdb20840350e841a483df630237326126d5Douglas Gregor IdentifierInfo *SelectorIds[2] = { 62296204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor &Context.Idents.get(SelectorName), 6230577cdfdb20840350e841a483df630237326126d5Douglas Gregor &Context.Idents.get("range") 6231577cdfdb20840350e841a483df630237326126d5Douglas Gregor }; 6232577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6233e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds))) { 6234577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6235577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6236577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6237577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6238577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6239577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6240577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6241577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6242577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddPlaceholderChunk("object-type"); 6243577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk(" **"); 6244577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6245577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("buffer"); 6246577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6247577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk("range:"); 6248577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6249577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSRange"); 6250577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6251577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("inRange"); 6252577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority, 6253577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6254577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6255577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6256577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6257577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Mutable indexed accessors 6258577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6259577cdfdb20840350e841a483df630237326126d5Douglas Gregor // - (void)insertObject:(type *)object inKeyAtIndex:(NSUInteger)index 6260577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid) { 62615f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::string SelectorName = (Twine("in") + UpperKey + "AtIndex").str(); 6262577cdfdb20840350e841a483df630237326126d5Douglas Gregor IdentifierInfo *SelectorIds[2] = { 6263577cdfdb20840350e841a483df630237326126d5Douglas Gregor &Context.Idents.get("insertObject"), 62646204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor &Context.Idents.get(SelectorName) 6265577cdfdb20840350e841a483df630237326126d5Douglas Gregor }; 6266577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6267e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds))) { 6268577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6269577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6270577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6271577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6272577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6273577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6274577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk("insertObject:"); 6275577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6276577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddPlaceholderChunk("object-type"); 6277577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk(" *"); 6278577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6279577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("object"); 6280577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6281577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6282577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6283577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddPlaceholderChunk("NSUInteger"); 6284577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6285577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("index"); 6286577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 6287577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6288577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6289577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6290577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6291577cdfdb20840350e841a483df630237326126d5Douglas Gregor // - (void)insertKey:(NSArray *)array atIndexes:(NSIndexSet *)indexes 6292577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid) { 62935f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::string SelectorName = (Twine("insert") + UpperKey).str(); 6294577cdfdb20840350e841a483df630237326126d5Douglas Gregor IdentifierInfo *SelectorIds[2] = { 62956204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor &Context.Idents.get(SelectorName), 6296577cdfdb20840350e841a483df630237326126d5Douglas Gregor &Context.Idents.get("atIndexes") 6297577cdfdb20840350e841a483df630237326126d5Douglas Gregor }; 6298577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6299e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds))) { 6300577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6301577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6302577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6303577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6304577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6305577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6306577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6307577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6308577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSArray *"); 6309577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6310577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("array"); 6311577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6312577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk("atIndexes:"); 6313577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6314577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddPlaceholderChunk("NSIndexSet *"); 6315577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6316577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("indexes"); 6317577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 6318577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6319577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6320577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6321577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6322577cdfdb20840350e841a483df630237326126d5Douglas Gregor // -(void)removeObjectFromKeyAtIndex:(NSUInteger)index 6323577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid) { 63246204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor std::string SelectorName 63255f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner = (Twine("removeObjectFrom") + UpperKey + "AtIndex").str(); 63266204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6327e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6328577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6329577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6330577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6331577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6332577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6333577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6334577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6335577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6336577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSUInteger"); 6337577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6338577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("index"); 6339577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 6340577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6341577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6342577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6343577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6344577cdfdb20840350e841a483df630237326126d5Douglas Gregor // -(void)removeKeyAtIndexes:(NSIndexSet *)indexes 6345577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid) { 63466204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor std::string SelectorName 63475f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner = (Twine("remove") + UpperKey + "AtIndexes").str(); 63486204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6349e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6350577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6351577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6352577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6353577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6354577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6355577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6356577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6357577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6358577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSIndexSet *"); 6359577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6360577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("indexes"); 6361577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 6362577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6363577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6364577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6365577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6366577cdfdb20840350e841a483df630237326126d5Douglas Gregor // - (void)replaceObjectInKeyAtIndex:(NSUInteger)index withObject:(id)object 6367577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid) { 63686204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor std::string SelectorName 63695f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner = (Twine("replaceObjectIn") + UpperKey + "AtIndex").str(); 6370577cdfdb20840350e841a483df630237326126d5Douglas Gregor IdentifierInfo *SelectorIds[2] = { 63716204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor &Context.Idents.get(SelectorName), 6372577cdfdb20840350e841a483df630237326126d5Douglas Gregor &Context.Idents.get("withObject") 6373577cdfdb20840350e841a483df630237326126d5Douglas Gregor }; 6374577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6375e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds))) { 6376577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6377577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6378577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6379577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6380577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6381577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6382577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6383577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6384577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddPlaceholderChunk("NSUInteger"); 6385577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6386577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("index"); 6387577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6388577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk("withObject:"); 6389577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6390577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("id"); 6391577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6392577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("object"); 6393577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 6394577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6395577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6396577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6397577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6398577cdfdb20840350e841a483df630237326126d5Douglas Gregor // - (void)replaceKeyAtIndexes:(NSIndexSet *)indexes withKey:(NSArray *)array 6399577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid) { 64006204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor std::string SelectorName1 64015f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner = (Twine("replace") + UpperKey + "AtIndexes").str(); 64025f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::string SelectorName2 = (Twine("with") + UpperKey).str(); 6403577cdfdb20840350e841a483df630237326126d5Douglas Gregor IdentifierInfo *SelectorIds[2] = { 64046204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor &Context.Idents.get(SelectorName1), 64056204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor &Context.Idents.get(SelectorName2) 6406577cdfdb20840350e841a483df630237326126d5Douglas Gregor }; 6407577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6408e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds))) { 6409577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6410577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6411577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6412577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6413577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6414577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6415577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName1 + ":")); 6416577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6417577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddPlaceholderChunk("NSIndexSet *"); 6418577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6419577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("indexes"); 6420577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6421577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName2 + ":")); 6422577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6423577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSArray *"); 6424577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6425577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("array"); 6426577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 6427577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6428577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6429577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6430577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6431577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Unordered getters 6432577cdfdb20840350e841a483df630237326126d5Douglas Gregor // - (NSEnumerator *)enumeratorOfKey 6433577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && 6434577cdfdb20840350e841a483df630237326126d5Douglas Gregor (ReturnType.isNull() || 6435577cdfdb20840350e841a483df630237326126d5Douglas Gregor (ReturnType->isObjCObjectPointerType() && 6436577cdfdb20840350e841a483df630237326126d5Douglas Gregor ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() && 6437577cdfdb20840350e841a483df630237326126d5Douglas Gregor ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() 6438577cdfdb20840350e841a483df630237326126d5Douglas Gregor ->getName() == "NSEnumerator"))) { 64395f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::string SelectorName = (Twine("enumeratorOf") + UpperKey).str(); 64406204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6441e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))) { 6442577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6443577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6444577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSEnumerator *"); 6445577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6446577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6447577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6448577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName)); 6449577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), UnorderedGetterPriority, 6450577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6451577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6452577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6453577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6454577cdfdb20840350e841a483df630237326126d5Douglas Gregor // - (type *)memberOfKey:(type *)object 6455577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && 6456577cdfdb20840350e841a483df630237326126d5Douglas Gregor (ReturnType.isNull() || ReturnType->isObjCObjectPointerType())) { 64575f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::string SelectorName = (Twine("memberOf") + UpperKey).str(); 64586204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6459e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6460577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6461577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6462577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddPlaceholderChunk("object-type"); 6463577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk(" *"); 6464577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6465577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6466577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6467577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6468577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6469577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6470577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddPlaceholderChunk("object-type"); 6471577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk(" *"); 6472577cdfdb20840350e841a483df630237326126d5Douglas Gregor } else { 6473577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk(GetCompletionTypeString(ReturnType, Context, 64748987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor Policy, 6475577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.getAllocator())); 6476577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6477577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6478577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("object"); 6479577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), UnorderedGetterPriority, 6480577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6481577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6482577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6483577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6484577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Mutable unordered accessors 6485577cdfdb20840350e841a483df630237326126d5Douglas Gregor // - (void)addKeyObject:(type *)object 6486577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid) { 64876204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor std::string SelectorName 64885f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner = (Twine("add") + UpperKey + Twine("Object")).str(); 64896204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6490e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6491577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6492577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6493577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6494577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6495577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6496577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6497577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6498577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6499577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddPlaceholderChunk("object-type"); 6500577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk(" *"); 6501577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6502577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("object"); 6503577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority, 6504577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6505577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6506577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6507577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6508577cdfdb20840350e841a483df630237326126d5Douglas Gregor // - (void)addKey:(NSSet *)objects 6509577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid) { 65105f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::string SelectorName = (Twine("add") + UpperKey).str(); 65116204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6512e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6513577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6514577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6515577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6516577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6517577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6518577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6519577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6520577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6521577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSSet *"); 6522577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6523577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("objects"); 6524577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority, 6525577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6526577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6527577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6528577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6529577cdfdb20840350e841a483df630237326126d5Douglas Gregor // - (void)removeKeyObject:(type *)object 6530577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid) { 65316204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor std::string SelectorName 65325f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner = (Twine("remove") + UpperKey + Twine("Object")).str(); 65336204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6534e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6535577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6536577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6537577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6538577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6539577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6540577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6541577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6542577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6543577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddPlaceholderChunk("object-type"); 6544577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk(" *"); 6545577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6546577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("object"); 6547577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority, 6548577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6549577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6550577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6551577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6552577cdfdb20840350e841a483df630237326126d5Douglas Gregor // - (void)removeKey:(NSSet *)objects 6553577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid) { 65545f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::string SelectorName = (Twine("remove") + UpperKey).str(); 65556204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6556e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6557577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6558577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6559577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6560577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6561577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6562577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6563577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6564577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6565577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSSet *"); 6566577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6567577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("objects"); 6568577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority, 6569577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6570577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6571577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6572577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6573577cdfdb20840350e841a483df630237326126d5Douglas Gregor // - (void)intersectKey:(NSSet *)objects 6574577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid) { 65755f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::string SelectorName = (Twine("intersect") + UpperKey).str(); 65766204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6577e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6578577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6579577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6580577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6581577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6582577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6583577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6584577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6585577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6586577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSSet *"); 6587577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6588577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("objects"); 6589577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority, 6590577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6591577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6592577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6593577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6594577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Key-Value Observing 6595577cdfdb20840350e841a483df630237326126d5Douglas Gregor // + (NSSet *)keyPathsForValuesAffectingKey 6596577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (!IsInstanceMethod && 6597577cdfdb20840350e841a483df630237326126d5Douglas Gregor (ReturnType.isNull() || 6598577cdfdb20840350e841a483df630237326126d5Douglas Gregor (ReturnType->isObjCObjectPointerType() && 6599577cdfdb20840350e841a483df630237326126d5Douglas Gregor ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() && 6600577cdfdb20840350e841a483df630237326126d5Douglas Gregor ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() 6601577cdfdb20840350e841a483df630237326126d5Douglas Gregor ->getName() == "NSSet"))) { 66026204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor std::string SelectorName 66035f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner = (Twine("keyPathsForValuesAffecting") + UpperKey).str(); 66046204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6605e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))) { 6606577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6607577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6608577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSSet *"); 6609577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6610577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6611577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6612577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName)); 6613577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern, 66143f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor CXCursor_ObjCClassMethodDecl)); 66153f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor } 66163f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor } 66173f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor 66183f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor // + (BOOL)automaticallyNotifiesObserversForKey 66193f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor if (!IsInstanceMethod && 66203f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor (ReturnType.isNull() || 66213f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor ReturnType->isIntegerType() || 66223f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor ReturnType->isBooleanType())) { 66233f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor std::string SelectorName 66245f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner = (Twine("automaticallyNotifiesObserversOf") + UpperKey).str(); 66253f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 66263f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))) { 66273f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor if (ReturnType.isNull()) { 66283f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 66293f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor Builder.AddTextChunk("BOOL"); 66303f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 66313f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor } 66323f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor 66333f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName)); 66343f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern, 66353f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor CXCursor_ObjCClassMethodDecl)); 6636577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6637577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6638577cdfdb20840350e841a483df630237326126d5Douglas Gregor} 6639577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6640e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregorvoid Sema::CodeCompleteObjCMethodDecl(Scope *S, 6641e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor bool IsInstanceMethod, 6642a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian ParsedType ReturnTy) { 6643e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Determine the return type of the method we're declaring, if 6644e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // provided. 6645e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor QualType ReturnType = GetTypeFromParser(ReturnTy); 6646a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian Decl *IDecl = 0; 6647a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian if (CurContext->isObjCContainer()) { 6648a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian ObjCContainerDecl *OCD = dyn_cast<ObjCContainerDecl>(CurContext); 6649a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian IDecl = cast<Decl>(OCD); 6650a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian } 6651ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor // Determine where we should start searching for methods. 6652ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor ObjCContainerDecl *SearchDecl = 0; 6653e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor bool IsInImplementation = false; 6654d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall if (Decl *D = IDecl) { 6655e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (ObjCImplementationDecl *Impl = dyn_cast<ObjCImplementationDecl>(D)) { 6656e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor SearchDecl = Impl->getClassInterface(); 6657e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor IsInImplementation = true; 6658e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } else if (ObjCCategoryImplDecl *CatImpl 6659ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor = dyn_cast<ObjCCategoryImplDecl>(D)) { 6660e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor SearchDecl = CatImpl->getCategoryDecl(); 6661e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor IsInImplementation = true; 6662ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor } else 6663e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor SearchDecl = dyn_cast<ObjCContainerDecl>(D); 6664e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 6665e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6666e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (!SearchDecl && S) { 6667ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor if (DeclContext *DC = static_cast<DeclContext *>(S->getEntity())) 6668e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor SearchDecl = dyn_cast<ObjCContainerDecl>(DC); 6669e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 6670e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6671ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor if (!SearchDecl) { 6672e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 6673e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 6674e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor 0, 0); 6675e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor return; 6676e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 6677e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6678e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Find all of the methods that we could declare/implement here. 6679e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor KnownMethodsMap KnownMethods; 6680e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor FindImplementableMethods(Context, SearchDecl, IsInstanceMethod, 6681ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor ReturnType, KnownMethods); 6682e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6683e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Add declarations or definitions for each of the known methods. 66840a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 6685218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 6686218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 6687e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Results.EnterNewScope(); 66888987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor PrintingPolicy Policy = getCompletionPrintingPolicy(*this); 6689e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor for (KnownMethodsMap::iterator M = KnownMethods.begin(), 6690e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor MEnd = KnownMethods.end(); 6691e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor M != MEnd; ++M) { 6692408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor ObjCMethodDecl *Method = M->second.first; 6693218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder Builder(Results.getAllocator()); 6694e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6695e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // If the result type was not already provided, add it to the 6696e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // pattern as (type). 6697577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) 66988987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor AddObjCPassingTypeChunk(Method->getResultType(), Context, Policy, 66998987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor Builder); 6700e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6701e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Selector Sel = Method->getSelector(); 6702e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6703e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Add the first part of the selector to the pattern. 6704dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddTypedTextChunk(Builder.getAllocator().CopyString( 6705813d8346529bf094eb2b249648906ba7fd226688Douglas Gregor Sel.getNameForSlot(0))); 6706e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6707e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Add parameters to the pattern. 6708e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor unsigned I = 0; 6709e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor for (ObjCMethodDecl::param_iterator P = Method->param_begin(), 6710e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor PEnd = Method->param_end(); 6711e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor P != PEnd; (void)++P, ++I) { 6712e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Add the part of the selector name. 6713e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (I == 0) 6714218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk(":"); 6715e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor else if (I < Sel.getNumArgs()) { 6716218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6717218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk( 6718813d8346529bf094eb2b249648906ba7fd226688Douglas Gregor Builder.getAllocator().CopyString(Sel.getNameForSlot(I) + ":")); 6719e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } else 6720e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor break; 6721e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6722e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Add the parameter type. 67238987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor AddObjCPassingTypeChunk((*P)->getOriginalType(), Context, Policy, 67248987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor Builder); 6725e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6726e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (IdentifierInfo *Id = (*P)->getIdentifier()) 6727dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddTextChunk(Builder.getAllocator().CopyString( Id->getName())); 6728e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 6729e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6730e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (Method->isVariadic()) { 6731e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (Method->param_size() > 0) 6732218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_Comma); 6733218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("..."); 6734e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor } 6735e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6736447107dfff705ab79d1dbf33ce79b524d63572fdDouglas Gregor if (IsInImplementation && Results.includeCodePatterns()) { 6737e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // We will be defining the method here, so add a compound statement. 6738218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6739218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 6740218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 6741e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (!Method->getResultType()->isVoidType()) { 6742e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // If the result type is not void, add a return clause. 6743218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("return"); 6744218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6745218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 6746218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_SemiColon); 6747e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } else 6748218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("statements"); 6749e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6750218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 6751218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 6752e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 6753e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6754408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor unsigned Priority = CCP_CodePattern; 6755408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor if (!M->second.second) 6756408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor Priority += CCD_InBaseClass; 6757408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor 6758218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString(), Priority, 675916ed9ada523a990ca4bb5015c7bf8d0ead60c7d9Douglas Gregor Method->isInstanceMethod() 676016ed9ada523a990ca4bb5015c7bf8d0ead60c7d9Douglas Gregor ? CXCursor_ObjCInstanceMethodDecl 676116ed9ada523a990ca4bb5015c7bf8d0ead60c7d9Douglas Gregor : CXCursor_ObjCClassMethodDecl)); 6762e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 6763e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6764577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Add Key-Value-Coding and Key-Value-Observing accessor methods for all of 6765577cdfdb20840350e841a483df630237326126d5Douglas Gregor // the properties in this class and its categories. 6766577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (Context.getLangOptions().ObjC2) { 67675f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<ObjCContainerDecl *, 4> Containers; 6768577cdfdb20840350e841a483df630237326126d5Douglas Gregor Containers.push_back(SearchDecl); 6769577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6770e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor VisitedSelectorSet KnownSelectors; 6771e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor for (KnownMethodsMap::iterator M = KnownMethods.begin(), 6772e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor MEnd = KnownMethods.end(); 6773e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor M != MEnd; ++M) 6774e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor KnownSelectors.insert(M->first); 6775e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor 6776e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor 6777577cdfdb20840350e841a483df630237326126d5Douglas Gregor ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(SearchDecl); 6778577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (!IFace) 6779577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(SearchDecl)) 6780577cdfdb20840350e841a483df630237326126d5Douglas Gregor IFace = Category->getClassInterface(); 6781577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6782577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IFace) { 6783577cdfdb20840350e841a483df630237326126d5Douglas Gregor for (ObjCCategoryDecl *Category = IFace->getCategoryList(); Category; 6784577cdfdb20840350e841a483df630237326126d5Douglas Gregor Category = Category->getNextClassCategory()) 6785577cdfdb20840350e841a483df630237326126d5Douglas Gregor Containers.push_back(Category); 6786577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6787577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6788577cdfdb20840350e841a483df630237326126d5Douglas Gregor for (unsigned I = 0, N = Containers.size(); I != N; ++I) { 6789577cdfdb20840350e841a483df630237326126d5Douglas Gregor for (ObjCContainerDecl::prop_iterator P = Containers[I]->prop_begin(), 6790577cdfdb20840350e841a483df630237326126d5Douglas Gregor PEnd = Containers[I]->prop_end(); 6791577cdfdb20840350e841a483df630237326126d5Douglas Gregor P != PEnd; ++P) { 6792577cdfdb20840350e841a483df630237326126d5Douglas Gregor AddObjCKeyValueCompletions(*P, IsInstanceMethod, ReturnType, Context, 6793e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor KnownSelectors, Results); 6794577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6795577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6796577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6797577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6798e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Results.ExitScope(); 6799e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6800e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 6801e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 6802e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 6803e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor} 68041f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 68051f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregorvoid Sema::CodeCompleteObjCMethodDeclSelector(Scope *S, 68061f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor bool IsInstanceMethod, 680740ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor bool AtParameterName, 6808b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall ParsedType ReturnTy, 68091f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor IdentifierInfo **SelIdents, 68101f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor unsigned NumSelIdents) { 68111f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor // If we have an external source, load the entire class method 68123c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl // pool from the AST file. 68131f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor if (ExternalSource) { 68141f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors(); 68151f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor I != N; ++I) { 68161f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor Selector Sel = ExternalSource->GetExternalSelector(I); 6817db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl if (Sel.isNull() || MethodPool.count(Sel)) 68181f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor continue; 6819db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl 6820db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl ReadMethodPool(Sel); 68211f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor } 68221f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor } 68231f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 68241f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor // Build the set of methods we can see. 68250a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 6826218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 6827218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 68281f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 68291f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor if (ReturnTy) 68301f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor Results.setPreferredType(GetTypeFromParser(ReturnTy).getNonReferenceType()); 6831db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl 68321f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor Results.EnterNewScope(); 6833db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl for (GlobalMethodPool::iterator M = MethodPool.begin(), 6834db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl MEnd = MethodPool.end(); 6835db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl M != MEnd; ++M) { 6836db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl for (ObjCMethodList *MethList = IsInstanceMethod ? &M->second.first : 6837db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl &M->second.second; 6838db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl MethList && MethList->Method; 68391f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor MethList = MethList->Next) { 68401f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor if (!isAcceptableObjCMethod(MethList->Method, MK_Any, SelIdents, 68411f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor NumSelIdents)) 68421f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor continue; 68431f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 684440ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor if (AtParameterName) { 684540ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor // Suggest parameter names we've seen before. 684640ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor if (NumSelIdents && NumSelIdents <= MethList->Method->param_size()) { 684740ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor ParmVarDecl *Param = MethList->Method->param_begin()[NumSelIdents-1]; 684840ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor if (Param->getIdentifier()) { 6849218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder Builder(Results.getAllocator()); 6850dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddTypedTextChunk(Builder.getAllocator().CopyString( 6851218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Param->getIdentifier()->getName())); 6852218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 685340ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor } 685440ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor } 685540ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor 685640ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor continue; 685740ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor } 685840ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor 68591f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor Result R(MethList->Method, 0); 68601f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor R.StartParameter = NumSelIdents; 68611f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor R.AllParametersAreInformative = false; 68621f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor R.DeclaringEntity = true; 68631f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor Results.MaybeAddResult(R, CurContext); 68641f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor } 68651f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor } 68661f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 68671f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor Results.ExitScope(); 6868e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 6869e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 6870e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 68711f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor} 687287c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor 6873f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregorvoid Sema::CodeCompletePreprocessorDirective(bool InConditional) { 6874218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 687552779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor CodeCompletionContext::CCC_PreprocessorDirective); 6876f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor Results.EnterNewScope(); 6877f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 6878f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #if <condition> 6879218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder Builder(Results.getAllocator()); 6880218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("if"); 6881218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6882218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("condition"); 6883218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 6884f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 6885f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #ifdef <macro> 6886218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("ifdef"); 6887218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6888218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("macro"); 6889218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 6890218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor 6891f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #ifndef <macro> 6892218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("ifndef"); 6893218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6894218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("macro"); 6895218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 6896f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 6897f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor if (InConditional) { 6898f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #elif <condition> 6899218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("elif"); 6900218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6901218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("condition"); 6902218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 6903f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 6904f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #else 6905218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("else"); 6906218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 6907f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 6908f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #endif 6909218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("endif"); 6910218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 6911f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor } 6912f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 6913f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #include "header" 6914218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("include"); 6915218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6916218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("\""); 6917218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("header"); 6918218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("\""); 6919218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 6920f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 6921f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #include <header> 6922218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("include"); 6923218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6924218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("<"); 6925218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("header"); 6926218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk(">"); 6927218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 6928f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 6929f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #define <macro> 6930218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("define"); 6931218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6932218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("macro"); 6933218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 6934f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 6935f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #define <macro>(<args>) 6936218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("define"); 6937218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6938218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("macro"); 6939218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6940218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("args"); 6941218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6942218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 6943f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 6944f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #undef <macro> 6945218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("undef"); 6946218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6947218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("macro"); 6948218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 6949f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 6950f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #line <number> 6951218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("line"); 6952218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6953218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("number"); 6954218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 6955f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 6956f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #line <number> "filename" 6957218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("line"); 6958218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6959218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("number"); 6960218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6961218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("\""); 6962218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("filename"); 6963218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("\""); 6964218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 6965f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 6966f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #error <message> 6967218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("error"); 6968218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6969218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("message"); 6970218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 6971f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 6972f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #pragma <arguments> 6973218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("pragma"); 6974218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6975218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("arguments"); 6976218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 6977f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 6978f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor if (getLangOptions().ObjC1) { 6979f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #import "header" 6980218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("import"); 6981218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6982218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("\""); 6983218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("header"); 6984218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("\""); 6985218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 6986f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 6987f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #import <header> 6988218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("import"); 6989218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6990218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("<"); 6991218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("header"); 6992218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk(">"); 6993218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 6994f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor } 6995f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 6996f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #include_next "header" 6997218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("include_next"); 6998218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6999218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("\""); 7000218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("header"); 7001218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("\""); 7002218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 7003f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 7004f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #include_next <header> 7005218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("include_next"); 7006218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7007218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("<"); 7008218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("header"); 7009218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk(">"); 7010218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 7011f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 7012f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #warning <message> 7013218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("warning"); 7014218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7015218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("message"); 7016218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 7017f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 7018f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // Note: #ident and #sccs are such crazy anachronisms that we don't provide 7019f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // completions for them. And __include_macros is a Clang-internal extension 7020f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // that we don't want to encourage anyone to use. 7021f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 7022f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // FIXME: we don't support #assert or #unassert, so don't suggest them. 7023f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor Results.ExitScope(); 7024f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 7025f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 7026721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor CodeCompletionContext::CCC_PreprocessorDirective, 7027f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor Results.data(), Results.size()); 7028f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor} 7029f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 7030f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregorvoid Sema::CodeCompleteInPreprocessorConditionalExclusion(Scope *S) { 7031f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor CodeCompleteOrdinaryName(S, 7032f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall S->getFnParent()? Sema::PCC_RecoveryInFunction 7033f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall : Sema::PCC_Namespace); 7034f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor} 7035f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 7036f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregorvoid Sema::CodeCompletePreprocessorMacroName(bool IsDefinition) { 7037218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 703852779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor IsDefinition? CodeCompletionContext::CCC_MacroName 703952779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor : CodeCompletionContext::CCC_MacroNameUse); 70401fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor if (!IsDefinition && (!CodeCompleter || CodeCompleter->includeMacros())) { 70411fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor // Add just the names of macros, not their arguments. 7042218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder Builder(Results.getAllocator()); 70431fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor Results.EnterNewScope(); 70441fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor for (Preprocessor::macro_iterator M = PP.macro_begin(), 70451fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor MEnd = PP.macro_end(); 70461fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor M != MEnd; ++M) { 7047dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddTypedTextChunk(Builder.getAllocator().CopyString( 7048218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor M->first->getName())); 7049218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 70501fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor } 70511fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor Results.ExitScope(); 70521fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor } else if (IsDefinition) { 70531fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor // FIXME: Can we detect when the user just wrote an include guard above? 70541fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor } 70551fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor 705652779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 70571fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor Results.data(), Results.size()); 70581fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor} 70591fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor 7060f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregorvoid Sema::CodeCompletePreprocessorExpression() { 7061218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 706252779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor CodeCompletionContext::CCC_PreprocessorExpression); 7063f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor 7064f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor if (!CodeCompleter || CodeCompleter->includeMacros()) 7065f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor AddMacroResults(PP, Results); 7066f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor 7067f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor // defined (<macro>) 7068f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor Results.EnterNewScope(); 7069218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder Builder(Results.getAllocator()); 7070218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("defined"); 7071218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7072218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 7073218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("macro"); 7074218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 7075218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 7076f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor Results.ExitScope(); 7077f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor 7078f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 7079f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor CodeCompletionContext::CCC_PreprocessorExpression, 7080f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor Results.data(), Results.size()); 7081f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor} 7082f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor 7083f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregorvoid Sema::CodeCompletePreprocessorMacroArgument(Scope *S, 7084f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor IdentifierInfo *Macro, 7085f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor MacroInfo *MacroInfo, 7086f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor unsigned Argument) { 7087f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor // FIXME: In the future, we could provide "overload" results, much like we 7088f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor // do for function calls. 7089f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor 70905c5f03e4020e90b9760ec547962ba02b029cc359Argyrios Kyrtzidis // Now just ignore this. There will be another code-completion callback 70915c5f03e4020e90b9760ec547962ba02b029cc359Argyrios Kyrtzidis // for the expanded tokens. 7092f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor} 7093f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor 709455817afdf9d453a443262a733f6caf6692dca118Douglas Gregorvoid Sema::CodeCompleteNaturalLanguage() { 709555817afdf9d453a443262a733f6caf6692dca118Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 7096af1c6b532e6e1e944db987f29062e5efce71a573Douglas Gregor CodeCompletionContext::CCC_NaturalLanguage, 709755817afdf9d453a443262a733f6caf6692dca118Douglas Gregor 0, 0); 709855817afdf9d453a443262a733f6caf6692dca118Douglas Gregor} 709955817afdf9d453a443262a733f6caf6692dca118Douglas Gregor 7100dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregorvoid Sema::GatherGlobalCodeCompletions(CodeCompletionAllocator &Allocator, 71015f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVectorImpl<CodeCompletionResult> &Results) { 7102218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Builder(*this, Allocator, CodeCompletionContext::CCC_Recovery); 71038071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor if (!CodeCompleter || CodeCompleter->includeGlobals()) { 71048071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompletionDeclConsumer Consumer(Builder, 71058071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor Context.getTranslationUnitDecl()); 71068071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(Context.getTranslationUnitDecl(), LookupAnyName, 71078071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor Consumer); 71088071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor } 710987c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor 711087c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor if (!CodeCompleter || CodeCompleter->includeMacros()) 711187c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor AddMacroResults(PP, Builder); 711287c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor 711387c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor Results.clear(); 711487c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor Results.insert(Results.end(), 711587c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor Builder.data(), Builder.data() + Builder.size()); 711687c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor} 7117