SemaCodeComplete.cpp revision e4b92761b43ced611c417ae478568610f1ad7b1e
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" 233f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor#include "clang/Lex/MacroInfo.h" 243f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor#include "clang/Lex/Preprocessor.h" 25d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor#include "llvm/ADT/DenseSet.h" 2686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor#include "llvm/ADT/SmallPtrSet.h" 276a6840326e9b4ac8e81a5a212165f33743847ab8Douglas Gregor#include "llvm/ADT/StringExtras.h" 2822f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor#include "llvm/ADT/StringSwitch.h" 29458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor#include "llvm/ADT/Twine.h" 3086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor#include <list> 3186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor#include <map> 3286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor#include <vector> 3381b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor 3481b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregorusing namespace clang; 35781472fe99a120098c631b0cbe33c89f8cef5e70John McCallusing namespace sema; 3681b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor 3786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregornamespace { 3886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \brief A container of code-completion results. 3986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor class ResultBuilder { 4086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor public: 4186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \brief The type of a name-lookup filter, which can be provided to the 4286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// name-lookup routines to specify which declarations should be included in 4386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// the result set (when it returns true) and which declarations should be 4486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// filtered out (returns false). 4586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor typedef bool (ResultBuilder::*LookupFilter)(NamedDecl *) const; 4686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 470a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 4886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 4986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor private: 5086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \brief The actual results we have found. 5186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor std::vector<Result> Results; 5286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 5386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \brief A record of all of the declarations we have found and placed 5486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// into the result set, used to ensure that no declaration ever gets into 5586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// the result set twice. 5686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor llvm::SmallPtrSet<Decl*, 16> AllDeclsFound; 5786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 58fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor typedef std::pair<NamedDecl *, unsigned> DeclIndexPair; 59fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 60fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor /// \brief An entry in the shadow map, which is optimized to store 61fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor /// a single (declaration, index) mapping (the common case) but 62fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor /// can also store a list of (declaration, index) mappings. 63fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor class ShadowMapEntry { 645f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner typedef SmallVector<DeclIndexPair, 4> DeclIndexPairVector; 65fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 66fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor /// \brief Contains either the solitary NamedDecl * or a vector 67fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor /// of (declaration, index) pairs. 68fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor llvm::PointerUnion<NamedDecl *, DeclIndexPairVector*> DeclOrVector; 69fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 70fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor /// \brief When the entry contains a single declaration, this is 71fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor /// the index associated with that entry. 72fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor unsigned SingleDeclIndex; 73fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 74fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor public: 75fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ShadowMapEntry() : DeclOrVector(), SingleDeclIndex(0) { } 76fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 77fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor void Add(NamedDecl *ND, unsigned Index) { 78fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (DeclOrVector.isNull()) { 79fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor // 0 - > 1 elements: just set the single element information. 80fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor DeclOrVector = ND; 81fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor SingleDeclIndex = Index; 82fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return; 83fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 84fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 85fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (NamedDecl *PrevND = DeclOrVector.dyn_cast<NamedDecl *>()) { 86fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor // 1 -> 2 elements: create the vector of results and push in the 87fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor // existing declaration. 88fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor DeclIndexPairVector *Vec = new DeclIndexPairVector; 89fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor Vec->push_back(DeclIndexPair(PrevND, SingleDeclIndex)); 90fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor DeclOrVector = Vec; 91fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 92fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 93fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor // Add the new element to the end of the vector. 94fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor DeclOrVector.get<DeclIndexPairVector*>()->push_back( 95fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor DeclIndexPair(ND, Index)); 96fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 97fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 98fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor void Destroy() { 99fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (DeclIndexPairVector *Vec 100fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor = DeclOrVector.dyn_cast<DeclIndexPairVector *>()) { 101fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor delete Vec; 102fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor DeclOrVector = ((NamedDecl *)0); 103fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 104fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 105fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 106fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor // Iteration. 107fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor class iterator; 108fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor iterator begin() const; 109fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor iterator end() const; 110fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor }; 111fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 11286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \brief A mapping from declaration names to the declarations that have 11386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// this name within a particular scope and their index within the list of 11486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// results. 115fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor typedef llvm::DenseMap<DeclarationName, ShadowMapEntry> ShadowMap; 11686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 11786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \brief The semantic analysis object for which results are being 11886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// produced. 11986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Sema &SemaRef; 120218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor 121218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor /// \brief The allocator used to allocate new code-completion strings. 122dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor CodeCompletionAllocator &Allocator; 12386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 12486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \brief If non-NULL, a filter function used to remove any code-completion 12586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// results that are not desirable. 12686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor LookupFilter Filter; 12745bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor 12845bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor /// \brief Whether we should allow declarations as 12945bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor /// nested-name-specifiers that would otherwise be filtered out. 13045bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor bool AllowNestedNameSpecifiers; 13145bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor 1325ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor /// \brief If set, the type that we would prefer our resulting value 1335ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor /// declarations to have. 1345ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor /// 1355ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor /// Closely matching the preferred type gives a boost to a result's 1365ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor /// priority. 1375ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor CanQualType PreferredType; 1385ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 13986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \brief A list of shadow maps, which is used to model name hiding at 14086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// different levels of, e.g., the inheritance hierarchy. 14186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor std::list<ShadowMap> ShadowMaps; 14286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 1433cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor /// \brief If we're potentially referring to a C++ member function, the set 1443cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor /// of qualifiers applied to the object type. 1453cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor Qualifiers ObjectTypeQualifiers; 1463cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor 1473cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor /// \brief Whether the \p ObjectTypeQualifiers field is active. 1483cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor bool HasObjectTypeQualifiers; 1493cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor 150265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor /// \brief The selector that we prefer. 151265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor Selector PreferredSelector; 152265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor 153ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor /// \brief The completion context in which we are gathering results. 154cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor CodeCompletionContext CompletionContext; 155cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor 156ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor /// \brief If we are in an instance method definition, the @implementation 157ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor /// object. 158ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor ObjCImplementationDecl *ObjCImplementation; 159ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor 160cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor void AdjustResultPriorityForDecl(Result &R); 1611f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 1626f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor void MaybeAddConstructorResults(Result R); 1636f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 16486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor public: 165dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor explicit ResultBuilder(Sema &SemaRef, CodeCompletionAllocator &Allocator, 16652779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor const CodeCompletionContext &CompletionContext, 16752779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor LookupFilter Filter = 0) 168218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor : SemaRef(SemaRef), Allocator(Allocator), Filter(Filter), 169218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor AllowNestedNameSpecifiers(false), HasObjectTypeQualifiers(false), 170ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor CompletionContext(CompletionContext), 171ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor ObjCImplementation(0) 172ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor { 173ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor // If this is an Objective-C instance method definition, dig out the 174ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor // corresponding implementation. 175ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor switch (CompletionContext.getKind()) { 176ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor case CodeCompletionContext::CCC_Expression: 177ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor case CodeCompletionContext::CCC_ObjCMessageReceiver: 178ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor case CodeCompletionContext::CCC_ParenthesizedExpression: 179ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor case CodeCompletionContext::CCC_Statement: 180ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor case CodeCompletionContext::CCC_Recovery: 181ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor if (ObjCMethodDecl *Method = SemaRef.getCurMethodDecl()) 182ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor if (Method->isInstanceMethod()) 183ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor if (ObjCInterfaceDecl *Interface = Method->getClassInterface()) 184ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor ObjCImplementation = Interface->getImplementation(); 185ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor break; 186ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor 187ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor default: 188ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor break; 189ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor } 190ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor } 19186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 192d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor /// \brief Whether we should include code patterns in the completion 193d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor /// results. 194d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor bool includeCodePatterns() const { 195d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor return SemaRef.CodeCompleter && 196f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor SemaRef.CodeCompleter->includeCodePatterns(); 197d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor } 198d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor 19986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \brief Set the filter used for code-completion results. 20086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor void setFilter(LookupFilter Filter) { 20186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor this->Filter = Filter; 20286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 20386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 20486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Result *data() { return Results.empty()? 0 : &Results.front(); } 20586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor unsigned size() const { return Results.size(); } 20686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool empty() const { return Results.empty(); } 20786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 2085ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor /// \brief Specify the preferred type. 2095ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor void setPreferredType(QualType T) { 2105ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor PreferredType = SemaRef.Context.getCanonicalType(T); 2115ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor } 2125ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 2133cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor /// \brief Set the cv-qualifiers on the object type, for us in filtering 2143cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor /// calls to member functions. 2153cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor /// 2163cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor /// When there are qualifiers in this set, they will be used to filter 2173cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor /// out member functions that aren't available (because there will be a 2183cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor /// cv-qualifier mismatch) or prefer functions with an exact qualifier 2193cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor /// match. 2203cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor void setObjectTypeQualifiers(Qualifiers Quals) { 2213cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor ObjectTypeQualifiers = Quals; 2223cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor HasObjectTypeQualifiers = true; 2233cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor } 2243cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor 225265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor /// \brief Set the preferred selector. 226265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor /// 227265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor /// When an Objective-C method declaration result is added, and that 228265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor /// method's selector matches this preferred selector, we give that method 229265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor /// a slight priority boost. 230265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor void setPreferredSelector(Selector Sel) { 231265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor PreferredSelector = Sel; 232265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor } 233ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor 234cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor /// \brief Retrieve the code-completion context for which results are 235cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor /// being collected. 236cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor const CodeCompletionContext &getCompletionContext() const { 237cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor return CompletionContext; 238cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor } 239cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor 24045bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor /// \brief Specify whether nested-name-specifiers are allowed. 24145bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor void allowNestedNameSpecifiers(bool Allow = true) { 24245bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor AllowNestedNameSpecifiers = Allow; 24345bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor } 24445bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor 245b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor /// \brief Return the semantic analysis object for which we are collecting 246b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor /// code completion results. 247b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor Sema &getSema() const { return SemaRef; } 248b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor 249218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor /// \brief Retrieve the allocator used to allocate code completion strings. 250dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor CodeCompletionAllocator &getAllocator() const { return Allocator; } 251218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor 252e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor /// \brief Determine whether the given declaration is at all interesting 253e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor /// as a code-completion result. 25445bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor /// 25545bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor /// \param ND the declaration that we are inspecting. 25645bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor /// 25745bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor /// \param AsNestedNameSpecifier will be set true if this declaration is 25845bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor /// only interesting when it is a nested-name-specifier. 25945bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor bool isInterestingDecl(NamedDecl *ND, bool &AsNestedNameSpecifier) const; 2606660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor 2616660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor /// \brief Check whether the result is hidden by the Hiding declaration. 2626660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor /// 2636660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor /// \returns true if the result is hidden and cannot be found, false if 2646660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor /// the hidden result could still be found. When false, \p R may be 2656660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor /// modified to describe how the result can be found (e.g., via extra 2666660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor /// qualification). 2676660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor bool CheckHiddenResult(Result &R, DeclContext *CurContext, 2686660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor NamedDecl *Hiding); 2696660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor 27086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \brief Add a new result to this result set (if it isn't already in one 27186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// of the shadow maps), or replace an existing result (for, e.g., a 27286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// redeclaration). 273456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor /// 2741ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// \param CurContext the result to add (if it is unique). 275456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor /// 276456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor /// \param R the context in which this result will be named. 277456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor void MaybeAddResult(Result R, DeclContext *CurContext = 0); 27886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 2791ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// \brief Add a new result to this result set, where we already know 2801ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// the hiding declation (if any). 2811ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// 2821ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// \param R the result to add (if it is unique). 2831ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// 2841ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// \param CurContext the context in which this result will be named. 2851ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// 2861ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// \param Hiding the declaration that hides the result. 2870cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor /// 2880cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor /// \param InBaseClass whether the result was found in a base 2890cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor /// class of the searched context. 2900cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor void AddResult(Result R, DeclContext *CurContext, NamedDecl *Hiding, 2910cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor bool InBaseClass); 2921ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 293a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor /// \brief Add a new non-declaration result to this result set. 294a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor void AddResult(Result R); 295a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor 29686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \brief Enter into a new scope. 29786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor void EnterNewScope(); 29886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 29986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \brief Exit from the current scope. 30086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor void ExitScope(); 30186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 30255385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor /// \brief Ignore this declaration, if it is seen again. 30355385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor void Ignore(Decl *D) { AllDeclsFound.insert(D->getCanonicalDecl()); } 30455385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor 30586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \name Name lookup predicates 30686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// 30786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// These predicates can be passed to the name lookup functions to filter the 30886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// results of name lookup. All of the predicates have the same type, so that 30986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// 31086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor //@{ 311791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor bool IsOrdinaryName(NamedDecl *ND) const; 3124710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor bool IsOrdinaryNonTypeName(NamedDecl *ND) const; 313f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor bool IsIntegralConstantValue(NamedDecl *ND) const; 31401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor bool IsOrdinaryNonValueName(NamedDecl *ND) const; 31586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool IsNestedNameSpecifier(NamedDecl *ND) const; 31686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool IsEnum(NamedDecl *ND) const; 31786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool IsClassOrStruct(NamedDecl *ND) const; 31886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool IsUnion(NamedDecl *ND) const; 31986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool IsNamespace(NamedDecl *ND) const; 32086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool IsNamespaceOrAlias(NamedDecl *ND) const; 32186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool IsType(NamedDecl *ND) const; 322eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor bool IsMember(NamedDecl *ND) const; 32380f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor bool IsObjCIvar(NamedDecl *ND) const; 3248e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor bool IsObjCMessageReceiver(NamedDecl *ND) const; 325fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor bool IsObjCCollection(NamedDecl *ND) const; 32652779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor bool IsImpossibleToSatisfy(NamedDecl *ND) const; 32786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor //@} 32886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor }; 32986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 33086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 331fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregorclass ResultBuilder::ShadowMapEntry::iterator { 332fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor llvm::PointerUnion<NamedDecl*, const DeclIndexPair*> DeclOrIterator; 333fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor unsigned SingleDeclIndex; 334fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 335fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregorpublic: 336fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor typedef DeclIndexPair value_type; 337fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor typedef value_type reference; 338fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor typedef std::ptrdiff_t difference_type; 339fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor typedef std::input_iterator_tag iterator_category; 340fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 341fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor class pointer { 342fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor DeclIndexPair Value; 343fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 344fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor public: 345fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor pointer(const DeclIndexPair &Value) : Value(Value) { } 346fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 347fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor const DeclIndexPair *operator->() const { 348fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return &Value; 349fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 350fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor }; 351fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 352fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor iterator() : DeclOrIterator((NamedDecl *)0), SingleDeclIndex(0) { } 353fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 354fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor iterator(NamedDecl *SingleDecl, unsigned Index) 355fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor : DeclOrIterator(SingleDecl), SingleDeclIndex(Index) { } 356fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 357fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor iterator(const DeclIndexPair *Iterator) 358fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor : DeclOrIterator(Iterator), SingleDeclIndex(0) { } 359fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 360fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor iterator &operator++() { 361fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (DeclOrIterator.is<NamedDecl *>()) { 362fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor DeclOrIterator = (NamedDecl *)0; 363fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor SingleDeclIndex = 0; 364fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return *this; 365fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 366fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 367fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor const DeclIndexPair *I = DeclOrIterator.get<const DeclIndexPair*>(); 368fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ++I; 369fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor DeclOrIterator = I; 370fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return *this; 371fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 372fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 37366392d4260cdd1a98f9ce908d99e3cf9a31432e2Chris Lattner /*iterator operator++(int) { 374fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor iterator tmp(*this); 375fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ++(*this); 376fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return tmp; 37766392d4260cdd1a98f9ce908d99e3cf9a31432e2Chris Lattner }*/ 378fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 379fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor reference operator*() const { 380fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (NamedDecl *ND = DeclOrIterator.dyn_cast<NamedDecl *>()) 381fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return reference(ND, SingleDeclIndex); 382fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 383d490f953e812a9bb1729637cc70a6db7d997ced0Douglas Gregor return *DeclOrIterator.get<const DeclIndexPair*>(); 384fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 385fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 386fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor pointer operator->() const { 387fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return pointer(**this); 388fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 389fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 390fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor friend bool operator==(const iterator &X, const iterator &Y) { 391d490f953e812a9bb1729637cc70a6db7d997ced0Douglas Gregor return X.DeclOrIterator.getOpaqueValue() 392d490f953e812a9bb1729637cc70a6db7d997ced0Douglas Gregor == Y.DeclOrIterator.getOpaqueValue() && 393fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor X.SingleDeclIndex == Y.SingleDeclIndex; 394fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 395fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 396fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor friend bool operator!=(const iterator &X, const iterator &Y) { 397d490f953e812a9bb1729637cc70a6db7d997ced0Douglas Gregor return !(X == Y); 398fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 399fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor}; 400fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 401fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas GregorResultBuilder::ShadowMapEntry::iterator 402fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas GregorResultBuilder::ShadowMapEntry::begin() const { 403fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (DeclOrVector.isNull()) 404fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return iterator(); 405fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 406fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (NamedDecl *ND = DeclOrVector.dyn_cast<NamedDecl *>()) 407fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return iterator(ND, SingleDeclIndex); 408fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 409fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return iterator(DeclOrVector.get<DeclIndexPairVector *>()->begin()); 410fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor} 411fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 412fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas GregorResultBuilder::ShadowMapEntry::iterator 413fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas GregorResultBuilder::ShadowMapEntry::end() const { 414fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (DeclOrVector.is<NamedDecl *>() || DeclOrVector.isNull()) 415fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return iterator(); 416fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 417fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return iterator(DeclOrVector.get<DeclIndexPairVector *>()->end()); 418fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor} 419fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 420456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// \brief Compute the qualification required to get from the current context 421456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// (\p CurContext) to the target context (\p TargetContext). 422456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// 423456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// \param Context the AST context in which the qualification will be used. 424456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// 425456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// \param CurContext the context where an entity is being named, which is 426456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// typically based on the current scope. 427456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// 428456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// \param TargetContext the context in which the named entity actually 429456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// resides. 430456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// 431456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// \returns a nested name specifier that refers into the target context, or 432456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// NULL if no qualification is needed. 433456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregorstatic NestedNameSpecifier * 434456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas GregorgetRequiredQualification(ASTContext &Context, 435456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor DeclContext *CurContext, 436456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor DeclContext *TargetContext) { 4375f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<DeclContext *, 4> TargetParents; 438456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor 439456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor for (DeclContext *CommonAncestor = TargetContext; 440456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor CommonAncestor && !CommonAncestor->Encloses(CurContext); 441456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor CommonAncestor = CommonAncestor->getLookupParent()) { 442456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor if (CommonAncestor->isTransparentContext() || 443456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor CommonAncestor->isFunctionOrMethod()) 444456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor continue; 445456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor 446456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor TargetParents.push_back(CommonAncestor); 447456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor } 448456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor 449456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor NestedNameSpecifier *Result = 0; 450456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor while (!TargetParents.empty()) { 451456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor DeclContext *Parent = TargetParents.back(); 452456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor TargetParents.pop_back(); 453456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor 454fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor if (NamespaceDecl *Namespace = dyn_cast<NamespaceDecl>(Parent)) { 455fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor if (!Namespace->getIdentifier()) 456fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor continue; 457fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor 458456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor Result = NestedNameSpecifier::Create(Context, Result, Namespace); 459fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor } 460456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor else if (TagDecl *TD = dyn_cast<TagDecl>(Parent)) 461456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor Result = NestedNameSpecifier::Create(Context, Result, 462456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor false, 463456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor Context.getTypeDeclType(TD).getTypePtr()); 4640c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor } 465456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor return Result; 466456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor} 467456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor 46845bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregorbool ResultBuilder::isInterestingDecl(NamedDecl *ND, 46945bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor bool &AsNestedNameSpecifier) const { 47045bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor AsNestedNameSpecifier = false; 47145bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor 472e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor ND = ND->getUnderlyingDecl(); 473e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor unsigned IDNS = ND->getIdentifierNamespace(); 474f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor 475f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor // Skip unnamed entities. 476e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor if (!ND->getDeclName()) 477e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return false; 47886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 47986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Friend declarations and declarations introduced due to friends are never 48086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // added as results. 48192b7f70c924cbf4514e9e434cea7def51ab49860John McCall if (IDNS & (Decl::IDNS_OrdinaryFriend | Decl::IDNS_TagFriend)) 482e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return false; 483e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 4847628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor // Class template (partial) specializations are never added as results. 485e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor if (isa<ClassTemplateSpecializationDecl>(ND) || 486e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor isa<ClassTemplatePartialSpecializationDecl>(ND)) 487e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return false; 48886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 4897628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor // Using declarations themselves are never added as results. 490e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor if (isa<UsingDecl>(ND)) 491e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return false; 492e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 493e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor // Some declarations have reserved names that we don't want to ever show. 494e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor if (const IdentifierInfo *Id = ND->getIdentifier()) { 49586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // __va_list_tag is a freak of nature. Find it and skip it. 49686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (Id->isStr("__va_list_tag") || Id->isStr("__builtin_va_list")) 497e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return false; 49886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 499f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor // Filter out names reserved for the implementation (C99 7.1.3, 500797efb51ce0825eb4cce2864a5cea2b30e85f06cDouglas Gregor // C++ [lib.global.names]) if they come from a system header. 501e013d685c6689ac7ae103ee88acf573422d1ed6aDaniel Dunbar // 502e013d685c6689ac7ae103ee88acf573422d1ed6aDaniel Dunbar // FIXME: Add predicate for this. 503f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor if (Id->getLength() >= 2) { 504e013d685c6689ac7ae103ee88acf573422d1ed6aDaniel Dunbar const char *Name = Id->getNameStart(); 505f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor if (Name[0] == '_' && 506797efb51ce0825eb4cce2864a5cea2b30e85f06cDouglas Gregor (Name[1] == '_' || (Name[1] >= 'A' && Name[1] <= 'Z')) && 507797efb51ce0825eb4cce2864a5cea2b30e85f06cDouglas Gregor (ND->getLocation().isInvalid() || 508797efb51ce0825eb4cce2864a5cea2b30e85f06cDouglas Gregor SemaRef.SourceMgr.isInSystemHeader( 509797efb51ce0825eb4cce2864a5cea2b30e85f06cDouglas Gregor SemaRef.SourceMgr.getSpellingLoc(ND->getLocation())))) 510e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return false; 511f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor } 51286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 5136f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 5149b0ba87a5ee4d872ae60dbfe4cbd500e57b8a775Douglas Gregor // Skip out-of-line declarations and definitions. 5159b0ba87a5ee4d872ae60dbfe4cbd500e57b8a775Douglas Gregor // NOTE: Unless it's an Objective-C property, method, or ivar, where 5169b0ba87a5ee4d872ae60dbfe4cbd500e57b8a775Douglas Gregor // the contexts can be messy. 5179b0ba87a5ee4d872ae60dbfe4cbd500e57b8a775Douglas Gregor if (!ND->getDeclContext()->Equals(ND->getLexicalDeclContext()) && 5189b0ba87a5ee4d872ae60dbfe4cbd500e57b8a775Douglas Gregor !(isa<ObjCPropertyDecl>(ND) || isa<ObjCIvarDecl>(ND) || 5199b0ba87a5ee4d872ae60dbfe4cbd500e57b8a775Douglas Gregor isa<ObjCMethodDecl>(ND))) 5209b0ba87a5ee4d872ae60dbfe4cbd500e57b8a775Douglas Gregor return false; 5219b0ba87a5ee4d872ae60dbfe4cbd500e57b8a775Douglas Gregor 522a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor if (Filter == &ResultBuilder::IsNestedNameSpecifier || 523a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor ((isa<NamespaceDecl>(ND) || isa<NamespaceAliasDecl>(ND)) && 524a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor Filter != &ResultBuilder::IsNamespace && 52552779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor Filter != &ResultBuilder::IsNamespaceOrAlias && 52652779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor Filter != 0)) 527a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor AsNestedNameSpecifier = true; 528a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor 52986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Filter out any unwanted results. 53045bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor if (Filter && !(this->*Filter)(ND)) { 53145bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor // Check whether it is interesting as a nested-name-specifier. 53245bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor if (AllowNestedNameSpecifiers && SemaRef.getLangOptions().CPlusPlus && 53345bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor IsNestedNameSpecifier(ND) && 53445bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor (Filter != &ResultBuilder::IsMember || 53545bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor (isa<CXXRecordDecl>(ND) && 53645bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor cast<CXXRecordDecl>(ND)->isInjectedClassName()))) { 53745bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor AsNestedNameSpecifier = true; 53845bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor return true; 53945bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor } 54045bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor 541e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return false; 542a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor } 543e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor // ... then it must be interesting! 544e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return true; 545e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor} 546e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 5476660d845af8edb99098a08cf2539233a3be650b3Douglas Gregorbool ResultBuilder::CheckHiddenResult(Result &R, DeclContext *CurContext, 5486660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor NamedDecl *Hiding) { 5496660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor // In C, there is no way to refer to a hidden name. 5506660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor // FIXME: This isn't true; we can find a tag name hidden by an ordinary 5516660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor // name if we introduce the tag type. 5526660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor if (!SemaRef.getLangOptions().CPlusPlus) 5536660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor return true; 5546660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor 5557a126a474fdde06382b315b4e3d8ef0a21d4dc31Sebastian Redl DeclContext *HiddenCtx = R.Declaration->getDeclContext()->getRedeclContext(); 5566660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor 5576660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor // There is no way to qualify a name declared in a function or method. 5586660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor if (HiddenCtx->isFunctionOrMethod()) 5596660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor return true; 5606660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor 5617a126a474fdde06382b315b4e3d8ef0a21d4dc31Sebastian Redl if (HiddenCtx == Hiding->getDeclContext()->getRedeclContext()) 5626660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor return true; 5636660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor 5646660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor // We can refer to the result with the appropriate qualification. Do it. 5656660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor R.Hidden = true; 5666660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor R.QualifierIsInformative = false; 5676660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor 5686660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor if (!R.Qualifier) 5696660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor R.Qualifier = getRequiredQualification(SemaRef.Context, 5706660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor CurContext, 5716660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor R.Declaration->getDeclContext()); 5726660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor return false; 5736660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor} 5746660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor 5751f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor/// \brief A simplified classification of types used to determine whether two 5761f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor/// types are "similar enough" when adjusting priorities. 5771827e10051638770ad9ccf3e285caf95f995afd1Douglas GregorSimplifiedTypeClass clang::getSimplifiedTypeClass(CanQualType T) { 5781f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor switch (T->getTypeClass()) { 5791f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::Builtin: 5801f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor switch (cast<BuiltinType>(T)->getKind()) { 5811f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case BuiltinType::Void: 5821f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Void; 5831f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 5841f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case BuiltinType::NullPtr: 5851f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Pointer; 5861f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 5871f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case BuiltinType::Overload: 5881f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case BuiltinType::Dependent: 5891f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Other; 5901f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 5911f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case BuiltinType::ObjCId: 5921f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case BuiltinType::ObjCClass: 5931f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case BuiltinType::ObjCSel: 5941f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_ObjectiveC; 5951f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 5961f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor default: 5971f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Arithmetic; 5981f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor } 5997530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie 6001f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::Complex: 6011f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Arithmetic; 6021f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 6031f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::Pointer: 6041f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Pointer; 6051f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 6061f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::BlockPointer: 6071f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Block; 6081f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 6091f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::LValueReference: 6101f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::RValueReference: 6111f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return getSimplifiedTypeClass(T->getAs<ReferenceType>()->getPointeeType()); 6121f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 6131f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::ConstantArray: 6141f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::IncompleteArray: 6151f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::VariableArray: 6161f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::DependentSizedArray: 6171f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Array; 6181f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 6191f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::DependentSizedExtVector: 6201f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::Vector: 6211f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::ExtVector: 6221f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Arithmetic; 6231f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 6241f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::FunctionProto: 6251f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::FunctionNoProto: 6261f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Function; 6271f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 6281f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::Record: 6291f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Record; 6301f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 6311f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::Enum: 6321f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Arithmetic; 6331f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 6341f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::ObjCObject: 6351f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::ObjCInterface: 6361f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::ObjCObjectPointer: 6371f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_ObjectiveC; 6381f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 6391f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor default: 6401f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Other; 6411f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor } 6421f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor} 6431f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 6441f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor/// \brief Get the type that a given expression will have if this declaration 6451f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor/// is used as an expression in its "typical" code-completion form. 6461827e10051638770ad9ccf3e285caf95f995afd1Douglas GregorQualType clang::getDeclUsageType(ASTContext &C, NamedDecl *ND) { 6471f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor ND = cast<NamedDecl>(ND->getUnderlyingDecl()); 6481f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 6491f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor if (TypeDecl *Type = dyn_cast<TypeDecl>(ND)) 6501f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return C.getTypeDeclType(Type); 6511f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor if (ObjCInterfaceDecl *Iface = dyn_cast<ObjCInterfaceDecl>(ND)) 6521f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return C.getObjCInterfaceType(Iface); 6531f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 6541f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor QualType T; 6551f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor if (FunctionDecl *Function = dyn_cast<FunctionDecl>(ND)) 6565291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor T = Function->getCallResultType(); 6571f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor else if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(ND)) 6585291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor T = Method->getSendResultType(); 6591f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor else if (FunctionTemplateDecl *FunTmpl = dyn_cast<FunctionTemplateDecl>(ND)) 6605291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor T = FunTmpl->getTemplatedDecl()->getCallResultType(); 6611f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor else if (EnumConstantDecl *Enumerator = dyn_cast<EnumConstantDecl>(ND)) 6621f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor T = C.getTypeDeclType(cast<EnumDecl>(Enumerator->getDeclContext())); 6631f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor else if (ObjCPropertyDecl *Property = dyn_cast<ObjCPropertyDecl>(ND)) 6641f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor T = Property->getType(); 6651f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor else if (ValueDecl *Value = dyn_cast<ValueDecl>(ND)) 6661f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor T = Value->getType(); 6671f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor else 6681f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return QualType(); 6693e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor 6703e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor // Dig through references, function pointers, and block pointers to 6713e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor // get down to the likely type of an expression when the entity is 6723e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor // used. 6733e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor do { 6743e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor if (const ReferenceType *Ref = T->getAs<ReferenceType>()) { 6753e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor T = Ref->getPointeeType(); 6763e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor continue; 6773e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor } 6783e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor 6793e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor if (const PointerType *Pointer = T->getAs<PointerType>()) { 6803e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor if (Pointer->getPointeeType()->isFunctionType()) { 6813e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor T = Pointer->getPointeeType(); 6823e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor continue; 6833e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor } 6843e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor 6853e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor break; 6863e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor } 6873e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor 6883e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor if (const BlockPointerType *Block = T->getAs<BlockPointerType>()) { 6893e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor T = Block->getPointeeType(); 6903e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor continue; 6913e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor } 6923e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor 6933e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor if (const FunctionType *Function = T->getAs<FunctionType>()) { 6943e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor T = Function->getResultType(); 6953e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor continue; 6963e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor } 6973e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor 6983e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor break; 6993e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor } while (true); 7003e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor 7013e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor return T; 7021f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor} 7031f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 704cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregorvoid ResultBuilder::AdjustResultPriorityForDecl(Result &R) { 705cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor // If this is an Objective-C method declaration whose selector matches our 706cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor // preferred selector, give it a priority boost. 707cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor if (!PreferredSelector.isNull()) 708cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(R.Declaration)) 709cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor if (PreferredSelector == Method->getSelector()) 710cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor R.Priority += CCD_SelectorMatch; 71108f43cd5d966fd31b32bd5c76c0645ebbf08b2f1Douglas Gregor 712cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor // If we have a preferred type, adjust the priority for results with exactly- 713cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor // matching or nearly-matching types. 714cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor if (!PreferredType.isNull()) { 715cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor QualType T = getDeclUsageType(SemaRef.Context, R.Declaration); 716cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor if (!T.isNull()) { 717cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor CanQualType TC = SemaRef.Context.getCanonicalType(T); 718cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor // Check for exactly-matching types (modulo qualifiers). 719cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor if (SemaRef.Context.hasSameUnqualifiedType(PreferredType, TC)) 720cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor R.Priority /= CCF_ExactTypeMatch; 721cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor // Check for nearly-matching types, based on classification of each. 722cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor else if ((getSimplifiedTypeClass(PreferredType) 7231f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor == getSimplifiedTypeClass(TC)) && 724cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor !(PreferredType->isEnumeralType() && TC->isEnumeralType())) 725cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor R.Priority /= CCF_SimilarTypeMatch; 726cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor } 727cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor } 7281f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor} 7291f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 7306f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregorvoid ResultBuilder::MaybeAddConstructorResults(Result R) { 7316f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor if (!SemaRef.getLangOptions().CPlusPlus || !R.Declaration || 7326f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor !CompletionContext.wantConstructorResults()) 7336f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor return; 7346f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 7356f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor ASTContext &Context = SemaRef.Context; 7366f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor NamedDecl *D = R.Declaration; 7376f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor CXXRecordDecl *Record = 0; 7386f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor if (ClassTemplateDecl *ClassTemplate = dyn_cast<ClassTemplateDecl>(D)) 7396f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor Record = ClassTemplate->getTemplatedDecl(); 7406f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor else if ((Record = dyn_cast<CXXRecordDecl>(D))) { 7416f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor // Skip specializations and partial specializations. 7426f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor if (isa<ClassTemplateSpecializationDecl>(Record)) 7436f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor return; 7446f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor } else { 7456f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor // There are no constructors here. 7466f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor return; 7476f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor } 7486f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 7496f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor Record = Record->getDefinition(); 7506f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor if (!Record) 7516f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor return; 7526f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 7536f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 7546f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor QualType RecordTy = Context.getTypeDeclType(Record); 7556f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor DeclarationName ConstructorName 7566f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor = Context.DeclarationNames.getCXXConstructorName( 7576f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor Context.getCanonicalType(RecordTy)); 7586f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor for (DeclContext::lookup_result Ctors = Record->lookup(ConstructorName); 7596f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor Ctors.first != Ctors.second; ++Ctors.first) { 7606f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor R.Declaration = *Ctors.first; 7616f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor R.CursorKind = getCursorKindForDecl(R.Declaration); 7626f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor Results.push_back(R); 7636f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor } 7646f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor} 7656f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 766e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregorvoid ResultBuilder::MaybeAddResult(Result R, DeclContext *CurContext) { 767e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor assert(!ShadowMaps.empty() && "Must enter into a results scope"); 768e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 769e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor if (R.Kind != Result::RK_Declaration) { 770e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor // For non-declaration results, just add the result. 771e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor Results.push_back(R); 772e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return; 773e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor } 774e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 775e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor // Look through using declarations. 776e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor if (UsingShadowDecl *Using = dyn_cast<UsingShadowDecl>(R.Declaration)) { 777e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor MaybeAddResult(Result(Using->getTargetDecl(), R.Qualifier), CurContext); 77886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return; 779e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor } 78086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 781e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor Decl *CanonDecl = R.Declaration->getCanonicalDecl(); 782e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor unsigned IDNS = CanonDecl->getIdentifierNamespace(); 783e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 78445bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor bool AsNestedNameSpecifier = false; 78545bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor if (!isInterestingDecl(R.Declaration, AsNestedNameSpecifier)) 786e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return; 787e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 7886f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor // C++ constructors are never found by name lookup. 7896f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor if (isa<CXXConstructorDecl>(R.Declaration)) 7906f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor return; 7916f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 79286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ShadowMap &SMap = ShadowMaps.back(); 793fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ShadowMapEntry::iterator I, IEnd; 794fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ShadowMap::iterator NamePos = SMap.find(R.Declaration->getDeclName()); 795fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (NamePos != SMap.end()) { 796fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor I = NamePos->second.begin(); 797fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor IEnd = NamePos->second.end(); 798fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 799fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 800fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor for (; I != IEnd; ++I) { 801fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor NamedDecl *ND = I->first; 802fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor unsigned Index = I->second; 80386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (ND->getCanonicalDecl() == CanonDecl) { 80486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // This is a redeclaration. Always pick the newer declaration. 80586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Results[Index].Declaration = R.Declaration; 80686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 80786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // We're done. 80886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return; 80986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 81086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 81186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 81286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // This is a new declaration in this scope. However, check whether this 81386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // declaration name is hidden by a similarly-named declaration in an outer 81486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // scope. 81586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor std::list<ShadowMap>::iterator SM, SMEnd = ShadowMaps.end(); 81686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor --SMEnd; 81786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor for (SM = ShadowMaps.begin(); SM != SMEnd; ++SM) { 818fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ShadowMapEntry::iterator I, IEnd; 819fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ShadowMap::iterator NamePos = SM->find(R.Declaration->getDeclName()); 820fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (NamePos != SM->end()) { 821fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor I = NamePos->second.begin(); 822fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor IEnd = NamePos->second.end(); 823fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 824fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor for (; I != IEnd; ++I) { 82586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // A tag declaration does not hide a non-tag declaration. 8260d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCall if (I->first->hasTagIdentifierNamespace() && 82786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor (IDNS & (Decl::IDNS_Member | Decl::IDNS_Ordinary | 82886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Decl::IDNS_ObjCProtocol))) 82986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor continue; 83086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 83186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Protocols are in distinct namespaces from everything else. 832fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (((I->first->getIdentifierNamespace() & Decl::IDNS_ObjCProtocol) 83386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor || (IDNS & Decl::IDNS_ObjCProtocol)) && 834fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor I->first->getIdentifierNamespace() != IDNS) 83586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor continue; 83686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 83786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // The newly-added result is hidden by an entry in the shadow map. 8386660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor if (CheckHiddenResult(R, CurContext, I->first)) 83986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return; 84086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 84186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor break; 84286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 84386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 84486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 84586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Make sure that any given declaration only shows up in the result set once. 84686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!AllDeclsFound.insert(CanonDecl)) 84786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return; 848265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor 849eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor // If the filter is for nested-name-specifiers, then this result starts a 850eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor // nested-name-specifier. 85112e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor if (AsNestedNameSpecifier) { 852eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor R.StartsNestedNameSpecifier = true; 85312e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor R.Priority = CCP_NestedNameSpecifier; 854cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor } else 855cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor AdjustResultPriorityForDecl(R); 856265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor 8570563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor // If this result is supposed to have an informative qualifier, add one. 858eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor if (R.QualifierIsInformative && !R.Qualifier && 859eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor !R.StartsNestedNameSpecifier) { 8600563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor DeclContext *Ctx = R.Declaration->getDeclContext(); 8610563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor if (NamespaceDecl *Namespace = dyn_cast<NamespaceDecl>(Ctx)) 8620563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor R.Qualifier = NestedNameSpecifier::Create(SemaRef.Context, 0, Namespace); 8630563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor else if (TagDecl *Tag = dyn_cast<TagDecl>(Ctx)) 8640563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor R.Qualifier = NestedNameSpecifier::Create(SemaRef.Context, 0, false, 8650563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor SemaRef.Context.getTypeDeclType(Tag).getTypePtr()); 8660563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor else 8670563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor R.QualifierIsInformative = false; 8680563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor } 869eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor 87086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Insert this result into the set of results and into the current shadow 87186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // map. 872fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor SMap[R.Declaration->getDeclName()].Add(R.Declaration, Results.size()); 87386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Results.push_back(R); 8746f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 8756f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor if (!AsNestedNameSpecifier) 8766f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor MaybeAddConstructorResults(R); 87786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 87886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 8791ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregorvoid ResultBuilder::AddResult(Result R, DeclContext *CurContext, 8800cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor NamedDecl *Hiding, bool InBaseClass = false) { 881a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor if (R.Kind != Result::RK_Declaration) { 882a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor // For non-declaration results, just add the result. 883a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.push_back(R); 884a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor return; 885a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor } 886a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor 8871ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor // Look through using declarations. 8881ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor if (UsingShadowDecl *Using = dyn_cast<UsingShadowDecl>(R.Declaration)) { 8891ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor AddResult(Result(Using->getTargetDecl(), R.Qualifier), CurContext, Hiding); 8901ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor return; 8911ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor } 8921ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 89345bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor bool AsNestedNameSpecifier = false; 89445bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor if (!isInterestingDecl(R.Declaration, AsNestedNameSpecifier)) 8951ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor return; 8961ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 8976f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor // C++ constructors are never found by name lookup. 8986f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor if (isa<CXXConstructorDecl>(R.Declaration)) 8996f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor return; 9006f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 9011ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor if (Hiding && CheckHiddenResult(R, CurContext, Hiding)) 9021ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor return; 9031ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 9041ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor // Make sure that any given declaration only shows up in the result set once. 9051ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor if (!AllDeclsFound.insert(R.Declaration->getCanonicalDecl())) 9061ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor return; 9071ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 9081ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor // If the filter is for nested-name-specifiers, then this result starts a 9091ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor // nested-name-specifier. 91012e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor if (AsNestedNameSpecifier) { 9111ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor R.StartsNestedNameSpecifier = true; 91212e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor R.Priority = CCP_NestedNameSpecifier; 91312e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor } 9140cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor else if (Filter == &ResultBuilder::IsMember && !R.Qualifier && InBaseClass && 9150cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor isa<CXXRecordDecl>(R.Declaration->getDeclContext() 9167a126a474fdde06382b315b4e3d8ef0a21d4dc31Sebastian Redl ->getRedeclContext())) 9170cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor R.QualifierIsInformative = true; 9180cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor 9191ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor // If this result is supposed to have an informative qualifier, add one. 9201ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor if (R.QualifierIsInformative && !R.Qualifier && 9211ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor !R.StartsNestedNameSpecifier) { 9221ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor DeclContext *Ctx = R.Declaration->getDeclContext(); 9231ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor if (NamespaceDecl *Namespace = dyn_cast<NamespaceDecl>(Ctx)) 9241ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor R.Qualifier = NestedNameSpecifier::Create(SemaRef.Context, 0, Namespace); 9251ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor else if (TagDecl *Tag = dyn_cast<TagDecl>(Ctx)) 9261ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor R.Qualifier = NestedNameSpecifier::Create(SemaRef.Context, 0, false, 92745bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor SemaRef.Context.getTypeDeclType(Tag).getTypePtr()); 9281ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor else 9291ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor R.QualifierIsInformative = false; 9301ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor } 9311ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 93212e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor // Adjust the priority if this result comes from a base class. 93312e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor if (InBaseClass) 93412e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor R.Priority += CCD_InBaseClass; 93512e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor 936cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor AdjustResultPriorityForDecl(R); 9375ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 9383cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor if (HasObjectTypeQualifiers) 9393cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(R.Declaration)) 9403cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor if (Method->isInstance()) { 9413cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor Qualifiers MethodQuals 9423cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor = Qualifiers::fromCVRMask(Method->getTypeQualifiers()); 9433cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor if (ObjectTypeQualifiers == MethodQuals) 9443cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor R.Priority += CCD_ObjectQualifierMatch; 9453cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor else if (ObjectTypeQualifiers - MethodQuals) { 9463cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor // The method cannot be invoked, because doing so would drop 9473cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor // qualifiers. 9483cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor return; 9493cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor } 9503cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor } 9513cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor 9521ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor // Insert this result into the set of results. 9531ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor Results.push_back(R); 9546f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 9556f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor if (!AsNestedNameSpecifier) 9566f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor MaybeAddConstructorResults(R); 9571ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor} 9581ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 959a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregorvoid ResultBuilder::AddResult(Result R) { 960a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor assert(R.Kind != Result::RK_Declaration && 961a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor "Declaration results need more context"); 962a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.push_back(R); 963a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor} 964a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor 96586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Enter into a new scope. 96686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorvoid ResultBuilder::EnterNewScope() { 96786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ShadowMaps.push_back(ShadowMap()); 96886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 96986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 97086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Exit from the current scope. 97186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorvoid ResultBuilder::ExitScope() { 972fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor for (ShadowMap::iterator E = ShadowMaps.back().begin(), 973fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor EEnd = ShadowMaps.back().end(); 974fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor E != EEnd; 975fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ++E) 976fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor E->second.Destroy(); 977fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 97886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ShadowMaps.pop_back(); 97986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 98086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 981791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor/// \brief Determines whether this given declaration will be found by 982791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor/// ordinary name lookup. 983791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregorbool ResultBuilder::IsOrdinaryName(NamedDecl *ND) const { 9844710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor ND = cast<NamedDecl>(ND->getUnderlyingDecl()); 9854710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor 986791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor unsigned IDNS = Decl::IDNS_Ordinary; 987791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus) 9889b30b267e77d1778e1e9b7c44b6852489c2c5096Douglas Gregor IDNS |= Decl::IDNS_Tag | Decl::IDNS_Namespace | Decl::IDNS_Member; 989ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor else if (SemaRef.getLangOptions().ObjC1) { 990ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor if (isa<ObjCIvarDecl>(ND)) 991ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor return true; 992ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor } 993ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor 994791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor return ND->getIdentifierNamespace() & IDNS; 995791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor} 996791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor 99701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor/// \brief Determines whether this given declaration will be found by 9984710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor/// ordinary name lookup but is not a type name. 9994710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregorbool ResultBuilder::IsOrdinaryNonTypeName(NamedDecl *ND) const { 10004710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor ND = cast<NamedDecl>(ND->getUnderlyingDecl()); 10014710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor if (isa<TypeDecl>(ND) || isa<ObjCInterfaceDecl>(ND)) 10024710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor return false; 10034710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor 10044710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor unsigned IDNS = Decl::IDNS_Ordinary; 10054710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus) 10069b30b267e77d1778e1e9b7c44b6852489c2c5096Douglas Gregor IDNS |= Decl::IDNS_Tag | Decl::IDNS_Namespace | Decl::IDNS_Member; 1007ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor else if (SemaRef.getLangOptions().ObjC1) { 1008ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor if (isa<ObjCIvarDecl>(ND)) 1009ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor return true; 1010ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor } 1011ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor 10124710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor return ND->getIdentifierNamespace() & IDNS; 10134710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor} 10144710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor 1015f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregorbool ResultBuilder::IsIntegralConstantValue(NamedDecl *ND) const { 1016f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor if (!IsOrdinaryNonTypeName(ND)) 1017f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor return 0; 1018f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor 1019f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor if (ValueDecl *VD = dyn_cast<ValueDecl>(ND->getUnderlyingDecl())) 1020f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor if (VD->getType()->isIntegralOrEnumerationType()) 1021f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor return true; 1022f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor 1023f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor return false; 1024f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor} 1025f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor 10264710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor/// \brief Determines whether this given declaration will be found by 102701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor/// ordinary name lookup. 102801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregorbool ResultBuilder::IsOrdinaryNonValueName(NamedDecl *ND) const { 10294710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor ND = cast<NamedDecl>(ND->getUnderlyingDecl()); 10304710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor 103101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor unsigned IDNS = Decl::IDNS_Ordinary; 103201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus) 10330d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCall IDNS |= Decl::IDNS_Tag | Decl::IDNS_Namespace; 103401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 103501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor return (ND->getIdentifierNamespace() & IDNS) && 10364710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor !isa<ValueDecl>(ND) && !isa<FunctionTemplateDecl>(ND) && 10374710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor !isa<ObjCPropertyDecl>(ND); 103801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor} 103901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 104086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Determines whether the given declaration is suitable as the 104186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// start of a C++ nested-name-specifier, e.g., a class or namespace. 104286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsNestedNameSpecifier(NamedDecl *ND) const { 104386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Allow us to find class templates, too. 104486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (ClassTemplateDecl *ClassTemplate = dyn_cast<ClassTemplateDecl>(ND)) 104586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ND = ClassTemplate->getTemplatedDecl(); 104686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 104786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return SemaRef.isAcceptableNestedNameSpecifier(ND); 104886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 104986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 105086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Determines whether the given declaration is an enumeration. 105186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsEnum(NamedDecl *ND) const { 105286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return isa<EnumDecl>(ND); 105386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 105486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 105586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Determines whether the given declaration is a class or struct. 105686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsClassOrStruct(NamedDecl *ND) const { 105786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Allow us to find class templates, too. 105886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (ClassTemplateDecl *ClassTemplate = dyn_cast<ClassTemplateDecl>(ND)) 105986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ND = ClassTemplate->getTemplatedDecl(); 106086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 106186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (RecordDecl *RD = dyn_cast<RecordDecl>(ND)) 1062465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara return RD->getTagKind() == TTK_Class || 1063465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara RD->getTagKind() == TTK_Struct; 106486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 106586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return false; 106686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 106786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 106886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Determines whether the given declaration is a union. 106986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsUnion(NamedDecl *ND) const { 107086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Allow us to find class templates, too. 107186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (ClassTemplateDecl *ClassTemplate = dyn_cast<ClassTemplateDecl>(ND)) 107286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ND = ClassTemplate->getTemplatedDecl(); 107386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 107486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (RecordDecl *RD = dyn_cast<RecordDecl>(ND)) 1075465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara return RD->getTagKind() == TTK_Union; 107686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 107786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return false; 107886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 107986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 108086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Determines whether the given declaration is a namespace. 108186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsNamespace(NamedDecl *ND) const { 108286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return isa<NamespaceDecl>(ND); 108386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 108486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 108586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Determines whether the given declaration is a namespace or 108686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// namespace alias. 108786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsNamespaceOrAlias(NamedDecl *ND) const { 108886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return isa<NamespaceDecl>(ND) || isa<NamespaceAliasDecl>(ND); 108986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 109086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 10917628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor/// \brief Determines whether the given declaration is a type. 109286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsType(NamedDecl *ND) const { 1093d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor if (UsingShadowDecl *Using = dyn_cast<UsingShadowDecl>(ND)) 1094d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor ND = Using->getTargetDecl(); 1095d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor 1096d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor return isa<TypeDecl>(ND) || isa<ObjCInterfaceDecl>(ND); 109786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 109886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 10997628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor/// \brief Determines which members of a class should be visible via 11007628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor/// "." or "->". Only value declarations, nested name specifiers, and 11017628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor/// using declarations thereof should show up. 1102eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregorbool ResultBuilder::IsMember(NamedDecl *ND) const { 11037628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor if (UsingShadowDecl *Using = dyn_cast<UsingShadowDecl>(ND)) 11047628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor ND = Using->getTargetDecl(); 11057628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor 1106ce82196076cd15f5ecfa029fcda8b58dc0146cf1Douglas Gregor return isa<ValueDecl>(ND) || isa<FunctionTemplateDecl>(ND) || 1107ce82196076cd15f5ecfa029fcda8b58dc0146cf1Douglas Gregor isa<ObjCPropertyDecl>(ND); 1108eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor} 1109eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor 11108e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregorstatic bool isObjCReceiverType(ASTContext &C, QualType T) { 11118e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor T = C.getCanonicalType(T); 11128e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor switch (T->getTypeClass()) { 11138e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor case Type::ObjCObject: 11148e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor case Type::ObjCInterface: 11158e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor case Type::ObjCObjectPointer: 11168e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor return true; 11178e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 11188e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor case Type::Builtin: 11198e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor switch (cast<BuiltinType>(T)->getKind()) { 11208e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor case BuiltinType::ObjCId: 11218e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor case BuiltinType::ObjCClass: 11228e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor case BuiltinType::ObjCSel: 11238e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor return true; 11248e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 11258e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor default: 11268e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor break; 11278e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor } 11288e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor return false; 11298e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 11308e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor default: 11318e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor break; 11328e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor } 11338e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 11348e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor if (!C.getLangOptions().CPlusPlus) 11358e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor return false; 11368e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 11378e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor // FIXME: We could perform more analysis here to determine whether a 11388e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor // particular class type has any conversions to Objective-C types. For now, 11398e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor // just accept all class types. 11408e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor return T->isDependentType() || T->isRecordType(); 11418e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor} 11428e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 11438e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregorbool ResultBuilder::IsObjCMessageReceiver(NamedDecl *ND) const { 11448e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor QualType T = getDeclUsageType(SemaRef.Context, ND); 11458e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor if (T.isNull()) 11468e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor return false; 11478e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 11488e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor T = SemaRef.Context.getBaseElementType(T); 11498e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor return isObjCReceiverType(SemaRef.Context, T); 11508e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor} 11518e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 1152fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregorbool ResultBuilder::IsObjCCollection(NamedDecl *ND) const { 1153fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor if ((SemaRef.getLangOptions().CPlusPlus && !IsOrdinaryName(ND)) || 1154fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor (!SemaRef.getLangOptions().CPlusPlus && !IsOrdinaryNonTypeName(ND))) 1155fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor return false; 1156fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor 1157fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor QualType T = getDeclUsageType(SemaRef.Context, ND); 1158fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor if (T.isNull()) 1159fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor return false; 1160fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor 1161fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor T = SemaRef.Context.getBaseElementType(T); 1162fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor return T->isObjCObjectType() || T->isObjCObjectPointerType() || 1163fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor T->isObjCIdType() || 1164fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor (SemaRef.getLangOptions().CPlusPlus && T->isRecordType()); 1165fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor} 11668e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 116752779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregorbool ResultBuilder::IsImpossibleToSatisfy(NamedDecl *ND) const { 116852779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor return false; 116952779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor} 117052779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor 117180f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor/// \rief Determines whether the given declaration is an Objective-C 117280f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor/// instance variable. 117380f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregorbool ResultBuilder::IsObjCIvar(NamedDecl *ND) const { 117480f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor return isa<ObjCIvarDecl>(ND); 117580f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor} 117680f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor 11771ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregornamespace { 11781ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// \brief Visible declaration consumer that adds a code-completion result 11791ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// for each visible declaration. 11801ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor class CodeCompletionDeclConsumer : public VisibleDeclConsumer { 11811ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor ResultBuilder &Results; 11821ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor DeclContext *CurContext; 11831ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 11841ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor public: 11851ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor CodeCompletionDeclConsumer(ResultBuilder &Results, DeclContext *CurContext) 11861ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor : Results(Results), CurContext(CurContext) { } 11871ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 1188d12059673dcef32bc2b6bae5321654d33863afe6Erik Verbruggen virtual void FoundDecl(NamedDecl *ND, NamedDecl *Hiding, DeclContext *Ctx, 1189d12059673dcef32bc2b6bae5321654d33863afe6Erik Verbruggen bool InBaseClass) { 1190d12059673dcef32bc2b6bae5321654d33863afe6Erik Verbruggen bool Accessible = true; 119117015eff2b3166e445377b15913474b472775e7cDouglas Gregor if (Ctx) 119217015eff2b3166e445377b15913474b472775e7cDouglas Gregor Accessible = Results.getSema().IsSimplyAccessible(ND, Ctx); 119317015eff2b3166e445377b15913474b472775e7cDouglas Gregor 1194d12059673dcef32bc2b6bae5321654d33863afe6Erik Verbruggen ResultBuilder::Result Result(ND, 0, false, Accessible); 1195d12059673dcef32bc2b6bae5321654d33863afe6Erik Verbruggen Results.AddResult(Result, CurContext, Hiding, InBaseClass); 11961ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor } 11971ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor }; 11981ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor} 11991ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 120086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Add type specifiers for the current language as keyword results. 1201bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddTypeSpecifierResults(const LangOptions &LangOpts, 120286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ResultBuilder &Results) { 12030a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 120412e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("short", CCP_Type)); 120512e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("long", CCP_Type)); 120612e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("signed", CCP_Type)); 120712e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("unsigned", CCP_Type)); 120812e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("void", CCP_Type)); 120912e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("char", CCP_Type)); 121012e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("int", CCP_Type)); 121112e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("float", CCP_Type)); 121212e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("double", CCP_Type)); 121312e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("enum", CCP_Type)); 121412e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("struct", CCP_Type)); 121512e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("union", CCP_Type)); 121612e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("const", CCP_Type)); 121712e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("volatile", CCP_Type)); 121801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 121986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (LangOpts.C99) { 122086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // C99-specific 122112e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("_Complex", CCP_Type)); 122212e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("_Imaginary", CCP_Type)); 122312e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("_Bool", CCP_Type)); 122412e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("restrict", CCP_Type)); 122586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 122686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 1227218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder Builder(Results.getAllocator()); 122886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (LangOpts.CPlusPlus) { 122986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // C++-specific 1230b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor Results.AddResult(Result("bool", CCP_Type + 1231b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor (LangOpts.ObjC1? CCD_bool_in_ObjC : 0))); 123212e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("class", CCP_Type)); 123312e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("wchar_t", CCP_Type)); 123486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 1235c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // typename qualified-id 1236218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("typename"); 1237218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1238218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("qualifier"); 1239218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("::"); 1240218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("name"); 1241218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1242d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor 124386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (LangOpts.CPlusPlus0x) { 124412e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("auto", CCP_Type)); 124512e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("char16_t", CCP_Type)); 124612e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("char32_t", CCP_Type)); 1247c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor 1248218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("decltype"); 1249218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1250218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1251218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1252218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 125386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 125486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 125586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 125686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // GNU extensions 125786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (LangOpts.GNUMode) { 125886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // FIXME: Enable when we actually support decimal floating point. 1259a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor // Results.AddResult(Result("_Decimal32")); 1260a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor // Results.AddResult(Result("_Decimal64")); 1261a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor // Results.AddResult(Result("_Decimal128")); 126201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1263218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("typeof"); 1264218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1265218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1266218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1267c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor 1268218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("typeof"); 1269218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1270218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("type"); 1271218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1272218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 127301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 127401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor} 127501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1276f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCallstatic void AddStorageSpecifiers(Sema::ParserCompletionContext CCC, 127701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor const LangOptions &LangOpts, 127801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor ResultBuilder &Results) { 12790a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 128001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Note: we don't suggest either "auto" or "register", because both 128101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // are pointless as storage specifiers. Elsewhere, we suggest "auto" 128201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // in C++0x as a type specifier. 1283a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("extern")); 1284a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("static")); 128501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor} 128601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1287f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCallstatic void AddFunctionSpecifiers(Sema::ParserCompletionContext CCC, 128801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor const LangOptions &LangOpts, 128901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor ResultBuilder &Results) { 12900a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 129101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor switch (CCC) { 1292f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Class: 1293f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_MemberTemplate: 129401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (LangOpts.CPlusPlus) { 1295a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("explicit")); 1296a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("friend")); 1297a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("mutable")); 1298a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("virtual")); 129901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 130001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Fall through 130101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1302f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ObjCInterface: 1303f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ObjCImplementation: 1304f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Namespace: 1305f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Template: 130601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (LangOpts.CPlusPlus || LangOpts.C99) 1307a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("inline")); 130801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 130901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1310f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ObjCInstanceVariableList: 1311f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Expression: 1312f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Statement: 1313f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ForInit: 1314f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Condition: 1315f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_RecoveryInFunction: 1316f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Type: 13170268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor case Sema::PCC_ParenthesizedExpression: 131868e3c2eef52701a178fbcc2bb424f31dd4b36931Douglas Gregor case Sema::PCC_LocalDeclarationSpecifiers: 131901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 132001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 132101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor} 132201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1323bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCExpressionResults(ResultBuilder &Results, bool NeedAt); 1324bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCStatementResults(ResultBuilder &Results, bool NeedAt); 1325bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCVisibilityResults(const LangOptions &LangOpts, 1326c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor ResultBuilder &Results, 1327c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor bool NeedAt); 1328bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCImplementationResults(const LangOptions &LangOpts, 1329b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor ResultBuilder &Results, 1330b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor bool NeedAt); 1331bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCInterfaceResults(const LangOptions &LangOpts, 1332b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor ResultBuilder &Results, 1333b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor bool NeedAt); 1334bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCTopLevelResults(ResultBuilder &Results, bool NeedAt); 1335b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 1336c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregorstatic void AddTypedefResult(ResultBuilder &Results) { 1337218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder Builder(Results.getAllocator()); 1338218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("typedef"); 1339218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1340218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("type"); 1341218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1342218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("name"); 1343218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(CodeCompletionResult(Builder.TakeString())); 1344c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor} 1345c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor 1346f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCallstatic bool WantTypesInContext(Sema::ParserCompletionContext CCC, 13474710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor const LangOptions &LangOpts) { 13484710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor switch (CCC) { 1349f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Namespace: 1350f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Class: 1351f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ObjCInstanceVariableList: 1352f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Template: 1353f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_MemberTemplate: 1354f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Statement: 1355f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_RecoveryInFunction: 1356f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Type: 13570268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor case Sema::PCC_ParenthesizedExpression: 135868e3c2eef52701a178fbcc2bb424f31dd4b36931Douglas Gregor case Sema::PCC_LocalDeclarationSpecifiers: 13594710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor return true; 13604710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor 1361f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Expression: 1362f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Condition: 13630268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor return LangOpts.CPlusPlus; 13640268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor 13650268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor case Sema::PCC_ObjCInterface: 13660268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor case Sema::PCC_ObjCImplementation: 13674710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor return false; 13684710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor 1369f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ForInit: 13700268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor return LangOpts.CPlusPlus || LangOpts.ObjC1 || LangOpts.C99; 13714710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor } 13727530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie 13737530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie llvm_unreachable("Invalid ParserCompletionContext!"); 13744710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor} 13754710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor 1376ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidisstatic PrintingPolicy getCompletionPrintingPolicy(const ASTContext &Context, 1377ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis const Preprocessor &PP) { 1378ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis PrintingPolicy Policy = Sema::getPrintingPolicy(Context, PP); 13798ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Policy.AnonymousTagLocations = false; 13808ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Policy.SuppressStrongLifetime = true; 138125270b6e6a8416b7532cfe552b41794418ea19b1Douglas Gregor Policy.SuppressUnwrittenScope = true; 13828ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor return Policy; 13838ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor} 13848ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor 1385ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis/// \brief Retrieve a printing policy suitable for code completion. 1386ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidisstatic PrintingPolicy getCompletionPrintingPolicy(Sema &S) { 1387ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis return getCompletionPrintingPolicy(S.Context, S.PP); 1388ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis} 1389ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis 13908ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor/// \brief Retrieve the string representation of the given type as a string 13918ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor/// that has the appropriate lifetime for code completion. 13928ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor/// 13938ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor/// This routine provides a fast path where we provide constant strings for 13948ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor/// common type names. 13958ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregorstatic const char *GetCompletionTypeString(QualType T, 13968ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor ASTContext &Context, 13978ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor const PrintingPolicy &Policy, 13988ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor CodeCompletionAllocator &Allocator) { 13998ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor if (!T.getLocalQualifiers()) { 14008ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor // Built-in type names are constant strings. 14018ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor if (const BuiltinType *BT = dyn_cast<BuiltinType>(T)) 14028ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor return BT->getName(Policy); 14038ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor 14048ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor // Anonymous tag types are constant strings. 14058ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor if (const TagType *TagT = dyn_cast<TagType>(T)) 14068ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor if (TagDecl *Tag = TagT->getDecl()) 14078ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor if (!Tag->getIdentifier() && !Tag->getTypedefNameForAnonDecl()) { 14088ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor switch (Tag->getTagKind()) { 14098ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor case TTK_Struct: return "struct <anonymous>"; 14108ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor case TTK_Class: return "class <anonymous>"; 14118ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor case TTK_Union: return "union <anonymous>"; 14128ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor case TTK_Enum: return "enum <anonymous>"; 14138ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor } 14148ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor } 14158ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor } 14168ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor 14178ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor // Slow path: format the type as a string. 14188ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor std::string Result; 14198ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor T.getAsStringInternal(Result, Policy); 14208ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor return Allocator.CopyString(Result); 14218ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor} 14228ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor 142301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor/// \brief Add language constructs that show up for "ordinary" names. 1424f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCallstatic void AddOrdinaryNameResults(Sema::ParserCompletionContext CCC, 142501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Scope *S, 142601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Sema &SemaRef, 142701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor ResultBuilder &Results) { 14288ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor CodeCompletionAllocator &Allocator = Results.getAllocator(); 14298ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor CodeCompletionBuilder Builder(Allocator); 14308ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor PrintingPolicy Policy = getCompletionPrintingPolicy(SemaRef); 1431218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor 14320a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 143301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor switch (CCC) { 1434f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Namespace: 1435c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor if (SemaRef.getLangOptions().CPlusPlus) { 1436c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor if (Results.includeCodePatterns()) { 1437c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // namespace <identifier> { declarations } 1438218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("namespace"); 1439218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1440218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("identifier"); 1441218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 1442218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("declarations"); 1443218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 1444218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 1445218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1446c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor } 1447c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor 144801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // namespace identifier = identifier ; 1449218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("namespace"); 1450218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1451218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("name"); 1452218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_Equal); 1453218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("namespace"); 1454218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 145501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 145601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Using directives 1457218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("using"); 1458218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1459218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("namespace"); 1460218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1461218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("identifier"); 1462218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 146301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 146401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // asm(string-literal) 1465218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("asm"); 1466218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1467218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("string-literal"); 1468218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1469218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 147001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1471c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor if (Results.includeCodePatterns()) { 1472c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // Explicit template instantiation 1473218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("template"); 1474218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1475218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("declaration"); 1476218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1477c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor } 147801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 1479b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 1480b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor if (SemaRef.getLangOptions().ObjC1) 1481bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCTopLevelResults(Results, true); 1482b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 1483c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor AddTypedefResult(Results); 148401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Fall through 148501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1486f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Class: 1487c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor if (SemaRef.getLangOptions().CPlusPlus) { 148801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Using declaration 1489218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("using"); 1490218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1491218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("qualifier"); 1492218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("::"); 1493218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("name"); 1494218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 149501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1496c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // using typename qualifier::name (only in a dependent context) 149701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (SemaRef.CurContext->isDependentContext()) { 1498218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("using"); 1499218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1500218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("typename"); 1501218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1502218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("qualifier"); 1503218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("::"); 1504218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("name"); 1505218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 150601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 150701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1508f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall if (CCC == Sema::PCC_Class) { 1509c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor AddTypedefResult(Results); 1510c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor 151101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // public: 1512218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("public"); 1513218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_Colon); 1514218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 151501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 151601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // protected: 1517218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("protected"); 1518218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_Colon); 1519218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 152001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 152101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // private: 1522218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("private"); 1523218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_Colon); 1524218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 152501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 152601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 152701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Fall through 152801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1529f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Template: 1530f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_MemberTemplate: 1531d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus && Results.includeCodePatterns()) { 153201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // template < parameters > 1533218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("template"); 1534218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftAngle); 1535218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("parameters"); 1536218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightAngle); 1537218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 153801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 153901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1540bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddStorageSpecifiers(CCC, SemaRef.getLangOptions(), Results); 1541bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddFunctionSpecifiers(CCC, SemaRef.getLangOptions(), Results); 154201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 154301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1544f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ObjCInterface: 1545bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCInterfaceResults(SemaRef.getLangOptions(), Results, true); 1546bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddStorageSpecifiers(CCC, SemaRef.getLangOptions(), Results); 1547bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddFunctionSpecifiers(CCC, SemaRef.getLangOptions(), Results); 1548b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor break; 1549b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 1550f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ObjCImplementation: 1551bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCImplementationResults(SemaRef.getLangOptions(), Results, true); 1552bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddStorageSpecifiers(CCC, SemaRef.getLangOptions(), Results); 1553bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddFunctionSpecifiers(CCC, SemaRef.getLangOptions(), Results); 1554b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor break; 1555b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 1556f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ObjCInstanceVariableList: 1557bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCVisibilityResults(SemaRef.getLangOptions(), Results, true); 1558c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor break; 1559c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor 1560f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_RecoveryInFunction: 1561f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Statement: { 1562c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor AddTypedefResult(Results); 156301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1564ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor if (SemaRef.getLangOptions().CPlusPlus && Results.includeCodePatterns() && 1565ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor SemaRef.getLangOptions().CXXExceptions) { 1566218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("try"); 1567218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 1568218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("statements"); 1569218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 1570218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 1571218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("catch"); 1572218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1573218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("declaration"); 1574218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1575218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 1576218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("statements"); 1577218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 1578218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 1579218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 158001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 1581b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor if (SemaRef.getLangOptions().ObjC1) 1582bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCStatementResults(Results, true); 1583b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 1584d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor if (Results.includeCodePatterns()) { 1585d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor // if (condition) { statements } 1586218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("if"); 1587218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1588d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus) 1589218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("condition"); 1590d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor else 1591218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1592218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1593218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 1594218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("statements"); 1595218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 1596218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 1597218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 159801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1599d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor // switch (condition) { } 1600218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("switch"); 1601218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1602d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus) 1603218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("condition"); 1604d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor else 1605218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1606218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1607218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 1608218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 1609218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 1610218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1611d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor } 1612d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor 161301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Switch-specific statements. 1614781472fe99a120098c631b0cbe33c89f8cef5e70John McCall if (!SemaRef.getCurFunction()->SwitchStack.empty()) { 161501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // case expression: 1616218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("case"); 1617218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1618218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1619218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_Colon); 1620218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 162101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 162201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // default: 1623218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("default"); 1624218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_Colon); 1625218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 162601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 162701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1628d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor if (Results.includeCodePatterns()) { 1629d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor /// while (condition) { statements } 1630218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("while"); 1631218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1632d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus) 1633218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("condition"); 1634d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor else 1635218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1636218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1637218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 1638218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("statements"); 1639218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 1640218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 1641218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 164201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1643d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor // do { statements } while ( expression ); 1644218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("do"); 1645218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 1646218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("statements"); 1647218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 1648218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 1649218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("while"); 1650218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1651218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1652218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1653218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 165401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1655d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor // for ( for-init-statement ; condition ; expression ) { statements } 1656218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("for"); 1657218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1658d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus || SemaRef.getLangOptions().C99) 1659218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("init-statement"); 1660d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor else 1661218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("init-expression"); 1662218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_SemiColon); 1663218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("condition"); 1664218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_SemiColon); 1665218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("inc-expression"); 1666218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1667218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 1668218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 1669218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("statements"); 1670218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 1671218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 1672218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1673d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor } 167401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 167501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (S->getContinueParent()) { 167601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // continue ; 1677218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("continue"); 1678218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 167901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 168001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 168101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (S->getBreakParent()) { 168201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // break ; 1683218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("break"); 1684218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 168501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 168601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 168701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // "return expression ;" or "return ;", depending on whether we 168801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // know the function is void or not. 168901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor bool isVoid = false; 169001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (FunctionDecl *Function = dyn_cast<FunctionDecl>(SemaRef.CurContext)) 169101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor isVoid = Function->getResultType()->isVoidType(); 169201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor else if (ObjCMethodDecl *Method 169301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor = dyn_cast<ObjCMethodDecl>(SemaRef.CurContext)) 169401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor isVoid = Method->getResultType()->isVoidType(); 16959ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor else if (SemaRef.getCurBlock() && 16969ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor !SemaRef.getCurBlock()->ReturnType.isNull()) 16979ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor isVoid = SemaRef.getCurBlock()->ReturnType->isVoidType(); 1698218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("return"); 16999329800d6f4c4ea8778aabd64cde1b712b290b00Douglas Gregor if (!isVoid) { 1700218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1701218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 17029329800d6f4c4ea8778aabd64cde1b712b290b00Douglas Gregor } 1703218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 170401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1705c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // goto identifier ; 1706218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("goto"); 1707218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1708218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("label"); 1709218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 171001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1711c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // Using directives 1712218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("using"); 1713218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1714218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("namespace"); 1715218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1716218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("identifier"); 1717218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 171801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 171901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 172001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Fall through (for statement expressions). 1721f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ForInit: 1722f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Condition: 1723bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddStorageSpecifiers(CCC, SemaRef.getLangOptions(), Results); 172401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Fall through: conditions and statements can have expressions. 172501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 17260268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor case Sema::PCC_ParenthesizedExpression: 1727f85e193739c953358c865005855253af4f68a497John McCall if (SemaRef.getLangOptions().ObjCAutoRefCount && 1728f85e193739c953358c865005855253af4f68a497John McCall CCC == Sema::PCC_ParenthesizedExpression) { 1729f85e193739c953358c865005855253af4f68a497John McCall // (__bridge <type>)<expression> 1730f85e193739c953358c865005855253af4f68a497John McCall Builder.AddTypedTextChunk("__bridge"); 1731f85e193739c953358c865005855253af4f68a497John McCall Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1732f85e193739c953358c865005855253af4f68a497John McCall Builder.AddPlaceholderChunk("type"); 1733f85e193739c953358c865005855253af4f68a497John McCall Builder.AddChunk(CodeCompletionString::CK_RightParen); 1734f85e193739c953358c865005855253af4f68a497John McCall Builder.AddPlaceholderChunk("expression"); 1735f85e193739c953358c865005855253af4f68a497John McCall Results.AddResult(Result(Builder.TakeString())); 1736f85e193739c953358c865005855253af4f68a497John McCall 1737f85e193739c953358c865005855253af4f68a497John McCall // (__bridge_transfer <Objective-C type>)<expression> 1738f85e193739c953358c865005855253af4f68a497John McCall Builder.AddTypedTextChunk("__bridge_transfer"); 1739f85e193739c953358c865005855253af4f68a497John McCall Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1740f85e193739c953358c865005855253af4f68a497John McCall Builder.AddPlaceholderChunk("Objective-C type"); 1741f85e193739c953358c865005855253af4f68a497John McCall Builder.AddChunk(CodeCompletionString::CK_RightParen); 1742f85e193739c953358c865005855253af4f68a497John McCall Builder.AddPlaceholderChunk("expression"); 1743f85e193739c953358c865005855253af4f68a497John McCall Results.AddResult(Result(Builder.TakeString())); 1744f85e193739c953358c865005855253af4f68a497John McCall 1745f85e193739c953358c865005855253af4f68a497John McCall // (__bridge_retained <CF type>)<expression> 1746f85e193739c953358c865005855253af4f68a497John McCall Builder.AddTypedTextChunk("__bridge_retained"); 1747f85e193739c953358c865005855253af4f68a497John McCall Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1748f85e193739c953358c865005855253af4f68a497John McCall Builder.AddPlaceholderChunk("CF type"); 1749f85e193739c953358c865005855253af4f68a497John McCall Builder.AddChunk(CodeCompletionString::CK_RightParen); 1750f85e193739c953358c865005855253af4f68a497John McCall Builder.AddPlaceholderChunk("expression"); 1751f85e193739c953358c865005855253af4f68a497John McCall Results.AddResult(Result(Builder.TakeString())); 1752f85e193739c953358c865005855253af4f68a497John McCall } 1753f85e193739c953358c865005855253af4f68a497John McCall // Fall through 1754f85e193739c953358c865005855253af4f68a497John McCall 1755f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Expression: { 175601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus) { 175701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // 'this', if we're in a non-static member function. 175872899c34e3d1abfffa241ad0ce5c4bf175e5ea51Eli Friedman QualType ThisTy = SemaRef.getCurrentThisType(); 17598ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor if (!ThisTy.isNull()) { 17608ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk(GetCompletionTypeString(ThisTy, 17618ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor SemaRef.Context, 17628ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Policy, 17638ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Allocator)); 17648ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddTypedTextChunk("this"); 17658ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 17668ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor } 17678ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor 17688ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor // true 17698ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("bool"); 17708ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddTypedTextChunk("true"); 17718ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 177201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 17738ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor // false 17748ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("bool"); 17758ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddTypedTextChunk("false"); 17768ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 177701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1778ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor if (SemaRef.getLangOptions().RTTI) { 1779ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor // dynamic_cast < type-id > ( expression ) 1780ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddTypedTextChunk("dynamic_cast"); 1781ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftAngle); 1782ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddPlaceholderChunk("type"); 1783ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightAngle); 1784ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1785ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1786ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1787ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1788ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor } 1789c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor 1790c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // static_cast < type-id > ( expression ) 1791218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("static_cast"); 1792218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftAngle); 1793218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("type"); 1794218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightAngle); 1795218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1796218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1797218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1798218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1799d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor 1800c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // reinterpret_cast < type-id > ( expression ) 1801218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("reinterpret_cast"); 1802218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftAngle); 1803218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("type"); 1804218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightAngle); 1805218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1806218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1807218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1808218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1809d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor 1810c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // const_cast < type-id > ( expression ) 1811218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("const_cast"); 1812218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftAngle); 1813218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("type"); 1814218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightAngle); 1815218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1816218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1817218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1818218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1819d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor 1820ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor if (SemaRef.getLangOptions().RTTI) { 1821ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor // typeid ( expression-or-type ) 18228ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("std::type_info"); 1823ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddTypedTextChunk("typeid"); 1824ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1825ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddPlaceholderChunk("expression-or-type"); 1826ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1827ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1828ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor } 1829ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor 1830c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // new T ( ... ) 1831218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("new"); 1832218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1833218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("type"); 1834218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1835218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expressions"); 1836218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1837218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 183801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1839c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // new T [ ] ( ... ) 1840218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("new"); 1841218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1842218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("type"); 1843218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBracket); 1844218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("size"); 1845218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBracket); 1846218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1847218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expressions"); 1848218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1849218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 185001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1851c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // delete expression 18528ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("void"); 1853218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("delete"); 1854218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1855218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1856218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 185701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1858c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // delete [] expression 18598ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("void"); 1860218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("delete"); 1861218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1862218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBracket); 1863218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBracket); 1864218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1865218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1866218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1867c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor 1868ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor if (SemaRef.getLangOptions().CXXExceptions) { 1869ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor // throw expression 18708ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("void"); 1871ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddTypedTextChunk("throw"); 1872ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1873ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1874ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1875ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor } 1876a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor 187712e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor // FIXME: Rethrow? 1878a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor 1879a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor if (SemaRef.getLangOptions().CPlusPlus0x) { 1880a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor // nullptr 18818ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("std::nullptr_t"); 1882a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddTypedTextChunk("nullptr"); 1883a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1884a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor 1885a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor // alignof 18868ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("size_t"); 1887a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddTypedTextChunk("alignof"); 1888a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1889a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddPlaceholderChunk("type"); 1890a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1891a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1892a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor 1893a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor // noexcept 18948ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("bool"); 1895a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddTypedTextChunk("noexcept"); 1896a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1897a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1898a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1899a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1900a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor 1901a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor // sizeof... expression 19028ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("size_t"); 1903a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddTypedTextChunk("sizeof..."); 1904a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1905a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddPlaceholderChunk("parameter-pack"); 1906a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1907a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1908a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor } 190901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 191001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 191101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (SemaRef.getLangOptions().ObjC1) { 191201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Add "super", if we're in an Objective-C class with a superclass. 1913681e256048cf9d3d226b9d0699f3df22c2500ef4Ted Kremenek if (ObjCMethodDecl *Method = SemaRef.getCurMethodDecl()) { 1914681e256048cf9d3d226b9d0699f3df22c2500ef4Ted Kremenek // The interface can be NULL. 1915681e256048cf9d3d226b9d0699f3df22c2500ef4Ted Kremenek if (ObjCInterfaceDecl *ID = Method->getClassInterface()) 19168ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor if (ID->getSuperClass()) { 19178ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor std::string SuperType; 19188ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor SuperType = ID->getSuperClass()->getNameAsString(); 19198ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor if (Method->isInstanceMethod()) 19208ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor SuperType += " *"; 19218ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor 19228ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk(Allocator.CopyString(SuperType)); 19238ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddTypedTextChunk("super"); 19248ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 19258ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor } 1926681e256048cf9d3d226b9d0699f3df22c2500ef4Ted Kremenek } 1927681e256048cf9d3d226b9d0699f3df22c2500ef4Ted Kremenek 1928bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCExpressionResults(Results, true); 192901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 193001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1931c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // sizeof expression 19328ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("size_t"); 1933218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("sizeof"); 1934218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1935218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression-or-type"); 1936218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1937218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 193801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 193986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 1940d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor 1941f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Type: 194268e3c2eef52701a178fbcc2bb424f31dd4b36931Douglas Gregor case Sema::PCC_LocalDeclarationSpecifiers: 1943d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor break; 194401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 194501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 19464710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor if (WantTypesInContext(CCC, SemaRef.getLangOptions())) 19474710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor AddTypeSpecifierResults(SemaRef.getLangOptions(), Results); 194801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1949f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall if (SemaRef.getLangOptions().CPlusPlus && CCC != Sema::PCC_Type) 1950a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("operator")); 195186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 195286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 1953ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor/// \brief If the given declaration has an associated type, add it as a result 1954ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor/// type chunk. 1955ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregorstatic void AddResultTypeChunk(ASTContext &Context, 19568987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor const PrintingPolicy &Policy, 1957ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor NamedDecl *ND, 1958218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder &Result) { 1959ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor if (!ND) 1960ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor return; 19616f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 19626f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor // Skip constructors and conversion functions, which have their return types 19636f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor // built into their names. 19646f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor if (isa<CXXConstructorDecl>(ND) || isa<CXXConversionDecl>(ND)) 19656f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor return; 19666f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 1967ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor // Determine the type of the declaration (if it has a type). 19686f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor QualType T; 1969ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor if (FunctionDecl *Function = dyn_cast<FunctionDecl>(ND)) 1970ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor T = Function->getResultType(); 1971ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor else if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(ND)) 1972ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor T = Method->getResultType(); 1973ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor else if (FunctionTemplateDecl *FunTmpl = dyn_cast<FunctionTemplateDecl>(ND)) 1974ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor T = FunTmpl->getTemplatedDecl()->getResultType(); 1975ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor else if (EnumConstantDecl *Enumerator = dyn_cast<EnumConstantDecl>(ND)) 1976ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor T = Context.getTypeDeclType(cast<TypeDecl>(Enumerator->getDeclContext())); 1977ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor else if (isa<UnresolvedUsingValueDecl>(ND)) { 1978ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor /* Do nothing: ignore unresolved using declarations*/ 1979f85e193739c953358c865005855253af4f68a497John McCall } else if (ValueDecl *Value = dyn_cast<ValueDecl>(ND)) { 1980ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor T = Value->getType(); 1981f85e193739c953358c865005855253af4f68a497John McCall } else if (ObjCPropertyDecl *Property = dyn_cast<ObjCPropertyDecl>(ND)) 1982ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor T = Property->getType(); 1983ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor 1984ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor if (T.isNull() || Context.hasSameType(T, Context.DependentTy)) 1985ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor return; 1986ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor 19878987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor Result.AddResultTypeChunk(GetCompletionTypeString(T, Context, Policy, 1988a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor Result.getAllocator())); 1989ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor} 1990ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor 1991aaa107acc8f906203101af259e8d764b5027700aDouglas Gregorstatic void MaybeAddSentinel(ASTContext &Context, NamedDecl *FunctionOrMethod, 1992218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder &Result) { 1993aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor if (SentinelAttr *Sentinel = FunctionOrMethod->getAttr<SentinelAttr>()) 1994aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor if (Sentinel->getSentinel() == 0) { 1995aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor if (Context.getLangOptions().ObjC1 && 1996aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor Context.Idents.get("nil").hasMacroDefinition()) 1997218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddTextChunk(", nil"); 1998aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor else if (Context.Idents.get("NULL").hasMacroDefinition()) 1999218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddTextChunk(", NULL"); 2000aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor else 2001218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddTextChunk(", (void*)0"); 2002aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor } 2003aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor} 2004aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor 20056fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregorstatic std::string formatObjCParamQualifiers(unsigned ObjCQuals) { 20066fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor std::string Result; 20076fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor if (ObjCQuals & Decl::OBJC_TQ_In) 20086ef920976a86aa710ccfeeeb7e14e9b38aef5007Douglas Gregor Result += "in "; 20096fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor else if (ObjCQuals & Decl::OBJC_TQ_Inout) 20106ef920976a86aa710ccfeeeb7e14e9b38aef5007Douglas Gregor Result += "inout "; 20116fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor else if (ObjCQuals & Decl::OBJC_TQ_Out) 20126ef920976a86aa710ccfeeeb7e14e9b38aef5007Douglas Gregor Result += "out "; 20136fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor if (ObjCQuals & Decl::OBJC_TQ_Bycopy) 20146ef920976a86aa710ccfeeeb7e14e9b38aef5007Douglas Gregor Result += "bycopy "; 20156fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor else if (ObjCQuals & Decl::OBJC_TQ_Byref) 20166ef920976a86aa710ccfeeeb7e14e9b38aef5007Douglas Gregor Result += "byref "; 20176fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor if (ObjCQuals & Decl::OBJC_TQ_Oneway) 20186ef920976a86aa710ccfeeeb7e14e9b38aef5007Douglas Gregor Result += "oneway "; 20196fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor return Result; 20206fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor} 20216fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor 202283482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregorstatic std::string FormatFunctionParameter(ASTContext &Context, 20238987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor const PrintingPolicy &Policy, 2024aba480862485ea1140a81f25c23f43bb080edc90Douglas Gregor ParmVarDecl *Param, 2025ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor bool SuppressName = false, 2026ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor bool SuppressBlock = false) { 202783482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor bool ObjCMethodParam = isa<ObjCMethodDecl>(Param->getDeclContext()); 202883482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor if (Param->getType()->isDependentType() || 202983482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor !Param->getType()->isBlockPointerType()) { 203083482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor // The argument for a dependent or non-block parameter is a placeholder 203183482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor // containing that parameter's type. 203283482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor std::string Result; 203383482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor 2034aba480862485ea1140a81f25c23f43bb080edc90Douglas Gregor if (Param->getIdentifier() && !ObjCMethodParam && !SuppressName) 203583482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor Result = Param->getIdentifier()->getName(); 203683482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor 2037f85e193739c953358c865005855253af4f68a497John McCall Param->getType().getAsStringInternal(Result, Policy); 203883482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor 203983482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor if (ObjCMethodParam) { 20406fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor Result = "(" + formatObjCParamQualifiers(Param->getObjCDeclQualifier()) 20416fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor + Result + ")"; 2042aba480862485ea1140a81f25c23f43bb080edc90Douglas Gregor if (Param->getIdentifier() && !SuppressName) 204383482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor Result += Param->getIdentifier()->getName(); 204483482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor } 204583482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor return Result; 204683482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor } 204783482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor 204883482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor // The argument for a block pointer parameter is a block literal with 204983482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor // the appropriate type. 2050830072c2de881aadfe0f6efd3baccc9129a77e37Douglas Gregor FunctionTypeLoc *Block = 0; 2051830072c2de881aadfe0f6efd3baccc9129a77e37Douglas Gregor FunctionProtoTypeLoc *BlockProto = 0; 205283482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor TypeLoc TL; 205383482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor if (TypeSourceInfo *TSInfo = Param->getTypeSourceInfo()) { 205483482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor TL = TSInfo->getTypeLoc().getUnqualifiedLoc(); 205583482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor while (true) { 205683482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor // Look through typedefs. 2057ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor if (!SuppressBlock) { 2058ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor if (TypedefTypeLoc *TypedefTL = dyn_cast<TypedefTypeLoc>(&TL)) { 2059ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor if (TypeSourceInfo *InnerTSInfo 2060ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor = TypedefTL->getTypedefNameDecl()->getTypeSourceInfo()) { 2061ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor TL = InnerTSInfo->getTypeLoc().getUnqualifiedLoc(); 2062ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor continue; 2063ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor } 2064ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor } 2065ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor 2066ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor // Look through qualified types 2067ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor if (QualifiedTypeLoc *QualifiedTL = dyn_cast<QualifiedTypeLoc>(&TL)) { 2068ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor TL = QualifiedTL->getUnqualifiedLoc(); 206983482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor continue; 207083482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor } 207183482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor } 207283482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor 207383482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor // Try to get the function prototype behind the block pointer type, 207483482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor // then we're done. 207583482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor if (BlockPointerTypeLoc *BlockPtr 207683482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor = dyn_cast<BlockPointerTypeLoc>(&TL)) { 2077723df245307a530da5433dfb43accf187dc3e243Abramo Bagnara TL = BlockPtr->getPointeeLoc().IgnoreParens(); 2078830072c2de881aadfe0f6efd3baccc9129a77e37Douglas Gregor Block = dyn_cast<FunctionTypeLoc>(&TL); 2079830072c2de881aadfe0f6efd3baccc9129a77e37Douglas Gregor BlockProto = dyn_cast<FunctionProtoTypeLoc>(&TL); 208083482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor } 208183482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor break; 208283482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor } 208383482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor } 208483482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor 208583482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor if (!Block) { 208683482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor // We were unable to find a FunctionProtoTypeLoc with parameter names 208783482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor // for the block; just use the parameter type as a placeholder. 208883482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor std::string Result; 2089ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor if (!ObjCMethodParam && Param->getIdentifier()) 2090ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Result = Param->getIdentifier()->getName(); 2091ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor 2092f85e193739c953358c865005855253af4f68a497John McCall Param->getType().getUnqualifiedType().getAsStringInternal(Result, Policy); 209383482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor 209483482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor if (ObjCMethodParam) { 20956fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor Result = "(" + formatObjCParamQualifiers(Param->getObjCDeclQualifier()) 20966fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor + Result + ")"; 209783482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor if (Param->getIdentifier()) 209883482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor Result += Param->getIdentifier()->getName(); 209983482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor } 210083482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor 210183482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor return Result; 210283482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor } 2103ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor 210483482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor // We have the function prototype behind the block pointer type, as it was 210583482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor // written in the source. 2106382762582c8fcbc06b395a806fd57879381897a8Douglas Gregor std::string Result; 2107382762582c8fcbc06b395a806fd57879381897a8Douglas Gregor QualType ResultType = Block->getTypePtr()->getResultType(); 2108ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor if (!ResultType->isVoidType() || SuppressBlock) 2109f85e193739c953358c865005855253af4f68a497John McCall ResultType.getAsStringInternal(Result, Policy); 2110ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor 2111ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor // Format the parameter list. 2112ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor std::string Params; 2113830072c2de881aadfe0f6efd3baccc9129a77e37Douglas Gregor if (!BlockProto || Block->getNumArgs() == 0) { 2114830072c2de881aadfe0f6efd3baccc9129a77e37Douglas Gregor if (BlockProto && BlockProto->getTypePtr()->isVariadic()) 2115ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Params = "(...)"; 2116c2760bc8e99510c4b3848fcd21323afd711ee269Douglas Gregor else 2117ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Params = "(void)"; 2118382762582c8fcbc06b395a806fd57879381897a8Douglas Gregor } else { 2119ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Params += "("; 2120382762582c8fcbc06b395a806fd57879381897a8Douglas Gregor for (unsigned I = 0, N = Block->getNumArgs(); I != N; ++I) { 2121382762582c8fcbc06b395a806fd57879381897a8Douglas Gregor if (I) 2122ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Params += ", "; 2123ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Params += FormatFunctionParameter(Context, Policy, Block->getArg(I), 2124ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor /*SuppressName=*/false, 2125ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor /*SuppressBlock=*/true); 2126382762582c8fcbc06b395a806fd57879381897a8Douglas Gregor 2127830072c2de881aadfe0f6efd3baccc9129a77e37Douglas Gregor if (I == N - 1 && BlockProto->getTypePtr()->isVariadic()) 2128ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Params += ", ..."; 2129382762582c8fcbc06b395a806fd57879381897a8Douglas Gregor } 2130ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Params += ")"; 2131ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor } 2132ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor 2133ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor if (SuppressBlock) { 2134ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor // Format as a parameter. 2135ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Result = Result + " (^"; 2136ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor if (Param->getIdentifier()) 2137ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Result += Param->getIdentifier()->getName(); 2138382762582c8fcbc06b395a806fd57879381897a8Douglas Gregor Result += ")"; 2139ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Result += Params; 2140ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor } else { 2141ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor // Format as a block literal argument. 2142ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Result = '^' + Result; 2143ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Result += Params; 2144ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor 2145ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor if (Param->getIdentifier()) 2146ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Result += Param->getIdentifier()->getName(); 2147e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor } 2148382762582c8fcbc06b395a806fd57879381897a8Douglas Gregor 214983482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor return Result; 215083482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor} 215183482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor 215286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Add function parameter chunks to the given code completion string. 215386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorstatic void AddFunctionParameterChunks(ASTContext &Context, 21548987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor const PrintingPolicy &Policy, 215586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor FunctionDecl *Function, 2156218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder &Result, 2157218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor unsigned Start = 0, 2158218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor bool InOptional = false) { 21590c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor typedef CodeCompletionString::Chunk Chunk; 2160218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor bool FirstParameter = true; 21610c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 2162218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor for (unsigned P = Start, N = Function->getNumParams(); P != N; ++P) { 216386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ParmVarDecl *Param = Function->getParamDecl(P); 216486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 2165218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor if (Param->hasDefaultArg() && !InOptional) { 216686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // When we see an optional default argument, put that argument and 216786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // the remaining default arguments into a new, optional string. 2168218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder Opt(Result.getAllocator()); 2169218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor if (!FirstParameter) 2170218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Opt.AddChunk(Chunk(CodeCompletionString::CK_Comma)); 21718987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor AddFunctionParameterChunks(Context, Policy, Function, Opt, P, true); 2172218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddOptionalChunk(Opt.TakeString()); 2173218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor break; 217486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 217586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 2176218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor if (FirstParameter) 2177218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor FirstParameter = false; 2178218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor else 2179218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(Chunk(CodeCompletionString::CK_Comma)); 2180218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor 2181218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor InOptional = false; 218286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 218386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Format the placeholder string. 21848987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor std::string PlaceholderStr = FormatFunctionParameter(Context, Policy, 21858987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor Param); 218683482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor 2187e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor if (Function->isVariadic() && P == N - 1) 2188e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor PlaceholderStr += ", ..."; 2189e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor 219086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add the placeholder string. 2191dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddPlaceholderChunk( 2192dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.getAllocator().CopyString(PlaceholderStr)); 219386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 2194b3d4525c65cf456d3f1f4338afdcac83afc7be02Douglas Gregor 2195b3d4525c65cf456d3f1f4338afdcac83afc7be02Douglas Gregor if (const FunctionProtoType *Proto 2196b3d4525c65cf456d3f1f4338afdcac83afc7be02Douglas Gregor = Function->getType()->getAs<FunctionProtoType>()) 2197aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor if (Proto->isVariadic()) { 2198e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor if (Proto->getNumArgs() == 0) 2199218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddPlaceholderChunk("..."); 2200aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor 2201218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor MaybeAddSentinel(Context, Function, Result); 2202aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor } 220386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 220486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 220586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Add template parameter chunks to the given code completion string. 220686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorstatic void AddTemplateParameterChunks(ASTContext &Context, 22078987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor const PrintingPolicy &Policy, 220886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor TemplateDecl *Template, 2209218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder &Result, 2210218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor unsigned MaxParameters = 0, 2211218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor unsigned Start = 0, 2212218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor bool InDefaultArg = false) { 22130c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor typedef CodeCompletionString::Chunk Chunk; 221486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool FirstParameter = true; 221586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 221686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor TemplateParameterList *Params = Template->getTemplateParameters(); 221786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor TemplateParameterList::iterator PEnd = Params->end(); 221886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (MaxParameters) 221986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PEnd = Params->begin() + MaxParameters; 2220218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor for (TemplateParameterList::iterator P = Params->begin() + Start; 2221218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor P != PEnd; ++P) { 222286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool HasDefaultArg = false; 222386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor std::string PlaceholderStr; 222486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(*P)) { 222586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (TTP->wasDeclaredWithTypename()) 222686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr = "typename"; 222786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor else 222886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr = "class"; 222986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 223086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (TTP->getIdentifier()) { 223186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr += ' '; 223286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr += TTP->getIdentifier()->getName(); 223386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 223486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 223586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor HasDefaultArg = TTP->hasDefaultArgument(); 223686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } else if (NonTypeTemplateParmDecl *NTTP 2237218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor = dyn_cast<NonTypeTemplateParmDecl>(*P)) { 223886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (NTTP->getIdentifier()) 223986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr = NTTP->getIdentifier()->getName(); 2240f85e193739c953358c865005855253af4f68a497John McCall NTTP->getType().getAsStringInternal(PlaceholderStr, Policy); 224186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor HasDefaultArg = NTTP->hasDefaultArgument(); 224286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } else { 224386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor assert(isa<TemplateTemplateParmDecl>(*P)); 224486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor TemplateTemplateParmDecl *TTP = cast<TemplateTemplateParmDecl>(*P); 224586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 224686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Since putting the template argument list into the placeholder would 224786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // be very, very long, we just use an abbreviation. 224886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr = "template<...> class"; 224986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (TTP->getIdentifier()) { 225086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr += ' '; 225186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr += TTP->getIdentifier()->getName(); 225286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 225386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 225486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor HasDefaultArg = TTP->hasDefaultArgument(); 225586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 225686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 2257218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor if (HasDefaultArg && !InDefaultArg) { 225886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // When we see an optional default argument, put that argument and 225986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // the remaining default arguments into a new, optional string. 2260218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder Opt(Result.getAllocator()); 2261218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor if (!FirstParameter) 2262218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Opt.AddChunk(Chunk(CodeCompletionString::CK_Comma)); 22638987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor AddTemplateParameterChunks(Context, Policy, Template, Opt, MaxParameters, 2264218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor P - Params->begin(), true); 2265218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddOptionalChunk(Opt.TakeString()); 2266218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor break; 226786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 226886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 2269218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor InDefaultArg = false; 2270218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor 227186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (FirstParameter) 227286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor FirstParameter = false; 227386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor else 2274218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(Chunk(CodeCompletionString::CK_Comma)); 227586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 227686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add the placeholder string. 2277dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddPlaceholderChunk( 2278dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.getAllocator().CopyString(PlaceholderStr)); 227986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 228086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 228186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 2282b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor/// \brief Add a qualifier to the given code-completion string, if the 2283b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor/// provided nested-name-specifier is non-NULL. 2284a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregorstatic void 2285218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas GregorAddQualifierToCompletionString(CodeCompletionBuilder &Result, 2286a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor NestedNameSpecifier *Qualifier, 2287a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor bool QualifierIsInformative, 22888987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor ASTContext &Context, 22898987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor const PrintingPolicy &Policy) { 2290b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor if (!Qualifier) 2291b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor return; 2292b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor 2293b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor std::string PrintedNNS; 2294b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor { 2295b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor llvm::raw_string_ostream OS(PrintedNNS); 22968987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor Qualifier->print(OS, Policy); 2297b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor } 22980563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor if (QualifierIsInformative) 2299dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddInformativeChunk(Result.getAllocator().CopyString(PrintedNNS)); 23000563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor else 2301dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTextChunk(Result.getAllocator().CopyString(PrintedNNS)); 2302b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor} 2303b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor 2304218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregorstatic void 2305218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas GregorAddFunctionTypeQualsToCompletionString(CodeCompletionBuilder &Result, 2306218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor FunctionDecl *Function) { 2307a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor const FunctionProtoType *Proto 2308a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor = Function->getType()->getAs<FunctionProtoType>(); 2309a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor if (!Proto || !Proto->getTypeQuals()) 2310a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor return; 2311a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor 2312a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor // FIXME: Add ref-qualifier! 2313a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor 2314a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor // Handle single qualifiers without copying 2315a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor if (Proto->getTypeQuals() == Qualifiers::Const) { 2316a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor Result.AddInformativeChunk(" const"); 2317a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor return; 2318a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor } 2319a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor 2320a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor if (Proto->getTypeQuals() == Qualifiers::Volatile) { 2321a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor Result.AddInformativeChunk(" volatile"); 2322a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor return; 2323a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor } 2324a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor 2325a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor if (Proto->getTypeQuals() == Qualifiers::Restrict) { 2326a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor Result.AddInformativeChunk(" restrict"); 2327a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor return; 2328a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor } 2329a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor 2330a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor // Handle multiple qualifiers. 2331a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor std::string QualsStr; 2332a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor if (Proto->getTypeQuals() & Qualifiers::Const) 2333a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor QualsStr += " const"; 2334a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor if (Proto->getTypeQuals() & Qualifiers::Volatile) 2335a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor QualsStr += " volatile"; 2336a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor if (Proto->getTypeQuals() & Qualifiers::Restrict) 2337a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor QualsStr += " restrict"; 2338dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddInformativeChunk(Result.getAllocator().CopyString(QualsStr)); 2339a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor} 2340a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor 23416f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor/// \brief Add the name of the given declaration 23428987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregorstatic void AddTypedNameChunk(ASTContext &Context, const PrintingPolicy &Policy, 23438987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor NamedDecl *ND, CodeCompletionBuilder &Result) { 23446f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor typedef CodeCompletionString::Chunk Chunk; 23456f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 23466f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor DeclarationName Name = ND->getDeclName(); 23476f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor if (!Name) 23486f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor return; 23496f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 23506f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor switch (Name.getNameKind()) { 2351a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor case DeclarationName::CXXOperatorName: { 2352a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor const char *OperatorName = 0; 2353a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor switch (Name.getCXXOverloadedOperator()) { 2354a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor case OO_None: 2355a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor case OO_Conditional: 2356a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor case NUM_OVERLOADED_OPERATORS: 2357a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor OperatorName = "operator"; 2358a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor break; 2359a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor 2360a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 2361a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor case OO_##Name: OperatorName = "operator" Spelling; break; 2362a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor#define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly) 2363a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor#include "clang/Basic/OperatorKinds.def" 2364a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor 2365a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor case OO_New: OperatorName = "operator new"; break; 2366a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor case OO_Delete: OperatorName = "operator delete"; break; 2367a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor case OO_Array_New: OperatorName = "operator new[]"; break; 2368a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor case OO_Array_Delete: OperatorName = "operator delete[]"; break; 2369a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor case OO_Call: OperatorName = "operator()"; break; 2370a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor case OO_Subscript: OperatorName = "operator[]"; break; 2371a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor } 2372a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor Result.AddTypedTextChunk(OperatorName); 2373a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor break; 2374a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor } 2375a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor 23766f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case DeclarationName::Identifier: 23776f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case DeclarationName::CXXConversionFunctionName: 23786f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case DeclarationName::CXXDestructorName: 23796f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case DeclarationName::CXXLiteralOperatorName: 2380dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTypedTextChunk( 2381dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.getAllocator().CopyString(ND->getNameAsString())); 23826f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor break; 23836f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 23846f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case DeclarationName::CXXUsingDirective: 23856f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case DeclarationName::ObjCZeroArgSelector: 23866f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case DeclarationName::ObjCOneArgSelector: 23876f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case DeclarationName::ObjCMultiArgSelector: 23886f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor break; 23896f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 23906f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case DeclarationName::CXXConstructorName: { 23916f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor CXXRecordDecl *Record = 0; 23926f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor QualType Ty = Name.getCXXNameType(); 23936f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor if (const RecordType *RecordTy = Ty->getAs<RecordType>()) 23946f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor Record = cast<CXXRecordDecl>(RecordTy->getDecl()); 23956f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor else if (const InjectedClassNameType *InjectedTy 23966f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor = Ty->getAs<InjectedClassNameType>()) 23976f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor Record = InjectedTy->getDecl(); 23986f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor else { 2399dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTypedTextChunk( 2400dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.getAllocator().CopyString(ND->getNameAsString())); 24016f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor break; 24026f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor } 24036f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 2404dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTypedTextChunk( 2405dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.getAllocator().CopyString(Record->getNameAsString())); 24066f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor if (ClassTemplateDecl *Template = Record->getDescribedClassTemplate()) { 2407218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(Chunk(CodeCompletionString::CK_LeftAngle)); 24088987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor AddTemplateParameterChunks(Context, Policy, Template, Result); 2409218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(Chunk(CodeCompletionString::CK_RightAngle)); 24106f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor } 24116f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor break; 24126f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor } 24136f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor } 24146f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor} 24156f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 2416ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios KyrtzidisCodeCompletionString *CodeCompletionResult::CreateCodeCompletionString(Sema &S, 2417ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis CodeCompletionAllocator &Allocator) { 2418ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis return CreateCodeCompletionString(S.Context, S.PP, Allocator); 2419ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis} 2420ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis 242186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief If possible, create a new code completion string for the given 242286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// result. 242386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// 242486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \returns Either a new, heap-allocated code completion string describing 242586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// how to use this result, or NULL to indicate that the string or name of the 242686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// result is all that is needed. 242786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas GregorCodeCompletionString * 2428ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios KyrtzidisCodeCompletionResult::CreateCodeCompletionString(ASTContext &Ctx, 2429ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis Preprocessor &PP, 2430dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor CodeCompletionAllocator &Allocator) { 24310c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor typedef CodeCompletionString::Chunk Chunk; 2432218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder Result(Allocator, Priority, Availability); 24330c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 2434ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis PrintingPolicy Policy = getCompletionPrintingPolicy(Ctx, PP); 2435218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor if (Kind == RK_Pattern) { 2436218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Pattern->Priority = Priority; 2437218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Pattern->Availability = Availability; 2438218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Pattern; 2439218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor } 24402b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 24412b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor if (Kind == RK_Keyword) { 2442218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddTypedTextChunk(Keyword); 2443218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Result.TakeString(); 24442b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor } 244586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 24463f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor if (Kind == RK_Macro) { 2447ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis MacroInfo *MI = PP.getMacroInfo(Macro); 24482b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor assert(MI && "Not a macro?"); 24492b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 2450dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTypedTextChunk( 2451dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.getAllocator().CopyString(Macro->getName())); 24522b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 24532b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor if (!MI->isFunctionLike()) 2454218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Result.TakeString(); 24553f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor 24563f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor // Format a function-like macro with placeholders for the arguments. 2457218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(Chunk(CodeCompletionString::CK_LeftParen)); 2458e42447021239015db97202fb04c304d82e84135fDouglas Gregor MacroInfo::arg_iterator A = MI->arg_begin(), AEnd = MI->arg_end(); 2459c8dc1352071575c36401158094a865ad682fb886Douglas Gregor 2460c8dc1352071575c36401158094a865ad682fb886Douglas Gregor // C99 variadic macros add __VA_ARGS__ at the end. Skip it. 2461c8dc1352071575c36401158094a865ad682fb886Douglas Gregor if (MI->isC99Varargs()) { 2462c8dc1352071575c36401158094a865ad682fb886Douglas Gregor --AEnd; 2463c8dc1352071575c36401158094a865ad682fb886Douglas Gregor 2464c8dc1352071575c36401158094a865ad682fb886Douglas Gregor if (A == AEnd) { 2465c8dc1352071575c36401158094a865ad682fb886Douglas Gregor Result.AddPlaceholderChunk("..."); 2466c8dc1352071575c36401158094a865ad682fb886Douglas Gregor } 2467e42447021239015db97202fb04c304d82e84135fDouglas Gregor } 2468c8dc1352071575c36401158094a865ad682fb886Douglas Gregor 2469e42447021239015db97202fb04c304d82e84135fDouglas Gregor for (MacroInfo::arg_iterator A = MI->arg_begin(); A != AEnd; ++A) { 24703f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor if (A != MI->arg_begin()) 2471218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(Chunk(CodeCompletionString::CK_Comma)); 2472c8dc1352071575c36401158094a865ad682fb886Douglas Gregor 2473c8dc1352071575c36401158094a865ad682fb886Douglas Gregor if (MI->isVariadic() && (A+1) == AEnd) { 2474c8dc1352071575c36401158094a865ad682fb886Douglas Gregor llvm::SmallString<32> Arg = (*A)->getName(); 2475c8dc1352071575c36401158094a865ad682fb886Douglas Gregor if (MI->isC99Varargs()) 2476c8dc1352071575c36401158094a865ad682fb886Douglas Gregor Arg += ", ..."; 2477c8dc1352071575c36401158094a865ad682fb886Douglas Gregor else 2478c8dc1352071575c36401158094a865ad682fb886Douglas Gregor Arg += "..."; 2479dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddPlaceholderChunk(Result.getAllocator().CopyString(Arg)); 2480c8dc1352071575c36401158094a865ad682fb886Douglas Gregor break; 24813f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor } 2482c8dc1352071575c36401158094a865ad682fb886Douglas Gregor 2483c8dc1352071575c36401158094a865ad682fb886Douglas Gregor // Non-variadic macros are simple. 2484c8dc1352071575c36401158094a865ad682fb886Douglas Gregor Result.AddPlaceholderChunk( 2485c8dc1352071575c36401158094a865ad682fb886Douglas Gregor Result.getAllocator().CopyString((*A)->getName())); 2486e42447021239015db97202fb04c304d82e84135fDouglas Gregor } 2487218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(Chunk(CodeCompletionString::CK_RightParen)); 2488218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Result.TakeString(); 24893f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor } 24903f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor 2491d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor assert(Kind == RK_Declaration && "Missed a result kind?"); 249286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NamedDecl *ND = Declaration; 249386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 24940c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor if (StartsNestedNameSpecifier) { 2495dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTypedTextChunk( 2496dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.getAllocator().CopyString(ND->getNameAsString())); 2497218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddTextChunk("::"); 2498218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Result.TakeString(); 24990c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor } 25006164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen 25016164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen for (Decl::attr_iterator i = ND->attr_begin(); i != ND->attr_end(); ++i) { 25026164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen if (AnnotateAttr *Attr = dyn_cast_or_null<AnnotateAttr>(*i)) { 25036164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen Result.AddAnnotation(Result.getAllocator().CopyString(Attr->getAnnotation())); 25046164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen } 25056164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen } 25060c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 2507ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis AddResultTypeChunk(Ctx, Policy, ND, Result); 2508ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor 250986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (FunctionDecl *Function = dyn_cast<FunctionDecl>(ND)) { 25100563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative, 2511ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis Ctx, Policy); 2512ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis AddTypedNameChunk(Ctx, Policy, ND, Result); 2513218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(Chunk(CodeCompletionString::CK_LeftParen)); 2514ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis AddFunctionParameterChunks(Ctx, Policy, Function, Result); 2515218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(Chunk(CodeCompletionString::CK_RightParen)); 2516a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor AddFunctionTypeQualsToCompletionString(Result, Function); 2517218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Result.TakeString(); 251886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 251986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 252086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (FunctionTemplateDecl *FunTmpl = dyn_cast<FunctionTemplateDecl>(ND)) { 25210563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative, 2522ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis Ctx, Policy); 252386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor FunctionDecl *Function = FunTmpl->getTemplatedDecl(); 2524ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis AddTypedNameChunk(Ctx, Policy, Function, Result); 25256f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 252686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Figure out which template parameters are deduced (or have default 252786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // arguments). 25285f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<bool, 16> Deduced; 2529ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis Sema::MarkDeducedTemplateParameters(Ctx, FunTmpl, Deduced); 253086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor unsigned LastDeducibleArgument; 253186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor for (LastDeducibleArgument = Deduced.size(); LastDeducibleArgument > 0; 253286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor --LastDeducibleArgument) { 253386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!Deduced[LastDeducibleArgument - 1]) { 253486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // C++0x: Figure out if the template argument has a default. If so, 253586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // the user doesn't need to type this argument. 253686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // FIXME: We need to abstract template parameters better! 253786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool HasDefaultArg = false; 253886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NamedDecl *Param = FunTmpl->getTemplateParameters()->getParam( 2539218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor LastDeducibleArgument - 1); 254086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(Param)) 254186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor HasDefaultArg = TTP->hasDefaultArgument(); 254286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor else if (NonTypeTemplateParmDecl *NTTP 254386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor = dyn_cast<NonTypeTemplateParmDecl>(Param)) 254486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor HasDefaultArg = NTTP->hasDefaultArgument(); 254586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor else { 254686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor assert(isa<TemplateTemplateParmDecl>(Param)); 254786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor HasDefaultArg 25480c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor = cast<TemplateTemplateParmDecl>(Param)->hasDefaultArgument(); 254986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 255086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 255186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!HasDefaultArg) 255286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor break; 255386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 255486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 255586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 255686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (LastDeducibleArgument) { 255786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Some of the function template arguments cannot be deduced from a 255886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // function call, so we introduce an explicit template argument list 255986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // containing all of the arguments up to the first deducible argument. 2560218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(Chunk(CodeCompletionString::CK_LeftAngle)); 2561ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis AddTemplateParameterChunks(Ctx, Policy, FunTmpl, Result, 256286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor LastDeducibleArgument); 2563218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(Chunk(CodeCompletionString::CK_RightAngle)); 256486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 256586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 256686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add the function parameters 2567218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(Chunk(CodeCompletionString::CK_LeftParen)); 2568ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis AddFunctionParameterChunks(Ctx, Policy, Function, Result); 2569218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(Chunk(CodeCompletionString::CK_RightParen)); 2570a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor AddFunctionTypeQualsToCompletionString(Result, Function); 2571218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Result.TakeString(); 257286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 257386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 257486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (TemplateDecl *Template = dyn_cast<TemplateDecl>(ND)) { 25750563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative, 2576ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis Ctx, Policy); 2577dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTypedTextChunk( 2578dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.getAllocator().CopyString(Template->getNameAsString())); 2579218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(Chunk(CodeCompletionString::CK_LeftAngle)); 2580ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis AddTemplateParameterChunks(Ctx, Policy, Template, Result); 2581218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(Chunk(CodeCompletionString::CK_RightAngle)); 2582218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Result.TakeString(); 258386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 258486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 25859630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(ND)) { 25869630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor Selector Sel = Method->getSelector(); 25879630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor if (Sel.isUnarySelector()) { 2588dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTypedTextChunk(Result.getAllocator().CopyString( 2589813d8346529bf094eb2b249648906ba7fd226688Douglas Gregor Sel.getNameForSlot(0))); 2590218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Result.TakeString(); 25919630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor } 25929630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor 2593813d8346529bf094eb2b249648906ba7fd226688Douglas Gregor std::string SelName = Sel.getNameForSlot(0).str(); 2594d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor SelName += ':'; 2595d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor if (StartParameter == 0) 2596dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTypedTextChunk(Result.getAllocator().CopyString(SelName)); 2597d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor else { 2598dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddInformativeChunk(Result.getAllocator().CopyString(SelName)); 2599d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor 2600d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor // If there is only one parameter, and we're past it, add an empty 2601d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor // typed-text chunk since there is nothing to type. 2602d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor if (Method->param_size() == 1) 2603218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddTypedTextChunk(""); 2604d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor } 26059630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor unsigned Idx = 0; 26069630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor for (ObjCMethodDecl::param_iterator P = Method->param_begin(), 26079630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor PEnd = Method->param_end(); 26089630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor P != PEnd; (void)++P, ++Idx) { 26099630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor if (Idx > 0) { 2610d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor std::string Keyword; 2611d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor if (Idx > StartParameter) 2612218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(CodeCompletionString::CK_HorizontalSpace); 26139630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor if (IdentifierInfo *II = Sel.getIdentifierInfoForSlot(Idx)) 2614a0651c5f5d1c8928d3ae062435ed9cf0aa0d04baBenjamin Kramer Keyword += II->getName(); 26159630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor Keyword += ":"; 26161f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor if (Idx < StartParameter || AllParametersAreInformative) 2617dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddInformativeChunk(Result.getAllocator().CopyString(Keyword)); 2618c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor else 2619dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTypedTextChunk(Result.getAllocator().CopyString(Keyword)); 26209630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor } 2621d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor 2622d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor // If we're before the starting parameter, skip the placeholder. 2623d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor if (Idx < StartParameter) 2624d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor continue; 26259630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor 26269630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor std::string Arg; 262783482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor 262883482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor if ((*P)->getType()->isBlockPointerType() && !DeclaringEntity) 2629ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis Arg = FormatFunctionParameter(Ctx, Policy, *P, true); 263083482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor else { 2631f85e193739c953358c865005855253af4f68a497John McCall (*P)->getType().getAsStringInternal(Arg, Policy); 26326fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor Arg = "(" + formatObjCParamQualifiers((*P)->getObjCDeclQualifier()) 26336fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor + Arg + ")"; 263483482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor if (IdentifierInfo *II = (*P)->getIdentifier()) 2635aba480862485ea1140a81f25c23f43bb080edc90Douglas Gregor if (DeclaringEntity || AllParametersAreInformative) 2636a0651c5f5d1c8928d3ae062435ed9cf0aa0d04baBenjamin Kramer Arg += II->getName(); 263783482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor } 263883482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor 2639e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor if (Method->isVariadic() && (P + 1) == PEnd) 2640e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor Arg += ", ..."; 2641e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor 26421f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor if (DeclaringEntity) 2643dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTextChunk(Result.getAllocator().CopyString(Arg)); 26441f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor else if (AllParametersAreInformative) 2645dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddInformativeChunk(Result.getAllocator().CopyString(Arg)); 26464ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor else 2647dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddPlaceholderChunk(Result.getAllocator().CopyString(Arg)); 26489630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor } 26499630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor 26502a17af0c7e05500e25d4cc71341f1f232085ebeaDouglas Gregor if (Method->isVariadic()) { 2651e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor if (Method->param_size() == 0) { 2652e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor if (DeclaringEntity) 2653218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddTextChunk(", ..."); 2654e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor else if (AllParametersAreInformative) 2655218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddInformativeChunk(", ..."); 2656e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor else 2657218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddPlaceholderChunk(", ..."); 2658e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor } 2659aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor 2660ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis MaybeAddSentinel(Ctx, Method, Result); 26612a17af0c7e05500e25d4cc71341f1f232085ebeaDouglas Gregor } 26622a17af0c7e05500e25d4cc71341f1f232085ebeaDouglas Gregor 2663218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Result.TakeString(); 26649630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor } 26659630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor 26662b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor if (Qualifier) 26670563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative, 2668ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis Ctx, Policy); 26692b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 2670dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTypedTextChunk( 2671dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.getAllocator().CopyString(ND->getNameAsString())); 2672218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Result.TakeString(); 267386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 267486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 267586d802e03a267af79663990c39865c67e0645238Douglas GregorCodeCompletionString * 267686d802e03a267af79663990c39865c67e0645238Douglas GregorCodeCompleteConsumer::OverloadCandidate::CreateSignatureString( 267786d802e03a267af79663990c39865c67e0645238Douglas Gregor unsigned CurrentArg, 267832be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor Sema &S, 2679dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor CodeCompletionAllocator &Allocator) const { 26800c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor typedef CodeCompletionString::Chunk Chunk; 26818987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor PrintingPolicy Policy = getCompletionPrintingPolicy(S); 2682f85e193739c953358c865005855253af4f68a497John McCall 2683218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor // FIXME: Set priority, availability appropriately. 2684218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder Result(Allocator, 1, CXAvailability_Available); 268586d802e03a267af79663990c39865c67e0645238Douglas Gregor FunctionDecl *FDecl = getFunction(); 26868987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor AddResultTypeChunk(S.Context, Policy, FDecl, Result); 268786d802e03a267af79663990c39865c67e0645238Douglas Gregor const FunctionProtoType *Proto 268886d802e03a267af79663990c39865c67e0645238Douglas Gregor = dyn_cast<FunctionProtoType>(getFunctionType()); 268986d802e03a267af79663990c39865c67e0645238Douglas Gregor if (!FDecl && !Proto) { 269086d802e03a267af79663990c39865c67e0645238Douglas Gregor // Function without a prototype. Just give the return type and a 269186d802e03a267af79663990c39865c67e0645238Douglas Gregor // highlighted ellipsis. 269286d802e03a267af79663990c39865c67e0645238Douglas Gregor const FunctionType *FT = getFunctionType(); 2693a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor Result.AddTextChunk(GetCompletionTypeString(FT->getResultType(), 26948987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor S.Context, Policy, 2695a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor Result.getAllocator())); 2696218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(Chunk(CodeCompletionString::CK_LeftParen)); 2697218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(Chunk(CodeCompletionString::CK_CurrentParameter, "...")); 2698218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(Chunk(CodeCompletionString::CK_RightParen)); 2699218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Result.TakeString(); 270086d802e03a267af79663990c39865c67e0645238Douglas Gregor } 270186d802e03a267af79663990c39865c67e0645238Douglas Gregor 270286d802e03a267af79663990c39865c67e0645238Douglas Gregor if (FDecl) 2703dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTextChunk( 2704dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.getAllocator().CopyString(FDecl->getNameAsString())); 270586d802e03a267af79663990c39865c67e0645238Douglas Gregor else 2706218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddTextChunk( 2707dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.getAllocator().CopyString( 2708f85e193739c953358c865005855253af4f68a497John McCall Proto->getResultType().getAsString(Policy))); 270986d802e03a267af79663990c39865c67e0645238Douglas Gregor 2710218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(Chunk(CodeCompletionString::CK_LeftParen)); 271186d802e03a267af79663990c39865c67e0645238Douglas Gregor unsigned NumParams = FDecl? FDecl->getNumParams() : Proto->getNumArgs(); 271286d802e03a267af79663990c39865c67e0645238Douglas Gregor for (unsigned I = 0; I != NumParams; ++I) { 271386d802e03a267af79663990c39865c67e0645238Douglas Gregor if (I) 2714218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(Chunk(CodeCompletionString::CK_Comma)); 271586d802e03a267af79663990c39865c67e0645238Douglas Gregor 271686d802e03a267af79663990c39865c67e0645238Douglas Gregor std::string ArgString; 271786d802e03a267af79663990c39865c67e0645238Douglas Gregor QualType ArgType; 271886d802e03a267af79663990c39865c67e0645238Douglas Gregor 271986d802e03a267af79663990c39865c67e0645238Douglas Gregor if (FDecl) { 272086d802e03a267af79663990c39865c67e0645238Douglas Gregor ArgString = FDecl->getParamDecl(I)->getNameAsString(); 272186d802e03a267af79663990c39865c67e0645238Douglas Gregor ArgType = FDecl->getParamDecl(I)->getOriginalType(); 272286d802e03a267af79663990c39865c67e0645238Douglas Gregor } else { 272386d802e03a267af79663990c39865c67e0645238Douglas Gregor ArgType = Proto->getArgType(I); 272486d802e03a267af79663990c39865c67e0645238Douglas Gregor } 272586d802e03a267af79663990c39865c67e0645238Douglas Gregor 2726f85e193739c953358c865005855253af4f68a497John McCall ArgType.getAsStringInternal(ArgString, Policy); 272786d802e03a267af79663990c39865c67e0645238Douglas Gregor 272886d802e03a267af79663990c39865c67e0645238Douglas Gregor if (I == CurrentArg) 2729218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(Chunk(CodeCompletionString::CK_CurrentParameter, 2730dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.getAllocator().CopyString(ArgString))); 273186d802e03a267af79663990c39865c67e0645238Douglas Gregor else 2732dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTextChunk(Result.getAllocator().CopyString(ArgString)); 273386d802e03a267af79663990c39865c67e0645238Douglas Gregor } 273486d802e03a267af79663990c39865c67e0645238Douglas Gregor 273586d802e03a267af79663990c39865c67e0645238Douglas Gregor if (Proto && Proto->isVariadic()) { 2736218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(Chunk(CodeCompletionString::CK_Comma)); 273786d802e03a267af79663990c39865c67e0645238Douglas Gregor if (CurrentArg < NumParams) 2738218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddTextChunk("..."); 273986d802e03a267af79663990c39865c67e0645238Douglas Gregor else 2740218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(Chunk(CodeCompletionString::CK_CurrentParameter, "...")); 274186d802e03a267af79663990c39865c67e0645238Douglas Gregor } 2742218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(Chunk(CodeCompletionString::CK_RightParen)); 274386d802e03a267af79663990c39865c67e0645238Douglas Gregor 2744218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Result.TakeString(); 274586d802e03a267af79663990c39865c67e0645238Douglas Gregor} 274686d802e03a267af79663990c39865c67e0645238Douglas Gregor 27475f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerunsigned clang::getMacroUsagePriority(StringRef MacroName, 2748b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor const LangOptions &LangOpts, 27491827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor bool PreferredTypeIsPointer) { 27501827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor unsigned Priority = CCP_Macro; 27511827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor 2752b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor // Treat the "nil", "Nil" and "NULL" macros as null pointer constants. 2753b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor if (MacroName.equals("nil") || MacroName.equals("NULL") || 2754b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor MacroName.equals("Nil")) { 27551827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor Priority = CCP_Constant; 27561827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor if (PreferredTypeIsPointer) 27571827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor Priority = Priority / CCF_SimilarTypeMatch; 2758b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor } 2759b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor // Treat "YES", "NO", "true", and "false" as constants. 2760b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor else if (MacroName.equals("YES") || MacroName.equals("NO") || 2761b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor MacroName.equals("true") || MacroName.equals("false")) 2762b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor Priority = CCP_Constant; 2763b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor // Treat "bool" as a type. 2764b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor else if (MacroName.equals("bool")) 2765b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor Priority = CCP_Type + (LangOpts.ObjC1? CCD_bool_in_ObjC : 0); 2766b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor 27671827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor 27681827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor return Priority; 27691827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor} 27701827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor 2771e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas GregorCXCursorKind clang::getCursorKindForDecl(Decl *D) { 2772e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor if (!D) 2773e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor return CXCursor_UnexposedDecl; 2774e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor 2775e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor switch (D->getKind()) { 2776e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::Enum: return CXCursor_EnumDecl; 2777e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::EnumConstant: return CXCursor_EnumConstantDecl; 2778e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::Field: return CXCursor_FieldDecl; 2779e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::Function: 2780e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor return CXCursor_FunctionDecl; 2781e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::ObjCCategory: return CXCursor_ObjCCategoryDecl; 2782e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::ObjCCategoryImpl: return CXCursor_ObjCCategoryImplDecl; 2783e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::ObjCImplementation: return CXCursor_ObjCImplementationDecl; 2784375bb1413c041055262c8a416f20d10474a5eda9Douglas Gregor 2785c15707d8da08df2eb22f6ed047743fa3f7c9831bArgyrios Kyrtzidis case Decl::ObjCInterface: return CXCursor_ObjCInterfaceDecl; 2786e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::ObjCIvar: return CXCursor_ObjCIvarDecl; 2787e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::ObjCMethod: 2788e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor return cast<ObjCMethodDecl>(D)->isInstanceMethod() 2789e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor ? CXCursor_ObjCInstanceMethodDecl : CXCursor_ObjCClassMethodDecl; 2790e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::CXXMethod: return CXCursor_CXXMethod; 2791e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::CXXConstructor: return CXCursor_Constructor; 2792e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::CXXDestructor: return CXCursor_Destructor; 2793e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::CXXConversion: return CXCursor_ConversionFunction; 2794e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::ObjCProperty: return CXCursor_ObjCPropertyDecl; 2795c15707d8da08df2eb22f6ed047743fa3f7c9831bArgyrios Kyrtzidis case Decl::ObjCProtocol: return CXCursor_ObjCProtocolDecl; 2796e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::ParmVar: return CXCursor_ParmDecl; 2797e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::Typedef: return CXCursor_TypedefDecl; 2798162e1c1b487352434552147967c3dd296ebee2f7Richard Smith case Decl::TypeAlias: return CXCursor_TypeAliasDecl; 2799e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::Var: return CXCursor_VarDecl; 2800e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::Namespace: return CXCursor_Namespace; 2801e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::NamespaceAlias: return CXCursor_NamespaceAlias; 2802e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::TemplateTypeParm: return CXCursor_TemplateTypeParameter; 2803e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::NonTypeTemplateParm:return CXCursor_NonTypeTemplateParameter; 2804e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::TemplateTemplateParm:return CXCursor_TemplateTemplateParameter; 2805e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::FunctionTemplate: return CXCursor_FunctionTemplate; 2806e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::ClassTemplate: return CXCursor_ClassTemplate; 28072dfdb948bef51a601e763191e4becfe59880d382Argyrios Kyrtzidis case Decl::AccessSpec: return CXCursor_CXXAccessSpecifier; 2808e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::ClassTemplatePartialSpecialization: 2809e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor return CXCursor_ClassTemplatePartialSpecialization; 2810e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::UsingDirective: return CXCursor_UsingDirective; 2811e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor 2812e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::Using: 2813e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::UnresolvedUsingValue: 2814e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::UnresolvedUsingTypename: 2815e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor return CXCursor_UsingDeclaration; 2816e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor 2817352697a87bca664356f21a838b162084013625eaDouglas Gregor case Decl::ObjCPropertyImpl: 2818352697a87bca664356f21a838b162084013625eaDouglas Gregor switch (cast<ObjCPropertyImplDecl>(D)->getPropertyImplementation()) { 2819352697a87bca664356f21a838b162084013625eaDouglas Gregor case ObjCPropertyImplDecl::Dynamic: 2820352697a87bca664356f21a838b162084013625eaDouglas Gregor return CXCursor_ObjCDynamicDecl; 2821352697a87bca664356f21a838b162084013625eaDouglas Gregor 2822352697a87bca664356f21a838b162084013625eaDouglas Gregor case ObjCPropertyImplDecl::Synthesize: 2823352697a87bca664356f21a838b162084013625eaDouglas Gregor return CXCursor_ObjCSynthesizeDecl; 2824352697a87bca664356f21a838b162084013625eaDouglas Gregor } 2825352697a87bca664356f21a838b162084013625eaDouglas Gregor 2826e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor default: 2827e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor if (TagDecl *TD = dyn_cast<TagDecl>(D)) { 2828e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor switch (TD->getTagKind()) { 2829e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case TTK_Struct: return CXCursor_StructDecl; 2830e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case TTK_Class: return CXCursor_ClassDecl; 2831e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case TTK_Union: return CXCursor_UnionDecl; 2832e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case TTK_Enum: return CXCursor_EnumDecl; 2833e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor } 2834e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor } 2835e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor } 2836e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor 2837e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor return CXCursor_UnexposedDecl; 2838e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor} 2839e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor 2840590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregorstatic void AddMacroResults(Preprocessor &PP, ResultBuilder &Results, 2841590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregor bool TargetTypeIsPointer = false) { 28420a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 2843590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregor 28443f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor Results.EnterNewScope(); 2845c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor 28460c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor for (Preprocessor::macro_iterator M = PP.macro_begin(), 28470c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor MEnd = PP.macro_end(); 2848590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregor M != MEnd; ++M) { 28491827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor Results.AddResult(Result(M->first, 28501827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor getMacroUsagePriority(M->first->getName(), 2851b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor PP.getLangOptions(), 28521827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor TargetTypeIsPointer))); 2853590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregor } 2854c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor 28553f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor Results.ExitScope(); 2856c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor 28573f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor} 28583f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor 2859aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregorstatic void AddPrettyFunctionResults(const LangOptions &LangOpts, 2860aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor ResultBuilder &Results) { 28610a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 2862aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor 2863aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor Results.EnterNewScope(); 2864c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor 2865aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor Results.AddResult(Result("__PRETTY_FUNCTION__", CCP_Constant)); 2866aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor Results.AddResult(Result("__FUNCTION__", CCP_Constant)); 2867aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor if (LangOpts.C99 || LangOpts.CPlusPlus0x) 2868aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor Results.AddResult(Result("__func__", CCP_Constant)); 2869aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor Results.ExitScope(); 2870aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor} 2871aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor 28723a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbarstatic void HandleCodeCompleteResults(Sema *S, 28733a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar CodeCompleteConsumer *CodeCompleter, 2874e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext Context, 28750a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall CodeCompletionResult *Results, 2876e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor unsigned NumResults) { 287786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (CodeCompleter) 2878e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompleter->ProcessCodeCompleteResults(*S, Context, Results, NumResults); 287986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 288086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 2881e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregorstatic enum CodeCompletionContext::Kind mapCodeCompletionContext(Sema &S, 2882e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Sema::ParserCompletionContext PCC) { 2883e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor switch (PCC) { 2884f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Namespace: 2885e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor return CodeCompletionContext::CCC_TopLevel; 2886e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor 2887f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Class: 2888e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor return CodeCompletionContext::CCC_ClassStructUnion; 2889e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor 2890f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ObjCInterface: 2891e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor return CodeCompletionContext::CCC_ObjCInterface; 2892e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor 2893f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ObjCImplementation: 2894e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor return CodeCompletionContext::CCC_ObjCImplementation; 2895e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor 2896f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ObjCInstanceVariableList: 2897e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor return CodeCompletionContext::CCC_ObjCIvarList; 2898e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor 2899f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Template: 2900f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_MemberTemplate: 290152779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor if (S.CurContext->isFileContext()) 290252779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor return CodeCompletionContext::CCC_TopLevel; 29037530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie if (S.CurContext->isRecord()) 290452779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor return CodeCompletionContext::CCC_ClassStructUnion; 29057530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie return CodeCompletionContext::CCC_Other; 290652779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor 2907f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_RecoveryInFunction: 290852779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor return CodeCompletionContext::CCC_Recovery; 2909a5450a097e83072c0e545ccd8df8b07e172f1b09Douglas Gregor 2910f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ForInit: 2911a5450a097e83072c0e545ccd8df8b07e172f1b09Douglas Gregor if (S.getLangOptions().CPlusPlus || S.getLangOptions().C99 || 2912a5450a097e83072c0e545ccd8df8b07e172f1b09Douglas Gregor S.getLangOptions().ObjC1) 2913a5450a097e83072c0e545ccd8df8b07e172f1b09Douglas Gregor return CodeCompletionContext::CCC_ParenthesizedExpression; 2914a5450a097e83072c0e545ccd8df8b07e172f1b09Douglas Gregor else 2915a5450a097e83072c0e545ccd8df8b07e172f1b09Douglas Gregor return CodeCompletionContext::CCC_Expression; 2916a5450a097e83072c0e545ccd8df8b07e172f1b09Douglas Gregor 2917a5450a097e83072c0e545ccd8df8b07e172f1b09Douglas Gregor case Sema::PCC_Expression: 2918f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Condition: 2919e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor return CodeCompletionContext::CCC_Expression; 2920e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor 2921f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Statement: 2922e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor return CodeCompletionContext::CCC_Statement; 292372db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor 2924f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Type: 292572db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor return CodeCompletionContext::CCC_Type; 29260268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor 29270268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor case Sema::PCC_ParenthesizedExpression: 29280268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor return CodeCompletionContext::CCC_ParenthesizedExpression; 292968e3c2eef52701a178fbcc2bb424f31dd4b36931Douglas Gregor 293068e3c2eef52701a178fbcc2bb424f31dd4b36931Douglas Gregor case Sema::PCC_LocalDeclarationSpecifiers: 293168e3c2eef52701a178fbcc2bb424f31dd4b36931Douglas Gregor return CodeCompletionContext::CCC_Type; 2932e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor } 29337530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie 29347530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie llvm_unreachable("Invalid ParserCompletionContext!"); 2935e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor} 2936e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor 2937f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor/// \brief If we're in a C++ virtual member function, add completion results 2938f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor/// that invoke the functions we override, since it's common to invoke the 2939f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor/// overridden function as well as adding new functionality. 2940f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor/// 2941f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor/// \param S The semantic analysis object for which we are generating results. 2942f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor/// 2943f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor/// \param InContext This context in which the nested-name-specifier preceding 2944f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor/// the code-completion point 2945f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregorstatic void MaybeAddOverrideCalls(Sema &S, DeclContext *InContext, 2946f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor ResultBuilder &Results) { 2947f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor // Look through blocks. 2948f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor DeclContext *CurContext = S.CurContext; 2949f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor while (isa<BlockDecl>(CurContext)) 2950f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor CurContext = CurContext->getParent(); 2951f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor 2952f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor 2953f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(CurContext); 2954f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor if (!Method || !Method->isVirtual()) 2955f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor return; 2956f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor 2957f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor // We need to have names for all of the parameters, if we're going to 2958f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor // generate a forwarding call. 2959f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor for (CXXMethodDecl::param_iterator P = Method->param_begin(), 2960f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor PEnd = Method->param_end(); 2961f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor P != PEnd; 2962f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor ++P) { 2963f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor if (!(*P)->getDeclName()) 2964f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor return; 2965f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor } 2966f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor 29678987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor PrintingPolicy Policy = getCompletionPrintingPolicy(S); 2968f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor for (CXXMethodDecl::method_iterator M = Method->begin_overridden_methods(), 2969f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor MEnd = Method->end_overridden_methods(); 2970f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor M != MEnd; ++M) { 2971218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder Builder(Results.getAllocator()); 2972f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor CXXMethodDecl *Overridden = const_cast<CXXMethodDecl *>(*M); 2973f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor if (Overridden->getCanonicalDecl() == Method->getCanonicalDecl()) 2974f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor continue; 2975f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor 2976f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor // If we need a nested-name-specifier, add one now. 2977f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor if (!InContext) { 2978f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor NestedNameSpecifier *NNS 2979f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor = getRequiredQualification(S.Context, CurContext, 2980f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor Overridden->getDeclContext()); 2981f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor if (NNS) { 2982f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor std::string Str; 2983f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor llvm::raw_string_ostream OS(Str); 29848987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor NNS->print(OS, Policy); 2985dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddTextChunk(Results.getAllocator().CopyString(OS.str())); 2986f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor } 2987f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor } else if (!InContext->Equals(Overridden->getDeclContext())) 2988f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor continue; 2989f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor 2990dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddTypedTextChunk(Results.getAllocator().CopyString( 2991218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Overridden->getNameAsString())); 2992218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 2993f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor bool FirstParam = true; 2994f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor for (CXXMethodDecl::param_iterator P = Method->param_begin(), 2995f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor PEnd = Method->param_end(); 2996f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor P != PEnd; ++P) { 2997f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor if (FirstParam) 2998f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor FirstParam = false; 2999f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor else 3000218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_Comma); 3001f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor 3002dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddPlaceholderChunk(Results.getAllocator().CopyString( 3003218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor (*P)->getIdentifier()->getName())); 3004f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor } 3005218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 3006218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(CodeCompletionResult(Builder.TakeString(), 3007f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor CCP_SuperCompletion, 3008f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor CXCursor_CXXMethod)); 3009f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor Results.Ignore(Overridden); 3010f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor } 3011f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor} 3012f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor 301301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregorvoid Sema::CodeCompleteOrdinaryName(Scope *S, 3014e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor ParserCompletionContext CompletionContext) { 30150a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 3016218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 301752779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor mapCodeCompletionContext(*this, CompletionContext)); 3018f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor Results.EnterNewScope(); 3019cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor 302001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Determine how to filter results, e.g., so that the names of 302101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // values (functions, enumerators, function templates, etc.) are 302201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // only allowed where we can have an expression. 302301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor switch (CompletionContext) { 3024e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_Namespace: 3025e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_Class: 3026e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_ObjCInterface: 3027e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_ObjCImplementation: 3028e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_ObjCInstanceVariableList: 3029e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_Template: 3030e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_MemberTemplate: 303172db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_Type: 303268e3c2eef52701a178fbcc2bb424f31dd4b36931Douglas Gregor case PCC_LocalDeclarationSpecifiers: 303301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Results.setFilter(&ResultBuilder::IsOrdinaryNonValueName); 303401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 303501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 3036e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_Statement: 30370268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor case PCC_ParenthesizedExpression: 3038eb0d0145910f3024d9bdefe279a1e9b95495f2fdDouglas Gregor case PCC_Expression: 3039e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_ForInit: 3040e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_Condition: 30414710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor if (WantTypesInContext(CompletionContext, getLangOptions())) 30424710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor Results.setFilter(&ResultBuilder::IsOrdinaryName); 30434710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor else 30444710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor Results.setFilter(&ResultBuilder::IsOrdinaryNonTypeName); 3045f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor 3046f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor if (getLangOptions().CPlusPlus) 3047f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor MaybeAddOverrideCalls(*this, /*InContext=*/0, Results); 304801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 3049dc8453422bec3bbf70c03920e01498d75783d122Douglas Gregor 3050e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_RecoveryInFunction: 3051dc8453422bec3bbf70c03920e01498d75783d122Douglas Gregor // Unfiltered 3052dc8453422bec3bbf70c03920e01498d75783d122Douglas Gregor break; 305301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 305401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 30553cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor // If we are in a C++ non-static member function, check the qualifiers on 30563cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor // the member function to filter/prioritize the results list. 30573cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor if (CXXMethodDecl *CurMethod = dyn_cast<CXXMethodDecl>(CurContext)) 30583cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor if (CurMethod->isInstance()) 30593cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor Results.setObjectTypeQualifiers( 30603cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor Qualifiers::fromCVRMask(CurMethod->getTypeQualifiers())); 30613cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor 30621ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 30638071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 30648071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompleter->includeGlobals()); 30652a7925c4abe45650f3ab27be09468e3a3a98084aDouglas Gregor 3066bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddOrdinaryNameResults(CompletionContext, S, *this, Results); 30672a7925c4abe45650f3ab27be09468e3a3a98084aDouglas Gregor Results.ExitScope(); 30682a7925c4abe45650f3ab27be09468e3a3a98084aDouglas Gregor 3069aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor switch (CompletionContext) { 30700268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor case PCC_ParenthesizedExpression: 307172db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_Expression: 307272db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_Statement: 307372db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_RecoveryInFunction: 307472db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor if (S->getFnParent()) 307572db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor AddPrettyFunctionResults(PP.getLangOptions(), Results); 307672db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor break; 307772db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor 307872db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_Namespace: 307972db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_Class: 308072db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_ObjCInterface: 308172db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_ObjCImplementation: 308272db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_ObjCInstanceVariableList: 308372db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_Template: 308472db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_MemberTemplate: 308572db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_ForInit: 308672db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_Condition: 308772db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_Type: 308868e3c2eef52701a178fbcc2bb424f31dd4b36931Douglas Gregor case PCC_LocalDeclarationSpecifiers: 308972db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor break; 3090aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor } 3091aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor 30920c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor if (CodeCompleter->includeMacros()) 3093bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddMacroResults(PP, Results); 3094aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor 3095cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 3096e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 3097791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor} 3098791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor 3099c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregorstatic void AddClassMessageCompletions(Sema &SemaRef, Scope *S, 3100c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor ParsedType Receiver, 3101c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor IdentifierInfo **SelIdents, 3102c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor unsigned NumSelIdents, 310370c5ac70ace21b011dc2d4001bae26cdcf62ff8dDouglas Gregor bool AtArgumentExpression, 3104c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor bool IsSuper, 3105c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor ResultBuilder &Results); 3106c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor 3107c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregorvoid Sema::CodeCompleteDeclSpec(Scope *S, DeclSpec &DS, 3108c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor bool AllowNonIdentifiers, 3109c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor bool AllowNestedNameSpecifiers) { 31100a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 3111218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 311252779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor AllowNestedNameSpecifiers 311352779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor ? CodeCompletionContext::CCC_PotentiallyQualifiedName 311452779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor : CodeCompletionContext::CCC_Name); 31152ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor Results.EnterNewScope(); 31162ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor 31172ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor // Type qualifiers can come after names. 31182ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor Results.AddResult(Result("const")); 31192ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor Results.AddResult(Result("volatile")); 31202ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor if (getLangOptions().C99) 31212ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor Results.AddResult(Result("restrict")); 31222ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor 31232ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor if (getLangOptions().CPlusPlus) { 31242ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor if (AllowNonIdentifiers) { 31252ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor Results.AddResult(Result("operator")); 31262ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor } 31272ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor 31282ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor // Add nested-name-specifiers. 31292ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor if (AllowNestedNameSpecifiers) { 31302ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor Results.allowNestedNameSpecifiers(); 313152779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor Results.setFilter(&ResultBuilder::IsImpossibleToSatisfy); 31322ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 31332ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor LookupVisibleDecls(S, LookupNestedNameSpecifierName, Consumer, 31342ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor CodeCompleter->includeGlobals()); 313552779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor Results.setFilter(0); 31362ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor } 31372ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor } 31382ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor Results.ExitScope(); 31392ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor 3140c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor // If we're in a context where we might have an expression (rather than a 3141c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor // declaration), and what we've seen so far is an Objective-C type that could 3142c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor // be a receiver of a class message, this may be a class message send with 3143c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor // the initial opening bracket '[' missing. Add appropriate completions. 3144c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor if (AllowNonIdentifiers && !AllowNestedNameSpecifiers && 3145c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor DS.getTypeSpecType() == DeclSpec::TST_typename && 3146c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor DS.getStorageClassSpecAsWritten() == DeclSpec::SCS_unspecified && 3147c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor !DS.isThreadSpecified() && !DS.isExternInLinkageSpec() && 3148c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor DS.getTypeSpecComplex() == DeclSpec::TSC_unspecified && 3149c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor DS.getTypeSpecSign() == DeclSpec::TSS_unspecified && 3150c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor DS.getTypeQualifiers() == 0 && 3151c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor S && 3152c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor (S->getFlags() & Scope::DeclScope) != 0 && 3153c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor (S->getFlags() & (Scope::ClassScope | Scope::TemplateParamScope | 3154c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor Scope::FunctionPrototypeScope | 3155c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor Scope::AtCatchScope)) == 0) { 3156c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor ParsedType T = DS.getRepAsType(); 3157c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor if (!T.get().isNull() && T.get()->isObjCObjectOrInterfaceType()) 315870c5ac70ace21b011dc2d4001bae26cdcf62ff8dDouglas Gregor AddClassMessageCompletions(*this, S, T, 0, 0, false, false, Results); 3159c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor } 3160c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor 31614497dd49f78eb5e1a7c3f19d1a13564f79e12341Douglas Gregor // Note that we intentionally suppress macro results here, since we do not 31624497dd49f78eb5e1a7c3f19d1a13564f79e12341Douglas Gregor // encourage using macros to produce the names of entities. 31634497dd49f78eb5e1a7c3f19d1a13564f79e12341Douglas Gregor 316452779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 316552779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor Results.getCompletionContext(), 31662ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor Results.data(), Results.size()); 31672ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor} 31682ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor 3169fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregorstruct Sema::CodeCompleteExpressionData { 3170fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor CodeCompleteExpressionData(QualType PreferredType = QualType()) 3171fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor : PreferredType(PreferredType), IntegralConstantExpression(false), 3172fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor ObjCCollection(false) { } 3173fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor 3174fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor QualType PreferredType; 3175fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor bool IntegralConstantExpression; 3176fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor bool ObjCCollection; 31775f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<Decl *, 4> IgnoreDecls; 3178fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor}; 3179fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor 31805ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor/// \brief Perform code-completion in an expression context when we know what 31815ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor/// type we're looking for. 3182f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor/// 3183f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor/// \param IntegralConstantExpression Only permit integral constant 3184f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor/// expressions. 3185fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregorvoid Sema::CodeCompleteExpression(Scope *S, 3186fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor const CodeCompleteExpressionData &Data) { 31870a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 3188218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 3189218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Expression); 3190fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor if (Data.ObjCCollection) 3191fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor Results.setFilter(&ResultBuilder::IsObjCCollection); 3192fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor else if (Data.IntegralConstantExpression) 3193f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor Results.setFilter(&ResultBuilder::IsIntegralConstantValue); 3194e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor else if (WantTypesInContext(PCC_Expression, getLangOptions())) 31955ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor Results.setFilter(&ResultBuilder::IsOrdinaryName); 31965ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor else 31975ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor Results.setFilter(&ResultBuilder::IsOrdinaryNonTypeName); 3198fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor 3199fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor if (!Data.PreferredType.isNull()) 3200fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor Results.setPreferredType(Data.PreferredType.getNonReferenceType()); 3201fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor 3202fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor // Ignore any declarations that we were told that we don't care about. 3203fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor for (unsigned I = 0, N = Data.IgnoreDecls.size(); I != N; ++I) 3204fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor Results.Ignore(Data.IgnoreDecls[I]); 32055ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 32065ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 32078071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 32088071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompleter->includeGlobals()); 32095ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 32105ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor Results.EnterNewScope(); 3211e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor AddOrdinaryNameResults(PCC_Expression, S, *this, Results); 32125ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor Results.ExitScope(); 32135ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 3214590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregor bool PreferredTypeIsPointer = false; 3215fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor if (!Data.PreferredType.isNull()) 3216fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor PreferredTypeIsPointer = Data.PreferredType->isAnyPointerType() 3217fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor || Data.PreferredType->isMemberPointerType() 3218fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor || Data.PreferredType->isBlockPointerType(); 3219590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregor 3220aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor if (S->getFnParent() && 3221aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor !Data.ObjCCollection && 3222aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor !Data.IntegralConstantExpression) 3223aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor AddPrettyFunctionResults(PP.getLangOptions(), Results); 3224aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor 32255ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (CodeCompleter->includeMacros()) 3226590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregor AddMacroResults(PP, Results, PreferredTypeIsPointer); 3227e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 3228fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor CodeCompletionContext(CodeCompletionContext::CCC_Expression, 3229fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor Data.PreferredType), 3230e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 32315ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor} 32325ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 3233ac5fd8404fa8ecfae28be76f98fd0d926350354cDouglas Gregorvoid Sema::CodeCompletePostfixExpression(Scope *S, ExprResult E) { 3234ac5fd8404fa8ecfae28be76f98fd0d926350354cDouglas Gregor if (E.isInvalid()) 3235ac5fd8404fa8ecfae28be76f98fd0d926350354cDouglas Gregor CodeCompleteOrdinaryName(S, PCC_RecoveryInFunction); 3236ac5fd8404fa8ecfae28be76f98fd0d926350354cDouglas Gregor else if (getLangOptions().ObjC1) 3237ac5fd8404fa8ecfae28be76f98fd0d926350354cDouglas Gregor CodeCompleteObjCInstanceMessage(S, E.take(), 0, 0, false); 323878edf515544f0b9dddf69d6c1678fd83e94d8352Douglas Gregor} 32395ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 32407344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor/// \brief The set of properties that have already been added, referenced by 32417344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor/// property name. 32427344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregortypedef llvm::SmallPtrSet<IdentifierInfo*, 16> AddedPropertiesSet; 32437344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor 324495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregorstatic void AddObjCProperties(ObjCContainerDecl *Container, 3245322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor bool AllowCategories, 32464b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor bool AllowNullaryMethods, 324795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor DeclContext *CurContext, 32487344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor AddedPropertiesSet &AddedProperties, 324995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor ResultBuilder &Results) { 32500a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 325195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 325295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Add properties in this container. 325395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor for (ObjCContainerDecl::prop_iterator P = Container->prop_begin(), 325495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor PEnd = Container->prop_end(); 325595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor P != PEnd; 32567344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor ++P) { 32577344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor if (AddedProperties.insert(P->getIdentifier())) 32587344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor Results.MaybeAddResult(Result(*P, 0), CurContext); 32597344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor } 326095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 32614b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor // Add nullary methods 32624b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor if (AllowNullaryMethods) { 32634b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor ASTContext &Context = Container->getASTContext(); 32648987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor PrintingPolicy Policy = getCompletionPrintingPolicy(Results.getSema()); 32654b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor for (ObjCContainerDecl::method_iterator M = Container->meth_begin(), 32664b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor MEnd = Container->meth_end(); 32674b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor M != MEnd; ++M) { 32684b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor if (M->getSelector().isUnarySelector()) 32694b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor if (IdentifierInfo *Name = M->getSelector().getIdentifierInfoForSlot(0)) 32704b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor if (AddedProperties.insert(Name)) { 32714b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor CodeCompletionBuilder Builder(Results.getAllocator()); 32728987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor AddResultTypeChunk(Context, Policy, *M, Builder); 32734b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor Builder.AddTypedTextChunk( 32744b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor Results.getAllocator().CopyString(Name->getName())); 32754b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor 32764b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor CXAvailabilityKind Availability = CXAvailability_Available; 32774b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor switch (M->getAvailability()) { 32784b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor case AR_Available: 32794b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor case AR_NotYetIntroduced: 32804b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor Availability = CXAvailability_Available; 32814b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor break; 32824b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor 32834b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor case AR_Deprecated: 32844b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor Availability = CXAvailability_Deprecated; 32854b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor break; 32864b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor 32874b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor case AR_Unavailable: 32884b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor Availability = CXAvailability_NotAvailable; 32894b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor break; 32904b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor } 32914b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor 32924b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor Results.MaybeAddResult(Result(Builder.TakeString(), 32934b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor CCP_MemberDeclaration + CCD_MethodAsProperty, 32944b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor M->isInstanceMethod() 32954b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor ? CXCursor_ObjCInstanceMethodDecl 32964b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor : CXCursor_ObjCClassMethodDecl, 32974b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor Availability), 32984b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor CurContext); 32994b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor } 33004b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor } 33014b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor } 33024b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor 33034b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor 330495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Add properties in referenced protocols. 330595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) { 330695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor for (ObjCProtocolDecl::protocol_iterator P = Protocol->protocol_begin(), 330795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor PEnd = Protocol->protocol_end(); 330895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor P != PEnd; ++P) 33094b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddObjCProperties(*P, AllowCategories, AllowNullaryMethods, CurContext, 33104b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddedProperties, Results); 331195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } else if (ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container)){ 3312322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor if (AllowCategories) { 3313322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Look through categories. 3314322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor for (ObjCCategoryDecl *Category = IFace->getCategoryList(); 3315322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Category; Category = Category->getNextClassCategory()) 33164b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddObjCProperties(Category, AllowCategories, AllowNullaryMethods, 33174b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor CurContext, AddedProperties, Results); 3318322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor } 331995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 332095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Look through protocols. 332153b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek for (ObjCInterfaceDecl::all_protocol_iterator 332253b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek I = IFace->all_referenced_protocol_begin(), 332353b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek E = IFace->all_referenced_protocol_end(); I != E; ++I) 33244b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddObjCProperties(*I, AllowCategories, AllowNullaryMethods, CurContext, 33254b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddedProperties, Results); 332695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 332795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Look in the superclass. 332895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (IFace->getSuperClass()) 33294b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddObjCProperties(IFace->getSuperClass(), AllowCategories, 33304b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AllowNullaryMethods, CurContext, 33317344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor AddedProperties, Results); 333295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } else if (const ObjCCategoryDecl *Category 333395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor = dyn_cast<ObjCCategoryDecl>(Container)) { 333495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Look through protocols. 333553b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek for (ObjCCategoryDecl::protocol_iterator P = Category->protocol_begin(), 333653b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek PEnd = Category->protocol_end(); 333795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor P != PEnd; ++P) 33384b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddObjCProperties(*P, AllowCategories, AllowNullaryMethods, CurContext, 33394b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddedProperties, Results); 334095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } 334195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor} 334295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 3343f5cd27d7eef3fd4021545dd76a1faf7152fda344Douglas Gregorvoid Sema::CodeCompleteMemberReferenceExpr(Scope *S, Expr *Base, 334481b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor SourceLocation OpLoc, 334581b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor bool IsArrow) { 3346f5cd27d7eef3fd4021545dd76a1faf7152fda344Douglas Gregor if (!Base || !CodeCompleter) 334781b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor return; 334881b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor 3349f5cd27d7eef3fd4021545dd76a1faf7152fda344Douglas Gregor ExprResult ConvertedBase = PerformMemberExprBaseConversion(Base, IsArrow); 3350f5cd27d7eef3fd4021545dd76a1faf7152fda344Douglas Gregor if (ConvertedBase.isInvalid()) 3351f5cd27d7eef3fd4021545dd76a1faf7152fda344Douglas Gregor return; 3352f5cd27d7eef3fd4021545dd76a1faf7152fda344Douglas Gregor Base = ConvertedBase.get(); 3353f5cd27d7eef3fd4021545dd76a1faf7152fda344Douglas Gregor 33540a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 335586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 335681b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor QualType BaseType = Base->getType(); 335786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 335886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (IsArrow) { 335986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (const PointerType *Ptr = BaseType->getAs<PointerType>()) 336086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor BaseType = Ptr->getPointeeType(); 336186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor else if (BaseType->isObjCObjectPointerType()) 33623cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor /*Do nothing*/ ; 336386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor else 336486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return; 336586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 336686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 33673da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor enum CodeCompletionContext::Kind contextKind; 33683da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor 33693da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor if (IsArrow) { 33703da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contextKind = CodeCompletionContext::CCC_ArrowMemberAccess; 33713da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 33723da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor else { 33733da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor if (BaseType->isObjCObjectPointerType() || 33743da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor BaseType->isObjCObjectOrInterfaceType()) { 33753da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contextKind = CodeCompletionContext::CCC_ObjCPropertyAccess; 33763da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 33773da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor else { 33783da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contextKind = CodeCompletionContext::CCC_DotMemberAccess; 33793da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 33803da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 33813da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor 3382218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 33833da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CodeCompletionContext(contextKind, 338452779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor BaseType), 338552779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor &ResultBuilder::IsMember); 338695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor Results.EnterNewScope(); 338795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (const RecordType *Record = BaseType->getAs<RecordType>()) { 33883cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor // Indicate that we are performing a member access, and the cv-qualifiers 33893cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor // for the base object type. 33903cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor Results.setObjectTypeQualifiers(BaseType.getQualifiers()); 33913cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor 339295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Access to a C/C++ class, struct, or union. 339345bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor Results.allowNestedNameSpecifiers(); 33940cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 33958071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(Record->getDecl(), LookupMemberName, Consumer, 33968071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompleter->includeGlobals()); 33973a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar 339895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (getLangOptions().CPlusPlus) { 339995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (!Results.empty()) { 340095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // The "template" keyword can follow "->" or "." in the grammar. 340195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // However, we only want to suggest the template keyword if something 340295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // is dependent. 340395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor bool IsDependent = BaseType->isDependentType(); 340495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (!IsDependent) { 340595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor for (Scope *DepScope = S; DepScope; DepScope = DepScope->getParent()) 340695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (DeclContext *Ctx = (DeclContext *)DepScope->getEntity()) { 340795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor IsDependent = Ctx->isDependentContext(); 340895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor break; 340995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } 341095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } 34113a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar 341295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (IsDependent) 3413a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("template")); 341486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 341595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } 341695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } else if (!IsArrow && BaseType->getAsObjCInterfacePointerType()) { 341795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Objective-C property reference. 34187344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor AddedPropertiesSet AddedProperties; 341995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 342095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Add property results based on our interface. 342195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor const ObjCObjectPointerType *ObjCPtr 342295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor = BaseType->getAsObjCInterfacePointerType(); 342395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor assert(ObjCPtr && "Non-NULL pointer guaranteed above!"); 34244b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddObjCProperties(ObjCPtr->getInterfaceDecl(), true, 34254b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor /*AllowNullaryMethods=*/true, CurContext, 34267344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor AddedProperties, Results); 342795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 342895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Add properties from the protocols in a qualified interface. 342995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor for (ObjCObjectPointerType::qual_iterator I = ObjCPtr->qual_begin(), 343095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor E = ObjCPtr->qual_end(); 343195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor I != E; ++I) 34324b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddObjCProperties(*I, true, /*AllowNullaryMethods=*/true, CurContext, 34334b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddedProperties, Results); 343495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } else if ((IsArrow && BaseType->isObjCObjectPointerType()) || 3435c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall (!IsArrow && BaseType->isObjCObjectType())) { 343695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Objective-C instance variable access. 343795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor ObjCInterfaceDecl *Class = 0; 343895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (const ObjCObjectPointerType *ObjCPtr 343995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor = BaseType->getAs<ObjCObjectPointerType>()) 344095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor Class = ObjCPtr->getInterfaceDecl(); 344195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor else 3442c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall Class = BaseType->getAs<ObjCObjectType>()->getInterface(); 344395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 344495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Add all ivars from this class and its superclasses. 344580f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor if (Class) { 344680f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 344780f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor Results.setFilter(&ResultBuilder::IsObjCIvar); 34488071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(Class, LookupMemberName, Consumer, 34498071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompleter->includeGlobals()); 345086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 345186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 345295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 345395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // FIXME: How do we cope with isa? 345495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 345595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor Results.ExitScope(); 34563a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar 34573a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar // Hand off the results found for code completion. 3458e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 345952779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor Results.getCompletionContext(), 3460e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 346181b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor} 346281b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor 3463374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregorvoid Sema::CodeCompleteTag(Scope *S, unsigned TagSpec) { 3464374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor if (!CodeCompleter) 3465374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor return; 3466374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor 34670a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 346886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ResultBuilder::LookupFilter Filter = 0; 3469e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor enum CodeCompletionContext::Kind ContextKind 3470e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor = CodeCompletionContext::CCC_Other; 3471374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor switch ((DeclSpec::TST)TagSpec) { 3472374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor case DeclSpec::TST_enum: 347386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Filter = &ResultBuilder::IsEnum; 3474e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor ContextKind = CodeCompletionContext::CCC_EnumTag; 3475374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor break; 3476374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor 3477374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor case DeclSpec::TST_union: 347886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Filter = &ResultBuilder::IsUnion; 3479e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor ContextKind = CodeCompletionContext::CCC_UnionTag; 3480374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor break; 3481374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor 3482374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor case DeclSpec::TST_struct: 3483374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor case DeclSpec::TST_class: 348486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Filter = &ResultBuilder::IsClassOrStruct; 3485e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor ContextKind = CodeCompletionContext::CCC_ClassOrStructTag; 3486374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor break; 3487374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor 3488374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor default: 3489b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("Unknown type specifier kind in CodeCompleteTag"); 3490374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor } 349186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 3492218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), ContextKind); 34935d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 34940d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCall 34950d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCall // First pass: look for tags. 34960d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCall Results.setFilter(Filter); 34978071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(S, LookupTagName, Consumer, 34988071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompleter->includeGlobals()); 34990d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCall 35008071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor if (CodeCompleter->includeGlobals()) { 35018071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor // Second pass: look for nested name specifiers. 35028071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor Results.setFilter(&ResultBuilder::IsNestedNameSpecifier); 35038071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(S, LookupNestedNameSpecifierName, Consumer); 35048071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor } 350586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 350652779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 3507e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 3508374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor} 3509374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor 35101a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregorvoid Sema::CodeCompleteTypeQualifiers(DeclSpec &DS) { 3511218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 3512218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_TypeQualifiers); 35131a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor Results.EnterNewScope(); 35141a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor if (!(DS.getTypeQualifiers() & DeclSpec::TQ_const)) 35151a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor Results.AddResult("const"); 35161a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor if (!(DS.getTypeQualifiers() & DeclSpec::TQ_volatile)) 35171a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor Results.AddResult("volatile"); 35181a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor if (getLangOptions().C99 && 35191a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor !(DS.getTypeQualifiers() & DeclSpec::TQ_restrict)) 35201a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor Results.AddResult("restrict"); 35211a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor Results.ExitScope(); 35221a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 352352779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor Results.getCompletionContext(), 35241a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor Results.data(), Results.size()); 35251a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor} 35261a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor 35273e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregorvoid Sema::CodeCompleteCase(Scope *S) { 3528781472fe99a120098c631b0cbe33c89f8cef5e70John McCall if (getCurFunction()->SwitchStack.empty() || !CodeCompleter) 35293e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor return; 3530a8e0cd8cdecc7e0ba1792e46773b884c6eed4829John McCall 3531781472fe99a120098c631b0cbe33c89f8cef5e70John McCall SwitchStmt *Switch = getCurFunction()->SwitchStack.back(); 3532a8e0cd8cdecc7e0ba1792e46773b884c6eed4829John McCall QualType type = Switch->getCond()->IgnoreImplicit()->getType(); 3533a8e0cd8cdecc7e0ba1792e46773b884c6eed4829John McCall if (!type->isEnumeralType()) { 3534a8e0cd8cdecc7e0ba1792e46773b884c6eed4829John McCall CodeCompleteExpressionData Data(type); 3535fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor Data.IntegralConstantExpression = true; 3536fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor CodeCompleteExpression(S, Data); 35373e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor return; 3538f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor } 35393e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 35403e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // Code-complete the cases of a switch statement over an enumeration type 35413e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // by providing the list of 3542a8e0cd8cdecc7e0ba1792e46773b884c6eed4829John McCall EnumDecl *Enum = type->castAs<EnumType>()->getDecl(); 35433e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 35443e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // Determine which enumerators we have already seen in the switch statement. 35453e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // FIXME: Ideally, we would also be able to look *past* the code-completion 35463e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // token, in case we are code-completing in the middle of the switch and not 35473e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // at the end. However, we aren't able to do so at the moment. 35483e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor llvm::SmallPtrSet<EnumConstantDecl *, 8> EnumeratorsSeen; 3549b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor NestedNameSpecifier *Qualifier = 0; 35503e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor for (SwitchCase *SC = Switch->getSwitchCaseList(); SC; 35513e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor SC = SC->getNextSwitchCase()) { 35523e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor CaseStmt *Case = dyn_cast<CaseStmt>(SC); 35533e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor if (!Case) 35543e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor continue; 35553e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 35563e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor Expr *CaseVal = Case->getLHS()->IgnoreParenCasts(); 35573e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(CaseVal)) 35583e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor if (EnumConstantDecl *Enumerator 35593e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor = dyn_cast<EnumConstantDecl>(DRE->getDecl())) { 35603e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // We look into the AST of the case statement to determine which 35613e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // enumerator was named. Alternatively, we could compute the value of 35623e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // the integral constant expression, then compare it against the 35633e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // values of each enumerator. However, value-based approach would not 35643e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // work as well with C++ templates where enumerators declared within a 35653e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // template are type- and value-dependent. 35663e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor EnumeratorsSeen.insert(Enumerator); 35673e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 3568b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // If this is a qualified-id, keep track of the nested-name-specifier 3569b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // so that we can reproduce it as part of code completion, e.g., 35703e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // 35713e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // switch (TagD.getKind()) { 35723e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // case TagDecl::TK_enum: 35733e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // break; 35743e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // case XXX 35753e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // 3576b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // At the XXX, our completions are TagDecl::TK_union, 35773e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // TagDecl::TK_struct, and TagDecl::TK_class, rather than TK_union, 35783e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // TK_struct, and TK_class. 3579a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor Qualifier = DRE->getQualifier(); 35803e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor } 35813e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor } 35823e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 3583b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor if (getLangOptions().CPlusPlus && !Qualifier && EnumeratorsSeen.empty()) { 3584b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // If there are no prior enumerators in C++, check whether we have to 3585b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // qualify the names of the enumerators that we suggest, because they 3586b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // may not be visible in this scope. 3587b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor Qualifier = getRequiredQualification(Context, CurContext, 3588b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor Enum->getDeclContext()); 3589b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor 3590b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // FIXME: Scoped enums need to start with "EnumDecl" as the context! 3591b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor } 3592b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor 35933e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // Add any enumerators that have not yet been mentioned. 3594218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 3595218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Expression); 35963e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor Results.EnterNewScope(); 35973e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor for (EnumDecl::enumerator_iterator E = Enum->enumerator_begin(), 35983e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor EEnd = Enum->enumerator_end(); 35993e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor E != EEnd; ++E) { 36003e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor if (EnumeratorsSeen.count(*E)) 36013e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor continue; 36023e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 36035c722c7020b33da57090422b854072258a50b3f0Douglas Gregor CodeCompletionResult R(*E, Qualifier); 36045c722c7020b33da57090422b854072258a50b3f0Douglas Gregor R.Priority = CCP_EnumInCase; 36055c722c7020b33da57090422b854072258a50b3f0Douglas Gregor Results.AddResult(R, CurContext, 0, false); 36063e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor } 36073e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor Results.ExitScope(); 36082f880e47ca32d007d7e9e5ff5efa05f5c3432744Douglas Gregor 36093da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor //We need to make sure we're setting the right context, 36103da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor //so only say we include macros if the code completer says we do 36113da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor enum CodeCompletionContext::Kind kind = CodeCompletionContext::CCC_Other; 36123da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor if (CodeCompleter->includeMacros()) { 3613bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddMacroResults(PP, Results); 36143da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor kind = CodeCompletionContext::CCC_OtherWithMacros; 36153da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 36163da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor 36173da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor 3618e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 36193da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor kind, 3620e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 36213e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor} 36223e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 36239c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregornamespace { 36249c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor struct IsBetterOverloadCandidate { 36259c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor Sema &S; 36265769d6195087229770d7ac90449443e026c47103John McCall SourceLocation Loc; 36279c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 36289c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor public: 36295769d6195087229770d7ac90449443e026c47103John McCall explicit IsBetterOverloadCandidate(Sema &S, SourceLocation Loc) 36305769d6195087229770d7ac90449443e026c47103John McCall : S(S), Loc(Loc) { } 36319c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 36329c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor bool 36339c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor operator()(const OverloadCandidate &X, const OverloadCandidate &Y) const { 3634120d63cd4465230c2cd56508c7cd8e0ad00848e7John McCall return isBetterOverloadCandidate(S, X, Y, Loc); 36359c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor } 36369c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor }; 36379c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor} 36389c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 3639d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregorstatic bool anyNullArguments(Expr **Args, unsigned NumArgs) { 3640d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor if (NumArgs && !Args) 3641d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor return true; 3642d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor 3643d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor for (unsigned I = 0; I != NumArgs; ++I) 3644d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor if (!Args[I]) 3645d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor return true; 3646d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor 3647d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor return false; 3648d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor} 3649d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor 3650f81e5a9e3f3ff80c56e4afb4fe6311a8735f36e8Richard Trieuvoid Sema::CodeCompleteCall(Scope *S, Expr *FnIn, 3651f81e5a9e3f3ff80c56e4afb4fe6311a8735f36e8Richard Trieu Expr **ArgsIn, unsigned NumArgs) { 36529c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor if (!CodeCompleter) 36539c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor return; 3654ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor 3655ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor // When we're code-completing for a call, we fall back to ordinary 3656ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor // name code-completion whenever we can't produce specific 3657ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor // results. We may want to revisit this strategy in the future, 3658ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor // e.g., by merging the two kinds of results. 3659ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor 36609c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor Expr *Fn = (Expr *)FnIn; 36619c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor Expr **Args = (Expr **)ArgsIn; 3662ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor 36639c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor // Ignore type-dependent call expressions entirely. 3664d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor if (!Fn || Fn->isTypeDependent() || anyNullArguments(Args, NumArgs) || 3665ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor Expr::hasAnyTypeDependentArguments(Args, NumArgs)) { 3666e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompleteOrdinaryName(S, PCC_Expression); 36679c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor return; 3668ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor } 36699c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 36703b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall // Build an overload candidate set based on the functions we find. 36715769d6195087229770d7ac90449443e026c47103John McCall SourceLocation Loc = Fn->getExprLoc(); 36725769d6195087229770d7ac90449443e026c47103John McCall OverloadCandidateSet CandidateSet(Loc); 36733b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall 36749c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor // FIXME: What if we're calling something that isn't a function declaration? 36759c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor // FIXME: What if we're calling a pseudo-destructor? 36769c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor // FIXME: What if we're calling a member function? 36779c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 3678c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor typedef CodeCompleteConsumer::OverloadCandidate ResultCandidate; 36795f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<ResultCandidate, 8> Results; 3680c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor 36813b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall Expr *NakedFn = Fn->IgnoreParenCasts(); 36823b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(NakedFn)) 36833b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall AddOverloadedCallCandidates(ULE, Args, NumArgs, CandidateSet, 36843b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall /*PartialOverloading=*/ true); 36853b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall else if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(NakedFn)) { 36863b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall FunctionDecl *FDecl = dyn_cast<FunctionDecl>(DRE->getDecl()); 3687c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor if (FDecl) { 3688d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor if (!getLangOptions().CPlusPlus || 3689d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor !FDecl->getType()->getAs<FunctionProtoType>()) 3690c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor Results.push_back(ResultCandidate(FDecl)); 3691c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor else 369286820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall // FIXME: access? 36939aa472c45d2bd81b7b52c225e8acc560d716db97John McCall AddOverloadCandidate(FDecl, DeclAccessPair::make(FDecl, AS_none), 36949aa472c45d2bd81b7b52c225e8acc560d716db97John McCall Args, NumArgs, CandidateSet, 3695c27d6c58b2c1a7fecfb53c4f4016af6773a9d5baDouglas Gregor false, /*PartialOverloading*/true); 3696c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor } 36973b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall } 36989c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 36995ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor QualType ParamType; 37005ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 3701c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor if (!CandidateSet.empty()) { 3702c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor // Sort the overload candidate set by placing the best overloads first. 3703c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor std::stable_sort(CandidateSet.begin(), CandidateSet.end(), 37045769d6195087229770d7ac90449443e026c47103John McCall IsBetterOverloadCandidate(*this, Loc)); 3705c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor 3706c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor // Add the remaining viable overload candidates as code-completion reslults. 3707c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor for (OverloadCandidateSet::iterator Cand = CandidateSet.begin(), 3708c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor CandEnd = CandidateSet.end(); 3709c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor Cand != CandEnd; ++Cand) { 3710c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor if (Cand->Viable) 3711c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor Results.push_back(ResultCandidate(Cand->Function)); 3712c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor } 37135ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 37145ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor // From the viable candidates, try to determine the type of this parameter. 37155ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor for (unsigned I = 0, N = Results.size(); I != N; ++I) { 37165ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (const FunctionType *FType = Results[I].getFunctionType()) 37175ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (const FunctionProtoType *Proto = dyn_cast<FunctionProtoType>(FType)) 37185ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (NumArgs < Proto->getNumArgs()) { 37195ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (ParamType.isNull()) 37205ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor ParamType = Proto->getArgType(NumArgs); 37215ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor else if (!Context.hasSameUnqualifiedType( 37225ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor ParamType.getNonReferenceType(), 37235ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor Proto->getArgType(NumArgs).getNonReferenceType())) { 37245ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor ParamType = QualType(); 37255ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor break; 37265ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor } 37275ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor } 37285ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor } 37295ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor } else { 37305ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor // Try to determine the parameter type from the type of the expression 37315ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor // being called. 37325ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor QualType FunctionType = Fn->getType(); 37335ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (const PointerType *Ptr = FunctionType->getAs<PointerType>()) 37345ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor FunctionType = Ptr->getPointeeType(); 37355ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor else if (const BlockPointerType *BlockPtr 37365ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor = FunctionType->getAs<BlockPointerType>()) 37375ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor FunctionType = BlockPtr->getPointeeType(); 37385ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor else if (const MemberPointerType *MemPtr 37395ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor = FunctionType->getAs<MemberPointerType>()) 37405ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor FunctionType = MemPtr->getPointeeType(); 37415ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 37425ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (const FunctionProtoType *Proto 37435ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor = FunctionType->getAs<FunctionProtoType>()) { 37445ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (NumArgs < Proto->getNumArgs()) 37455ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor ParamType = Proto->getArgType(NumArgs); 37465ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor } 37479c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor } 3748ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor 37495ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (ParamType.isNull()) 3750e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompleteOrdinaryName(S, PCC_Expression); 37515ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor else 37525ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor CodeCompleteExpression(S, ParamType); 37535ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 37542e4c7a5865739709a310d847da34096aa402d183Douglas Gregor if (!Results.empty()) 3755ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor CodeCompleter->ProcessOverloadCandidates(*this, NumArgs, Results.data(), 3756ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor Results.size()); 37579c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor} 37589c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 3759d226f65006733ed7f709c3174f22ce33391cb58fJohn McCallvoid Sema::CodeCompleteInitializer(Scope *S, Decl *D) { 3760d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall ValueDecl *VD = dyn_cast_or_null<ValueDecl>(D); 37615ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (!VD) { 3762e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompleteOrdinaryName(S, PCC_Expression); 37635ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor return; 37645ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor } 37655ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 37665ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor CodeCompleteExpression(S, VD->getType()); 37675ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor} 37685ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 37695ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregorvoid Sema::CodeCompleteReturn(Scope *S) { 37705ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor QualType ResultType; 37715ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (isa<BlockDecl>(CurContext)) { 37725ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (BlockScopeInfo *BSI = getCurBlock()) 37735ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor ResultType = BSI->ReturnType; 37745ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor } else if (FunctionDecl *Function = dyn_cast<FunctionDecl>(CurContext)) 37755ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor ResultType = Function->getResultType(); 37765ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor else if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(CurContext)) 37775ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor ResultType = Method->getResultType(); 37785ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 37795ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (ResultType.isNull()) 3780e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompleteOrdinaryName(S, PCC_Expression); 37815ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor else 37825ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor CodeCompleteExpression(S, ResultType); 37835ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor} 37845ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 3785d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregorvoid Sema::CodeCompleteAfterIf(Scope *S) { 3786d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor typedef CodeCompletionResult Result; 3787d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 3788d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor mapCodeCompletionContext(*this, PCC_Statement)); 3789d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Results.setFilter(&ResultBuilder::IsOrdinaryName); 3790d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Results.EnterNewScope(); 3791d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor 3792d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 3793d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 3794d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor CodeCompleter->includeGlobals()); 3795d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor 3796d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor AddOrdinaryNameResults(PCC_Statement, S, *this, Results); 3797d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor 3798d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor // "else" block 3799d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor CodeCompletionBuilder Builder(Results.getAllocator()); 3800d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddTypedTextChunk("else"); 3801d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 3802d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 3803d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 3804d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddPlaceholderChunk("statements"); 3805d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 3806d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 3807d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Results.AddResult(Builder.TakeString()); 3808d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor 3809d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor // "else if" block 3810d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddTypedTextChunk("else"); 3811d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 3812d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddTextChunk("if"); 3813d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 3814d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 3815d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor if (getLangOptions().CPlusPlus) 3816d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddPlaceholderChunk("condition"); 3817d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor else 3818d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddPlaceholderChunk("expression"); 3819d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 3820d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 3821d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 3822d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 3823d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddPlaceholderChunk("statements"); 3824d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 3825d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 3826d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Results.AddResult(Builder.TakeString()); 3827d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor 3828d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Results.ExitScope(); 3829d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor 3830d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor if (S->getFnParent()) 3831d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor AddPrettyFunctionResults(PP.getLangOptions(), Results); 3832d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor 3833d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor if (CodeCompleter->includeMacros()) 3834d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor AddMacroResults(PP, Results); 3835d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor 3836d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 3837d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Results.data(),Results.size()); 3838d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor} 3839d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor 3840f81e5a9e3f3ff80c56e4afb4fe6311a8735f36e8Richard Trieuvoid Sema::CodeCompleteAssignmentRHS(Scope *S, Expr *LHS) { 38415ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (LHS) 38425ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor CodeCompleteExpression(S, static_cast<Expr *>(LHS)->getType()); 38435ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor else 3844e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompleteOrdinaryName(S, PCC_Expression); 38455ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor} 38465ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 38479ab14541716928894821cf5d53d6b4c95ffdf3a3Jeffrey Yasskinvoid Sema::CodeCompleteQualifiedId(Scope *S, CXXScopeSpec &SS, 384881b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor bool EnteringContext) { 384981b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor if (!SS.getScopeRep() || !CodeCompleter) 385081b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor return; 385181b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor 385286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor DeclContext *Ctx = computeDeclContext(SS, EnteringContext); 385386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!Ctx) 385486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return; 3855d1cd31aeb806077340be94e32429f3192cf139b0Douglas Gregor 3856d1cd31aeb806077340be94e32429f3192cf139b0Douglas Gregor // Try to instantiate any non-dependent declaration contexts before 3857d1cd31aeb806077340be94e32429f3192cf139b0Douglas Gregor // we look in them. 385877bb1aa78bcd26e42c0382043e65a2b03242be4dJohn McCall if (!isDependentScopeSpecifier(SS) && RequireCompleteDeclContext(SS, Ctx)) 3859d1cd31aeb806077340be94e32429f3192cf139b0Douglas Gregor return; 3860d1cd31aeb806077340be94e32429f3192cf139b0Douglas Gregor 3861218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 3862218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Name); 3863f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor Results.EnterNewScope(); 386452779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor 386586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // The "template" keyword can follow "::" in the grammar, but only 386686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // put it into the grammar if the nested-name-specifier is dependent. 386786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NestedNameSpecifier *NNS = (NestedNameSpecifier *)SS.getScopeRep(); 386886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!Results.empty() && NNS->isDependent()) 3869a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult("template"); 3870f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor 3871f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor // Add calls to overridden virtual functions, if there are any. 3872f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor // 3873f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor // FIXME: This isn't wonderful, because we don't know whether we're actually 3874f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor // in a context that permits expressions. This is a general issue with 3875f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor // qualified-id completions. 3876f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor if (!EnteringContext) 3877f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor MaybeAddOverrideCalls(*this, Ctx, Results); 3878f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor Results.ExitScope(); 387986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 3880f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 3881f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor LookupVisibleDecls(Ctx, LookupOrdinaryName, Consumer); 3882f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor 3883e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 3884430d7a1a621a126a9ffe442ad8987ba02b46dae9Douglas Gregor Results.getCompletionContext(), 3885e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 388681b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor} 388749f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 388849f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregorvoid Sema::CodeCompleteUsing(Scope *S) { 388949f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor if (!CodeCompleter) 389049f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor return; 389149f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 3892218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 389352779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor CodeCompletionContext::CCC_PotentiallyQualifiedName, 389452779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor &ResultBuilder::IsNestedNameSpecifier); 38958e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.EnterNewScope(); 389686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 389786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // If we aren't in class scope, we could see the "namespace" keyword. 389886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!S->isClassScope()) 38990a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall Results.AddResult(CodeCompletionResult("namespace")); 390086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 390186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // After "using", we can see anything that would start a 390286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // nested-name-specifier. 39035d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 39048071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 39058071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompleter->includeGlobals()); 39068e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.ExitScope(); 390786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 3908e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 390952779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor CodeCompletionContext::CCC_PotentiallyQualifiedName, 3910e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 391149f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor} 391249f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 391349f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregorvoid Sema::CodeCompleteUsingDirective(Scope *S) { 391449f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor if (!CodeCompleter) 391549f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor return; 391649f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 391786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // After "using namespace", we expect to see a namespace name or namespace 391886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // alias. 3919218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 3920218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Namespace, 392152779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor &ResultBuilder::IsNamespaceOrAlias); 39228e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.EnterNewScope(); 39235d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 39248071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 39258071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompleter->includeGlobals()); 39268e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.ExitScope(); 3927e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 39288071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompletionContext::CCC_Namespace, 3929e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 393049f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor} 393149f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 393249f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregorvoid Sema::CodeCompleteNamespaceDecl(Scope *S) { 393349f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor if (!CodeCompleter) 393449f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor return; 393549f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 393686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor DeclContext *Ctx = (DeclContext *)S->getEntity(); 393786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!S->getParent()) 393886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Ctx = Context.getTranslationUnitDecl(); 393986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 394052779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor bool SuppressedGlobalResults 394152779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor = Ctx && !CodeCompleter->includeGlobals() && isa<TranslationUnitDecl>(Ctx); 394252779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor 3943218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 394452779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor SuppressedGlobalResults 394552779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor ? CodeCompletionContext::CCC_Namespace 394652779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor : CodeCompletionContext::CCC_Other, 394752779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor &ResultBuilder::IsNamespace); 394852779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor 394952779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor if (Ctx && Ctx->isFileContext() && !SuppressedGlobalResults) { 395086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // We only want to see those namespaces that have already been defined 395186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // within this scope, because its likely that the user is creating an 395286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // extended namespace declaration. Keep track of the most recent 395386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // definition of each namespace. 395486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor std::map<NamespaceDecl *, NamespaceDecl *> OrigToLatest; 395586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor for (DeclContext::specific_decl_iterator<NamespaceDecl> 395686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NS(Ctx->decls_begin()), NSEnd(Ctx->decls_end()); 395786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NS != NSEnd; ++NS) 395886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor OrigToLatest[NS->getOriginalNamespace()] = *NS; 395986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 396086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add the most recent definition (or extended definition) of each 396186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // namespace to the list of results. 39628e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.EnterNewScope(); 396386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor for (std::map<NamespaceDecl *, NamespaceDecl *>::iterator 396486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NS = OrigToLatest.begin(), NSEnd = OrigToLatest.end(); 396586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NS != NSEnd; ++NS) 39660a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall Results.AddResult(CodeCompletionResult(NS->second, 0), 3967608300be1972c43fe99154d25d62d697e7c0a0c2Douglas Gregor CurContext, 0, false); 39688e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.ExitScope(); 396986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 397086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 3971e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 397252779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor Results.getCompletionContext(), 3973e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 397449f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor} 397549f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 397649f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregorvoid Sema::CodeCompleteNamespaceAliasDecl(Scope *S) { 397749f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor if (!CodeCompleter) 397849f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor return; 397949f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 398086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // After "namespace", we expect to see a namespace or alias. 3981218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 3982218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Namespace, 398352779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor &ResultBuilder::IsNamespaceOrAlias); 39845d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 39858071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 39868071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompleter->includeGlobals()); 3987e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 398852779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor Results.getCompletionContext(), 3989e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 399049f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor} 399149f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 3992ed8d322b4086b8b1e1f78b21389cabb23457dcb3Douglas Gregorvoid Sema::CodeCompleteOperatorName(Scope *S) { 3993ed8d322b4086b8b1e1f78b21389cabb23457dcb3Douglas Gregor if (!CodeCompleter) 3994ed8d322b4086b8b1e1f78b21389cabb23457dcb3Douglas Gregor return; 399586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 39960a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 3997218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 3998218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Type, 399952779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor &ResultBuilder::IsType); 40008e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.EnterNewScope(); 400186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 400286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add the names of overloadable operators. 400386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 400486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (std::strcmp(Spelling, "?")) \ 4005a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Spelling)); 400686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor#include "clang/Basic/OperatorKinds.def" 400786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 400886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add any type names visible from the current scope 400945bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor Results.allowNestedNameSpecifiers(); 40105d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 40118071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 40128071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompleter->includeGlobals()); 401386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 401486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add any type specifiers 4015bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddTypeSpecifierResults(getLangOptions(), Results); 40168e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.ExitScope(); 4017ed8d322b4086b8b1e1f78b21389cabb23457dcb3Douglas Gregor 4018e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 40198071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompletionContext::CCC_Type, 4020e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 4021c464ae8444edb6d07ea49b7a0eae1674c0fa1bb8Douglas Gregor} 4022c464ae8444edb6d07ea49b7a0eae1674c0fa1bb8Douglas Gregor 40230133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregorvoid Sema::CodeCompleteConstructorInitializer(Decl *ConstructorD, 4024cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt CXXCtorInitializer** Initializers, 40250133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor unsigned NumInitializers) { 40268987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor PrintingPolicy Policy = getCompletionPrintingPolicy(*this); 40270133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor CXXConstructorDecl *Constructor 40280133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor = static_cast<CXXConstructorDecl *>(ConstructorD); 40290133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor if (!Constructor) 40300133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor return; 40310133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor 4032218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 403352779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor CodeCompletionContext::CCC_PotentiallyQualifiedName); 40340133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor Results.EnterNewScope(); 40350133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor 40360133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor // Fill in any already-initialized fields or base classes. 40370133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor llvm::SmallPtrSet<FieldDecl *, 4> InitializedFields; 40380133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor llvm::SmallPtrSet<CanQualType, 4> InitializedBases; 40390133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor for (unsigned I = 0; I != NumInitializers; ++I) { 40400133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor if (Initializers[I]->isBaseInitializer()) 40410133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor InitializedBases.insert( 40420133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor Context.getCanonicalType(QualType(Initializers[I]->getBaseClass(), 0))); 40430133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor else 404400eb3f9c5b33e3d99aee1f8b75dd9c9678fdd66bFrancois Pichet InitializedFields.insert(cast<FieldDecl>( 404500eb3f9c5b33e3d99aee1f8b75dd9c9678fdd66bFrancois Pichet Initializers[I]->getAnyMember())); 40460133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor } 40470133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor 40480133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor // Add completions for base classes. 4049218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder Builder(Results.getAllocator()); 40500c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor bool SawLastInitializer = (NumInitializers == 0); 40510133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor CXXRecordDecl *ClassDecl = Constructor->getParent(); 40520133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor for (CXXRecordDecl::base_class_iterator Base = ClassDecl->bases_begin(), 40530133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor BaseEnd = ClassDecl->bases_end(); 40540133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor Base != BaseEnd; ++Base) { 40550c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor if (!InitializedBases.insert(Context.getCanonicalType(Base->getType()))) { 40560c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor SawLastInitializer 40570c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor = NumInitializers > 0 && 40580c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor Initializers[NumInitializers - 1]->isBaseInitializer() && 40590c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor Context.hasSameUnqualifiedType(Base->getType(), 40600c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor QualType(Initializers[NumInitializers - 1]->getBaseClass(), 0)); 40610133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor continue; 40620c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor } 40630133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor 4064218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk( 4065dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Results.getAllocator().CopyString( 4066f85e193739c953358c865005855253af4f68a497John McCall Base->getType().getAsString(Policy))); 4067218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4068218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("args"); 4069218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 4070218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(CodeCompletionResult(Builder.TakeString(), 40710c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor SawLastInitializer? CCP_NextInitializer 40720c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor : CCP_MemberDeclaration)); 40730c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor SawLastInitializer = false; 40740133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor } 40750133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor 40760133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor // Add completions for virtual base classes. 40770133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor for (CXXRecordDecl::base_class_iterator Base = ClassDecl->vbases_begin(), 40780133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor BaseEnd = ClassDecl->vbases_end(); 40790133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor Base != BaseEnd; ++Base) { 40800c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor if (!InitializedBases.insert(Context.getCanonicalType(Base->getType()))) { 40810c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor SawLastInitializer 40820c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor = NumInitializers > 0 && 40830c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor Initializers[NumInitializers - 1]->isBaseInitializer() && 40840c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor Context.hasSameUnqualifiedType(Base->getType(), 40850c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor QualType(Initializers[NumInitializers - 1]->getBaseClass(), 0)); 40860133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor continue; 40870c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor } 40880133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor 4089218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk( 4090dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.getAllocator().CopyString( 4091f85e193739c953358c865005855253af4f68a497John McCall Base->getType().getAsString(Policy))); 4092218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4093218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("args"); 4094218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 4095218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(CodeCompletionResult(Builder.TakeString(), 40960c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor SawLastInitializer? CCP_NextInitializer 40970c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor : CCP_MemberDeclaration)); 40980c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor SawLastInitializer = false; 40990133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor } 41000133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor 41010133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor // Add completions for members. 41020133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor for (CXXRecordDecl::field_iterator Field = ClassDecl->field_begin(), 41030133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor FieldEnd = ClassDecl->field_end(); 41040133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor Field != FieldEnd; ++Field) { 41050c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor if (!InitializedFields.insert(cast<FieldDecl>(Field->getCanonicalDecl()))) { 41060c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor SawLastInitializer 41070c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor = NumInitializers > 0 && 410800eb3f9c5b33e3d99aee1f8b75dd9c9678fdd66bFrancois Pichet Initializers[NumInitializers - 1]->isAnyMemberInitializer() && 410900eb3f9c5b33e3d99aee1f8b75dd9c9678fdd66bFrancois Pichet Initializers[NumInitializers - 1]->getAnyMember() == *Field; 41100133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor continue; 41110c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor } 41120133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor 41130133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor if (!Field->getDeclName()) 41140133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor continue; 41150133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor 4116dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddTypedTextChunk(Builder.getAllocator().CopyString( 4117218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Field->getIdentifier()->getName())); 4118218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4119218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("args"); 4120218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 4121218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(CodeCompletionResult(Builder.TakeString(), 41220c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor SawLastInitializer? CCP_NextInitializer 4123a67e03fdf1ae8a1f92463a307d0b6281f1161f40Douglas Gregor : CCP_MemberDeclaration, 4124a67e03fdf1ae8a1f92463a307d0b6281f1161f40Douglas Gregor CXCursor_MemberRef)); 41250c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor SawLastInitializer = false; 41260133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor } 41270133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor Results.ExitScope(); 41280133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor 412952779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 41300133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor Results.data(), Results.size()); 41310133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor} 41320133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor 4133b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor// Macro that expands to @Keyword or Keyword, depending on whether NeedAt is 4134b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor// true or false. 4135b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor#define OBJC_AT_KEYWORD_NAME(NeedAt,Keyword) NeedAt? "@" #Keyword : #Keyword 4136bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCImplementationResults(const LangOptions &LangOpts, 4137b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor ResultBuilder &Results, 4138b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor bool NeedAt) { 41390a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 4140b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // Since we have an implementation, we can end it. 4141a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,end))); 4142b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 4143218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder Builder(Results.getAllocator()); 4144b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor if (LangOpts.ObjC2) { 4145b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @dynamic 4146218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,dynamic)); 4147218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4148218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("property"); 4149218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 4150b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 4151b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @synthesize 4152218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,synthesize)); 4153218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4154218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("property"); 4155218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 4156b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor } 4157b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor} 4158c464ae8444edb6d07ea49b7a0eae1674c0fa1bb8Douglas Gregor 4159bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCInterfaceResults(const LangOptions &LangOpts, 4160b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor ResultBuilder &Results, 4161b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor bool NeedAt) { 41620a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 4163b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 4164b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // Since we have an interface or protocol, we can end it. 4165a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,end))); 4166b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 4167b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor if (LangOpts.ObjC2) { 4168b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @property 4169a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,property))); 4170b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 4171b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @required 4172a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,required))); 4173b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 4174b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @optional 4175a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,optional))); 4176b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor } 4177b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor} 4178834389b87451b24618513b907b4dfb5b00d211f3Douglas Gregor 4179bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCTopLevelResults(ResultBuilder &Results, bool NeedAt) { 41800a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 4181218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder Builder(Results.getAllocator()); 4182b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 4183b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @class name ; 4184218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,class)); 4185218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4186218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("name"); 4187218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 4188b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 4189c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor if (Results.includeCodePatterns()) { 4190c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // @interface name 4191c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // FIXME: Could introduce the whole pattern, including superclasses and 4192c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // such. 4193218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,interface)); 4194218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4195218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("class"); 4196218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 4197b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 4198c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // @protocol name 4199218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,protocol)); 4200218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4201218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("protocol"); 4202218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 4203c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor 4204c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // @implementation name 4205218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,implementation)); 4206218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4207218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("class"); 4208218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 4209c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor } 4210b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 4211b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @compatibility_alias name 4212218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,compatibility_alias)); 4213218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4214218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("alias"); 4215218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4216218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("class"); 4217218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 4218b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor} 4219834389b87451b24618513b907b4dfb5b00d211f3Douglas Gregor 4220a28948f34817476d02412fa204cae038e228c827Fariborz Jahanianvoid Sema::CodeCompleteObjCAtDirective(Scope *S) { 42210a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 4222218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 4223218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 4224b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Results.EnterNewScope(); 4225a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian if (isa<ObjCImplDecl>(CurContext)) 4226bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCImplementationResults(getLangOptions(), Results, false); 4227a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian else if (CurContext->isObjCContainer()) 4228bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCInterfaceResults(getLangOptions(), Results, false); 4229b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor else 4230bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCTopLevelResults(Results, false); 4231c464ae8444edb6d07ea49b7a0eae1674c0fa1bb8Douglas Gregor Results.ExitScope(); 4232e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 4233e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 4234e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 42359a0c85e640a08174569a303db22981612f05d385Douglas Gregor} 42369a0c85e640a08174569a303db22981612f05d385Douglas Gregor 4237bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCExpressionResults(ResultBuilder &Results, bool NeedAt) { 42380a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 4239218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder Builder(Results.getAllocator()); 42409a0c85e640a08174569a303db22981612f05d385Douglas Gregor 42419a0c85e640a08174569a303db22981612f05d385Douglas Gregor // @encode ( type-name ) 42428ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor const char *EncodeType = "char[]"; 42438ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor if (Results.getSema().getLangOptions().CPlusPlus || 42448ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Results.getSema().getLangOptions().ConstStrings) 42458ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor EncodeType = " const char[]"; 42468ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk(EncodeType); 4247218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,encode)); 4248218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4249218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("type-name"); 4250218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 4251218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 42529a0c85e640a08174569a303db22981612f05d385Douglas Gregor 42539a0c85e640a08174569a303db22981612f05d385Douglas Gregor // @protocol ( protocol-name ) 42548ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("Protocol *"); 4255218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,protocol)); 4256218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4257218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("protocol-name"); 4258218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 4259218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 42609a0c85e640a08174569a303db22981612f05d385Douglas Gregor 42619a0c85e640a08174569a303db22981612f05d385Douglas Gregor // @selector ( selector ) 42628ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("SEL"); 4263218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,selector)); 4264218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4265218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("selector"); 4266218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 4267218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 42689a0c85e640a08174569a303db22981612f05d385Douglas Gregor} 42699a0c85e640a08174569a303db22981612f05d385Douglas Gregor 4270bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCStatementResults(ResultBuilder &Results, bool NeedAt) { 42710a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 4272218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder Builder(Results.getAllocator()); 4273b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 4274c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor if (Results.includeCodePatterns()) { 4275c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // @try { statements } @catch ( declaration ) { statements } @finally 4276c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // { statements } 4277218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,try)); 4278218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 4279218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("statements"); 4280218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 4281218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("@catch"); 4282218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4283218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("parameter"); 4284218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 4285218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 4286218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("statements"); 4287218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 4288218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("@finally"); 4289218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 4290218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("statements"); 4291218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 4292218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 4293c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor } 4294b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 42959a0c85e640a08174569a303db22981612f05d385Douglas Gregor // @throw 4296218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,throw)); 4297218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4298218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 4299218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 4300b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 4301c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor if (Results.includeCodePatterns()) { 4302c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // @synchronized ( expression ) { statements } 4303218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,synchronized)); 4304218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4305218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4306218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 4307218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 4308218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 4309218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("statements"); 4310218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 4311218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 4312c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor } 4313b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor} 43149a0c85e640a08174569a303db22981612f05d385Douglas Gregor 4315bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCVisibilityResults(const LangOptions &LangOpts, 4316c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor ResultBuilder &Results, 4317c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor bool NeedAt) { 43180a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 4319a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,private))); 4320a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,protected))); 4321a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,public))); 4322c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor if (LangOpts.ObjC2) 4323a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,package))); 4324c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor} 4325c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor 4326c38c3e1e726630458154534227d74eda833d26a0Douglas Gregorvoid Sema::CodeCompleteObjCAtVisibility(Scope *S) { 4327218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 4328218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 4329c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor Results.EnterNewScope(); 4330bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCVisibilityResults(getLangOptions(), Results, false); 4331c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor Results.ExitScope(); 4332e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 4333e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 4334e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 4335c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor} 4336c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor 4337c38c3e1e726630458154534227d74eda833d26a0Douglas Gregorvoid Sema::CodeCompleteObjCAtStatement(Scope *S) { 4338218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 4339218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 4340b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Results.EnterNewScope(); 4341bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCStatementResults(Results, false); 4342bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCExpressionResults(Results, false); 43439a0c85e640a08174569a303db22981612f05d385Douglas Gregor Results.ExitScope(); 4344e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 4345e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 4346e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 43479a0c85e640a08174569a303db22981612f05d385Douglas Gregor} 43489a0c85e640a08174569a303db22981612f05d385Douglas Gregor 43499a0c85e640a08174569a303db22981612f05d385Douglas Gregorvoid Sema::CodeCompleteObjCAtExpression(Scope *S) { 4350218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 4351218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 43529a0c85e640a08174569a303db22981612f05d385Douglas Gregor Results.EnterNewScope(); 4353bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCExpressionResults(Results, false); 43549a0c85e640a08174569a303db22981612f05d385Douglas Gregor Results.ExitScope(); 4355e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 4356e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 4357e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 4358ed8d322b4086b8b1e1f78b21389cabb23457dcb3Douglas Gregor} 435949f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 4360988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor/// \brief Determine whether the addition of the given flag to an Objective-C 4361988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor/// property's attributes will cause a conflict. 4362988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregorstatic bool ObjCPropertyFlagConflicts(unsigned Attributes, unsigned NewFlag) { 4363988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor // Check if we've already added this flag. 4364988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (Attributes & NewFlag) 4365988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor return true; 4366988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor 4367988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor Attributes |= NewFlag; 4368988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor 4369988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor // Check for collisions with "readonly". 4370988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if ((Attributes & ObjCDeclSpec::DQ_PR_readonly) && 4371988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor (Attributes & (ObjCDeclSpec::DQ_PR_readwrite | 4372988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor ObjCDeclSpec::DQ_PR_assign | 4373f85e193739c953358c865005855253af4f68a497John McCall ObjCDeclSpec::DQ_PR_unsafe_unretained | 4374988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor ObjCDeclSpec::DQ_PR_copy | 4375f85e193739c953358c865005855253af4f68a497John McCall ObjCDeclSpec::DQ_PR_retain | 4376f85e193739c953358c865005855253af4f68a497John McCall ObjCDeclSpec::DQ_PR_strong))) 4377988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor return true; 4378988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor 4379f85e193739c953358c865005855253af4f68a497John McCall // Check for more than one of { assign, copy, retain, strong }. 4380988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor unsigned AssignCopyRetMask = Attributes & (ObjCDeclSpec::DQ_PR_assign | 4381f85e193739c953358c865005855253af4f68a497John McCall ObjCDeclSpec::DQ_PR_unsafe_unretained | 4382988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor ObjCDeclSpec::DQ_PR_copy | 4383f85e193739c953358c865005855253af4f68a497John McCall ObjCDeclSpec::DQ_PR_retain| 4384f85e193739c953358c865005855253af4f68a497John McCall ObjCDeclSpec::DQ_PR_strong); 4385988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (AssignCopyRetMask && 4386988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor AssignCopyRetMask != ObjCDeclSpec::DQ_PR_assign && 4387f85e193739c953358c865005855253af4f68a497John McCall AssignCopyRetMask != ObjCDeclSpec::DQ_PR_unsafe_unretained && 4388988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor AssignCopyRetMask != ObjCDeclSpec::DQ_PR_copy && 4389f85e193739c953358c865005855253af4f68a497John McCall AssignCopyRetMask != ObjCDeclSpec::DQ_PR_retain && 4390f85e193739c953358c865005855253af4f68a497John McCall AssignCopyRetMask != ObjCDeclSpec::DQ_PR_strong) 4391988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor return true; 4392988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor 4393988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor return false; 4394988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor} 4395988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor 4396a93b108e025ef2480fa867cc533e7781a40a639bDouglas Gregorvoid Sema::CodeCompleteObjCPropertyFlags(Scope *S, ObjCDeclSpec &ODS) { 4397ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff if (!CodeCompleter) 4398ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff return; 4399d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor 4400ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff unsigned Attributes = ODS.getPropertyAttributes(); 4401ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff 44020a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 4403218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 4404218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 4405ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff Results.EnterNewScope(); 4406988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_readonly)) 44070a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall Results.AddResult(CodeCompletionResult("readonly")); 4408988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_assign)) 44090a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall Results.AddResult(CodeCompletionResult("assign")); 4410f85e193739c953358c865005855253af4f68a497John McCall if (!ObjCPropertyFlagConflicts(Attributes, 4411f85e193739c953358c865005855253af4f68a497John McCall ObjCDeclSpec::DQ_PR_unsafe_unretained)) 4412f85e193739c953358c865005855253af4f68a497John McCall Results.AddResult(CodeCompletionResult("unsafe_unretained")); 4413988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_readwrite)) 44140a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall Results.AddResult(CodeCompletionResult("readwrite")); 4415988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_retain)) 44160a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall Results.AddResult(CodeCompletionResult("retain")); 4417f85e193739c953358c865005855253af4f68a497John McCall if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_strong)) 4418f85e193739c953358c865005855253af4f68a497John McCall Results.AddResult(CodeCompletionResult("strong")); 4419988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_copy)) 44200a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall Results.AddResult(CodeCompletionResult("copy")); 4421988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_nonatomic)) 44220a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall Results.AddResult(CodeCompletionResult("nonatomic")); 442327f45236005d9dd2bbbfeb1682eb349cb8b6998bFariborz Jahanian if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_atomic)) 442427f45236005d9dd2bbbfeb1682eb349cb8b6998bFariborz Jahanian Results.AddResult(CodeCompletionResult("atomic")); 4425988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_setter)) { 4426218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder Setter(Results.getAllocator()); 4427218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Setter.AddTypedTextChunk("setter"); 4428218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Setter.AddTextChunk(" = "); 4429218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Setter.AddPlaceholderChunk("method"); 4430218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(CodeCompletionResult(Setter.TakeString())); 443154f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor } 4432988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_getter)) { 4433218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder Getter(Results.getAllocator()); 4434218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Getter.AddTypedTextChunk("getter"); 4435218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Getter.AddTextChunk(" = "); 4436218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Getter.AddPlaceholderChunk("method"); 4437218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(CodeCompletionResult(Getter.TakeString())); 443854f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor } 4439ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff Results.ExitScope(); 4440e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 4441e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 4442e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 4443ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff} 4444c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff 44454ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor/// \brief Descripts the kind of Objective-C method that we want to find 44464ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor/// via code completion. 44474ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregorenum ObjCMethodKind { 44484ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor MK_Any, //< Any kind of method, provided it means other specified criteria. 44494ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor MK_ZeroArgSelector, //< Zero-argument (unary) selector. 44504ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor MK_OneArgSelector //< One-argument selector. 44514ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor}; 44524ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 4453458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregorstatic bool isAcceptableObjCSelector(Selector Sel, 4454458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor ObjCMethodKind WantKind, 4455458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor IdentifierInfo **SelIdents, 4456cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor unsigned NumSelIdents, 4457cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor bool AllowSameLength = true) { 44584ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (NumSelIdents > Sel.getNumArgs()) 44594ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor return false; 4460458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor 44614ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor switch (WantKind) { 4462458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor case MK_Any: break; 4463458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor case MK_ZeroArgSelector: return Sel.isUnarySelector(); 4464458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor case MK_OneArgSelector: return Sel.getNumArgs() == 1; 44654ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor } 4466458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor 4467cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor if (!AllowSameLength && NumSelIdents && NumSelIdents == Sel.getNumArgs()) 4468cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor return false; 4469cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor 44704ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor for (unsigned I = 0; I != NumSelIdents; ++I) 44714ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (SelIdents[I] != Sel.getIdentifierInfoForSlot(I)) 44724ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor return false; 4473458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor 44744ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor return true; 44754ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor} 4476458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor 4477458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregorstatic bool isAcceptableObjCMethod(ObjCMethodDecl *Method, 4478458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor ObjCMethodKind WantKind, 4479458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor IdentifierInfo **SelIdents, 4480cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor unsigned NumSelIdents, 4481cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor bool AllowSameLength = true) { 4482458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor return isAcceptableObjCSelector(Method->getSelector(), WantKind, SelIdents, 4483cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor NumSelIdents, AllowSameLength); 4484458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor} 4485d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor 4486d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregornamespace { 4487d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor /// \brief A set of selectors, which is used to avoid introducing multiple 4488d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor /// completions with the same selector into the result set. 4489d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor typedef llvm::SmallPtrSet<Selector, 16> VisitedSelectorSet; 4490d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor} 4491d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor 449236ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// \brief Add all of the Objective-C methods in the given Objective-C 449336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// container to the set of results. 449436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// 449536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// The container will be a class, protocol, category, or implementation of 449636ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// any of the above. This mether will recurse to include methods from 449736ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// the superclasses of classes along with their categories, protocols, and 449836ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// implementations. 449936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// 450036ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// \param Container the container in which we'll look to find methods. 450136ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// 450236ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// \param WantInstance whether to add instance methods (only); if false, this 450336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// routine will add factory methods (only). 450436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// 450536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// \param CurContext the context in which we're performing the lookup that 450636ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// finds methods. 450736ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// 4508cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor/// \param AllowSameLength Whether we allow a method to be added to the list 4509cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor/// when it has the same number of parameters as we have selector identifiers. 4510cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor/// 451136ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// \param Results the structure into which we'll add results. 451236ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregorstatic void AddObjCMethods(ObjCContainerDecl *Container, 451336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor bool WantInstanceMethods, 45144ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor ObjCMethodKind WantKind, 4515d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor IdentifierInfo **SelIdents, 4516d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor unsigned NumSelIdents, 451736ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor DeclContext *CurContext, 4518d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor VisitedSelectorSet &Selectors, 4519cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor bool AllowSameLength, 4520408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor ResultBuilder &Results, 4521408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor bool InOriginalClass = true) { 45220a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 452336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor for (ObjCContainerDecl::method_iterator M = Container->meth_begin(), 452436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor MEnd = Container->meth_end(); 452536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor M != MEnd; ++M) { 4526d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor if ((*M)->isInstanceMethod() == WantInstanceMethods) { 4527d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor // Check whether the selector identifiers we've been given are a 4528d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor // subset of the identifiers for this particular method. 4529cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor if (!isAcceptableObjCMethod(*M, WantKind, SelIdents, NumSelIdents, 4530cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor AllowSameLength)) 4531d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor continue; 45324ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 4533d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor if (!Selectors.insert((*M)->getSelector())) 4534d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor continue; 4535d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor 4536d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor Result R = Result(*M, 0); 4537d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor R.StartParameter = NumSelIdents; 45384ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor R.AllParametersAreInformative = (WantKind != MK_Any); 4539408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor if (!InOriginalClass) 4540408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor R.Priority += CCD_InBaseClass; 4541d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor Results.MaybeAddResult(R, CurContext); 4542d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor } 454336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor } 454436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 4545e396c7bd99ed99fd8136fadc8945791754c61b16Douglas Gregor // Visit the protocols of protocols. 4546e396c7bd99ed99fd8136fadc8945791754c61b16Douglas Gregor if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) { 45475e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor if (Protocol->hasDefinition()) { 45485e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor const ObjCList<ObjCProtocolDecl> &Protocols 45495e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor = Protocol->getReferencedProtocols(); 45505e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 45515e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor E = Protocols.end(); 45525e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor I != E; ++I) 45535e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents, 45545e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor NumSelIdents, CurContext, Selectors, AllowSameLength, 45555e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor Results, false); 45565e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor } 4557e396c7bd99ed99fd8136fadc8945791754c61b16Douglas Gregor } 4558e396c7bd99ed99fd8136fadc8945791754c61b16Douglas Gregor 455936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container); 45602e5c15be82f362611c5928ce853d0685ff98c766Douglas Gregor if (!IFace || !IFace->hasDefinition()) 456136ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor return; 456236ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 456336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add methods in protocols. 456436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor const ObjCList<ObjCProtocolDecl> &Protocols= IFace->getReferencedProtocols(); 456536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 456636ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor E = Protocols.end(); 456736ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor I != E; ++I) 45684ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents, NumSelIdents, 4569cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor CurContext, Selectors, AllowSameLength, Results, false); 457036ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 457136ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add methods in categories. 457236ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor for (ObjCCategoryDecl *CatDecl = IFace->getCategoryList(); CatDecl; 457336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor CatDecl = CatDecl->getNextClassCategory()) { 45744ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(CatDecl, WantInstanceMethods, WantKind, SelIdents, 4575cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor NumSelIdents, CurContext, Selectors, AllowSameLength, 4576cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor Results, InOriginalClass); 457736ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 457836ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add a categories protocol methods. 457936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor const ObjCList<ObjCProtocolDecl> &Protocols 458036ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor = CatDecl->getReferencedProtocols(); 458136ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 458236ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor E = Protocols.end(); 458336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor I != E; ++I) 45844ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents, 4585cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor NumSelIdents, CurContext, Selectors, AllowSameLength, 4586cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor Results, false); 458736ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 458836ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add methods in category implementations. 458936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor if (ObjCCategoryImplDecl *Impl = CatDecl->getImplementation()) 45904ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(Impl, WantInstanceMethods, WantKind, SelIdents, 4591cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor NumSelIdents, CurContext, Selectors, AllowSameLength, 4592cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor Results, InOriginalClass); 459336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor } 459436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 459536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add methods in superclass. 459636ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor if (IFace->getSuperClass()) 45974ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(IFace->getSuperClass(), WantInstanceMethods, WantKind, 4598cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor SelIdents, NumSelIdents, CurContext, Selectors, 4599cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor AllowSameLength, Results, false); 460036ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 460136ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add methods in our implementation, if any. 460236ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor if (ObjCImplementationDecl *Impl = IFace->getImplementation()) 46034ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(Impl, WantInstanceMethods, WantKind, SelIdents, 4604cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor NumSelIdents, CurContext, Selectors, AllowSameLength, 4605cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor Results, InOriginalClass); 46064ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor} 46074ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 46084ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 4609a28948f34817476d02412fa204cae038e228c827Fariborz Jahanianvoid Sema::CodeCompleteObjCPropertyGetter(Scope *S) { 46100a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 46114ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 46124ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor // Try to find the interface where getters might live. 4613a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurContext); 46144ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (!Class) { 46154ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (ObjCCategoryDecl *Category 4616a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian = dyn_cast_or_null<ObjCCategoryDecl>(CurContext)) 46174ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Class = Category->getClassInterface(); 46184ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 46194ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (!Class) 46204ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor return; 46214ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor } 46224ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 46234ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor // Find all of the potential getters. 4624218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 4625218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 46264ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Results.EnterNewScope(); 46274ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 4628d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor VisitedSelectorSet Selectors; 4629d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor AddObjCMethods(Class, true, MK_ZeroArgSelector, 0, 0, CurContext, Selectors, 4630cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor /*AllowSameLength=*/true, Results); 46314ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Results.ExitScope(); 4632e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 4633e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 4634e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 46354ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor} 46364ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 4637a28948f34817476d02412fa204cae038e228c827Fariborz Jahanianvoid Sema::CodeCompleteObjCPropertySetter(Scope *S) { 46380a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 46394ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 46404ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor // Try to find the interface where setters might live. 46414ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor ObjCInterfaceDecl *Class 4642a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian = dyn_cast_or_null<ObjCInterfaceDecl>(CurContext); 46434ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (!Class) { 46444ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (ObjCCategoryDecl *Category 4645a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian = dyn_cast_or_null<ObjCCategoryDecl>(CurContext)) 46464ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Class = Category->getClassInterface(); 46474ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 46484ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (!Class) 46494ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor return; 46504ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor } 46514ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 46524ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor // Find all of the potential getters. 4653218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 4654218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 46554ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Results.EnterNewScope(); 46564ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 4657d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor VisitedSelectorSet Selectors; 4658d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor AddObjCMethods(Class, true, MK_OneArgSelector, 0, 0, CurContext, 4659cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor Selectors, /*AllowSameLength=*/true, Results); 46604ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 46614ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Results.ExitScope(); 4662e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 4663e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 4664e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 466536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor} 466636ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 4667afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregorvoid Sema::CodeCompleteObjCPassingType(Scope *S, ObjCDeclSpec &DS, 4668afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor bool IsParameter) { 46690a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 4670218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 4671218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Type); 4672d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor Results.EnterNewScope(); 4673d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor 4674d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor // Add context-sensitive, Objective-C parameter-passing keywords. 4675d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor bool AddedInOut = false; 4676d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor if ((DS.getObjCDeclQualifier() & 4677d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor (ObjCDeclSpec::DQ_In | ObjCDeclSpec::DQ_Inout)) == 0) { 4678d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor Results.AddResult("in"); 4679d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor Results.AddResult("inout"); 4680d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor AddedInOut = true; 4681d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor } 4682d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor if ((DS.getObjCDeclQualifier() & 4683d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor (ObjCDeclSpec::DQ_Out | ObjCDeclSpec::DQ_Inout)) == 0) { 4684d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor Results.AddResult("out"); 4685d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor if (!AddedInOut) 4686d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor Results.AddResult("inout"); 4687d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor } 4688d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor if ((DS.getObjCDeclQualifier() & 4689d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor (ObjCDeclSpec::DQ_Bycopy | ObjCDeclSpec::DQ_Byref | 4690d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor ObjCDeclSpec::DQ_Oneway)) == 0) { 4691d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor Results.AddResult("bycopy"); 4692d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor Results.AddResult("byref"); 4693d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor Results.AddResult("oneway"); 4694d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor } 4695d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor 4696afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor // If we're completing the return type of an Objective-C method and the 4697afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor // identifier IBAction refers to a macro, provide a completion item for 4698afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor // an action, e.g., 4699afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor // IBAction)<#selector#>:(id)sender 4700afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor if (DS.getObjCDeclQualifier() == 0 && !IsParameter && 4701afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor Context.Idents.get("IBAction").hasMacroDefinition()) { 4702afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor typedef CodeCompletionString::Chunk Chunk; 4703afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor CodeCompletionBuilder Builder(Results.getAllocator(), CCP_CodePattern, 4704afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor CXAvailability_Available); 4705afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor Builder.AddTypedTextChunk("IBAction"); 4706afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor Builder.AddChunk(Chunk(CodeCompletionString::CK_RightParen)); 4707afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor Builder.AddPlaceholderChunk("selector"); 4708afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor Builder.AddChunk(Chunk(CodeCompletionString::CK_Colon)); 4709afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor Builder.AddChunk(Chunk(CodeCompletionString::CK_LeftParen)); 4710afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor Builder.AddTextChunk("id"); 4711afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor Builder.AddChunk(Chunk(CodeCompletionString::CK_RightParen)); 4712afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor Builder.AddTextChunk("sender"); 4713afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor Results.AddResult(CodeCompletionResult(Builder.TakeString())); 4714afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor } 4715afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor 4716d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor // Add various builtin type names and specifiers. 4717d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor AddOrdinaryNameResults(PCC_Type, S, *this, Results); 4718d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor Results.ExitScope(); 4719d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor 4720d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor // Add the various type names 4721d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor Results.setFilter(&ResultBuilder::IsOrdinaryNonValueName); 4722d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 4723d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 4724d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor CodeCompleter->includeGlobals()); 4725d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor 4726d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor if (CodeCompleter->includeMacros()) 4727d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor AddMacroResults(PP, Results); 4728d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor 4729d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 4730d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor CodeCompletionContext::CCC_Type, 4731d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor Results.data(), Results.size()); 4732d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor} 4733d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor 473422f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor/// \brief When we have an expression with type "id", we may assume 473522f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor/// that it has some more-specific class type based on knowledge of 473622f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor/// common uses of Objective-C. This routine returns that class type, 473722f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor/// or NULL if no better result could be determined. 473822f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregorstatic ObjCInterfaceDecl *GetAssumedMessageSendExprType(Expr *E) { 473978edf515544f0b9dddf69d6c1678fd83e94d8352Douglas Gregor ObjCMessageExpr *Msg = dyn_cast_or_null<ObjCMessageExpr>(E); 474022f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor if (!Msg) 474122f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor return 0; 474222f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor 474322f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor Selector Sel = Msg->getSelector(); 474422f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor if (Sel.isNull()) 474522f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor return 0; 474622f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor 474722f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor IdentifierInfo *Id = Sel.getIdentifierInfoForSlot(0); 474822f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor if (!Id) 474922f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor return 0; 475022f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor 475122f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor ObjCMethodDecl *Method = Msg->getMethodDecl(); 475222f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor if (!Method) 475322f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor return 0; 475422f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor 475522f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor // Determine the class that we're sending the message to. 475604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor ObjCInterfaceDecl *IFace = 0; 475704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor switch (Msg->getReceiverKind()) { 475804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor case ObjCMessageExpr::Class: 4759c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (const ObjCObjectType *ObjType 4760c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall = Msg->getClassReceiver()->getAs<ObjCObjectType>()) 4761c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall IFace = ObjType->getInterface(); 476204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor break; 476304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor 476404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor case ObjCMessageExpr::Instance: { 476504badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor QualType T = Msg->getInstanceReceiver()->getType(); 476604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor if (const ObjCObjectPointerType *Ptr = T->getAs<ObjCObjectPointerType>()) 476704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor IFace = Ptr->getInterfaceDecl(); 476804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor break; 476904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor } 477004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor 477104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor case ObjCMessageExpr::SuperInstance: 477204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor case ObjCMessageExpr::SuperClass: 477304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor break; 477422f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor } 477522f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor 477622f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor if (!IFace) 477722f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor return 0; 477822f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor 477922f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor ObjCInterfaceDecl *Super = IFace->getSuperClass(); 478022f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor if (Method->isInstanceMethod()) 478122f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor return llvm::StringSwitch<ObjCInterfaceDecl *>(Id->getName()) 478222f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("retain", IFace) 4783f85e193739c953358c865005855253af4f68a497John McCall .Case("strong", IFace) 478422f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("autorelease", IFace) 478522f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("copy", IFace) 478622f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("copyWithZone", IFace) 478722f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("mutableCopy", IFace) 478822f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("mutableCopyWithZone", IFace) 478922f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("awakeFromCoder", IFace) 479022f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("replacementObjectFromCoder", IFace) 479122f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("class", IFace) 479222f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("classForCoder", IFace) 479322f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("superclass", Super) 479422f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Default(0); 479522f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor 479622f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor return llvm::StringSwitch<ObjCInterfaceDecl *>(Id->getName()) 479722f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("new", IFace) 479822f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("alloc", IFace) 479922f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("allocWithZone", IFace) 480022f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("class", IFace) 480122f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("superclass", Super) 480222f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Default(0); 480322f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor} 480422f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor 480503d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor// Add a special completion for a message send to "super", which fills in the 480603d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor// most likely case of forwarding all of our arguments to the superclass 480703d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor// function. 480803d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// 480903d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// \param S The semantic analysis object. 481003d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// 481103d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// \param S NeedSuperKeyword Whether we need to prefix this completion with 481203d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// the "super" keyword. Otherwise, we just need to provide the arguments. 481303d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// 481403d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// \param SelIdents The identifiers in the selector that have already been 481503d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// provided as arguments for a send to "super". 481603d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// 481703d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// \param NumSelIdents The number of identifiers in \p SelIdents. 481803d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// 481903d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// \param Results The set of results to augment. 482003d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// 482103d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// \returns the Objective-C method declaration that would be invoked by 482203d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// this "super" completion. If NULL, no completion was added. 482303d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregorstatic ObjCMethodDecl *AddSuperSendCompletion(Sema &S, bool NeedSuperKeyword, 482403d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor IdentifierInfo **SelIdents, 482503d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor unsigned NumSelIdents, 482603d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor ResultBuilder &Results) { 482703d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor ObjCMethodDecl *CurMethod = S.getCurMethodDecl(); 482803d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (!CurMethod) 482903d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor return 0; 483003d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 483103d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor ObjCInterfaceDecl *Class = CurMethod->getClassInterface(); 483203d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (!Class) 483303d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor return 0; 483403d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 483503d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor // Try to find a superclass method with the same selector. 483603d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor ObjCMethodDecl *SuperMethod = 0; 483778bcd9139f4b35be75190446c95614120d9b4c09Douglas Gregor while ((Class = Class->getSuperClass()) && !SuperMethod) { 483878bcd9139f4b35be75190446c95614120d9b4c09Douglas Gregor // Check in the class 483903d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor SuperMethod = Class->getMethod(CurMethod->getSelector(), 484003d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor CurMethod->isInstanceMethod()); 484103d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 484278bcd9139f4b35be75190446c95614120d9b4c09Douglas Gregor // Check in categories or class extensions. 484378bcd9139f4b35be75190446c95614120d9b4c09Douglas Gregor if (!SuperMethod) { 484478bcd9139f4b35be75190446c95614120d9b4c09Douglas Gregor for (ObjCCategoryDecl *Category = Class->getCategoryList(); Category; 484578bcd9139f4b35be75190446c95614120d9b4c09Douglas Gregor Category = Category->getNextClassCategory()) 484678bcd9139f4b35be75190446c95614120d9b4c09Douglas Gregor if ((SuperMethod = Category->getMethod(CurMethod->getSelector(), 484778bcd9139f4b35be75190446c95614120d9b4c09Douglas Gregor CurMethod->isInstanceMethod()))) 484878bcd9139f4b35be75190446c95614120d9b4c09Douglas Gregor break; 484978bcd9139f4b35be75190446c95614120d9b4c09Douglas Gregor } 485078bcd9139f4b35be75190446c95614120d9b4c09Douglas Gregor } 485178bcd9139f4b35be75190446c95614120d9b4c09Douglas Gregor 485203d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (!SuperMethod) 485303d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor return 0; 485403d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 485503d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor // Check whether the superclass method has the same signature. 485603d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (CurMethod->param_size() != SuperMethod->param_size() || 485703d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor CurMethod->isVariadic() != SuperMethod->isVariadic()) 485803d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor return 0; 485903d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 486003d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor for (ObjCMethodDecl::param_iterator CurP = CurMethod->param_begin(), 486103d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor CurPEnd = CurMethod->param_end(), 486203d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor SuperP = SuperMethod->param_begin(); 486303d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor CurP != CurPEnd; ++CurP, ++SuperP) { 486403d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor // Make sure the parameter types are compatible. 486503d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (!S.Context.hasSameUnqualifiedType((*CurP)->getType(), 486603d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor (*SuperP)->getType())) 486703d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor return 0; 486803d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 486903d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor // Make sure we have a parameter name to forward! 487003d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (!(*CurP)->getIdentifier()) 487103d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor return 0; 487203d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor } 487303d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 487403d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor // We have a superclass method. Now, form the send-to-super completion. 4875218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder Builder(Results.getAllocator()); 487603d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 487703d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor // Give this completion a return type. 48788987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor AddResultTypeChunk(S.Context, getCompletionPrintingPolicy(S), SuperMethod, 48798987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor Builder); 488003d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 488103d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor // If we need the "super" keyword, add it (plus some spacing). 488203d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (NeedSuperKeyword) { 4883218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("super"); 4884218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 488503d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor } 488603d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 488703d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor Selector Sel = CurMethod->getSelector(); 488803d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (Sel.isUnarySelector()) { 488903d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (NeedSuperKeyword) 4890dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddTextChunk(Builder.getAllocator().CopyString( 4891813d8346529bf094eb2b249648906ba7fd226688Douglas Gregor Sel.getNameForSlot(0))); 489203d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor else 4893dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddTypedTextChunk(Builder.getAllocator().CopyString( 4894813d8346529bf094eb2b249648906ba7fd226688Douglas Gregor Sel.getNameForSlot(0))); 489503d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor } else { 489603d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor ObjCMethodDecl::param_iterator CurP = CurMethod->param_begin(); 489703d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor for (unsigned I = 0, N = Sel.getNumArgs(); I != N; ++I, ++CurP) { 489803d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (I > NumSelIdents) 4899218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 490003d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 490103d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (I < NumSelIdents) 4902218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddInformativeChunk( 4903dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.getAllocator().CopyString( 4904813d8346529bf094eb2b249648906ba7fd226688Douglas Gregor Sel.getNameForSlot(I) + ":")); 490503d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor else if (NeedSuperKeyword || I > NumSelIdents) { 4906218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk( 4907dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.getAllocator().CopyString( 4908813d8346529bf094eb2b249648906ba7fd226688Douglas Gregor Sel.getNameForSlot(I) + ":")); 4909dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddPlaceholderChunk(Builder.getAllocator().CopyString( 4910218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor (*CurP)->getIdentifier()->getName())); 491103d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor } else { 4912218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk( 4913dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.getAllocator().CopyString( 4914813d8346529bf094eb2b249648906ba7fd226688Douglas Gregor Sel.getNameForSlot(I) + ":")); 4915dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddPlaceholderChunk(Builder.getAllocator().CopyString( 4916218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor (*CurP)->getIdentifier()->getName())); 491703d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor } 491803d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor } 491903d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor } 492003d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 4921218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(CodeCompletionResult(Builder.TakeString(), CCP_SuperCompletion, 492203d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor SuperMethod->isInstanceMethod() 492303d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor ? CXCursor_ObjCInstanceMethodDecl 492403d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor : CXCursor_ObjCClassMethodDecl)); 492503d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor return SuperMethod; 492603d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor} 492703d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 49288e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregorvoid Sema::CodeCompleteObjCMessageReceiver(Scope *S) { 49290a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 4930218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 4931218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_ObjCMessageReceiver, 493252779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor &ResultBuilder::IsObjCMessageReceiver); 49338e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 49348e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 49358e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor Results.EnterNewScope(); 49368071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 49378071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompleter->includeGlobals()); 49388e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 49398e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor // If we are in an Objective-C method inside a class that has a superclass, 49408e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor // add "super" as an option. 49418e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor if (ObjCMethodDecl *Method = getCurMethodDecl()) 49428e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor if (ObjCInterfaceDecl *Iface = Method->getClassInterface()) 494303d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (Iface->getSuperClass()) { 49448e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor Results.AddResult(Result("super")); 494503d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 494603d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor AddSuperSendCompletion(*this, /*NeedSuperKeyword=*/true, 0, 0, Results); 494703d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor } 49488e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 49498e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor Results.ExitScope(); 49508e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 49518e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor if (CodeCompleter->includeMacros()) 49528e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor AddMacroResults(PP, Results); 4953cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 4954e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(), Results.size()); 49558e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 49568e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor} 49578e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 49582725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregorvoid Sema::CodeCompleteObjCSuperMessage(Scope *S, SourceLocation SuperLoc, 4959d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor IdentifierInfo **SelIdents, 496070c5ac70ace21b011dc2d4001bae26cdcf62ff8dDouglas Gregor unsigned NumSelIdents, 496170c5ac70ace21b011dc2d4001bae26cdcf62ff8dDouglas Gregor bool AtArgumentExpression) { 496224a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor ObjCInterfaceDecl *CDecl = 0; 49632725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) { 49642725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // Figure out which interface we're in. 49652725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor CDecl = CurMethod->getClassInterface(); 49662725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (!CDecl) 49672725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor return; 49682725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor 49692725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // Find the superclass of this class. 49702725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor CDecl = CDecl->getSuperClass(); 49712725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (!CDecl) 49722725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor return; 497324a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor 49742725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (CurMethod->isInstanceMethod()) { 49752725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // We are inside an instance method, which means that the message 49762725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // send [super ...] is actually calling an instance method on the 49776b0656a7c386662e1bec5f23a3bd0bf2687a9635Douglas Gregor // current object. 49786b0656a7c386662e1bec5f23a3bd0bf2687a9635Douglas Gregor return CodeCompleteObjCInstanceMessage(S, 0, 497903d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor SelIdents, NumSelIdents, 498070c5ac70ace21b011dc2d4001bae26cdcf62ff8dDouglas Gregor AtArgumentExpression, 49816b0656a7c386662e1bec5f23a3bd0bf2687a9635Douglas Gregor CDecl); 49822725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor } 498324a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor 49842725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // Fall through to send to the superclass in CDecl. 49852725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor } else { 49862725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // "super" may be the name of a type or variable. Figure out which 49872725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // it is. 49882725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor IdentifierInfo *Super = &Context.Idents.get("super"); 49892725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor NamedDecl *ND = LookupSingleName(S, Super, SuperLoc, 49902725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor LookupOrdinaryName); 49912725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if ((CDecl = dyn_cast_or_null<ObjCInterfaceDecl>(ND))) { 49922725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // "super" names an interface. Use it. 49932725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor } else if (TypeDecl *TD = dyn_cast_or_null<TypeDecl>(ND)) { 4994c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (const ObjCObjectType *Iface 4995c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall = Context.getTypeDeclType(TD)->getAs<ObjCObjectType>()) 4996c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall CDecl = Iface->getInterface(); 49972725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor } else if (ND && isa<UnresolvedUsingTypenameDecl>(ND)) { 49982725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // "super" names an unresolved type; we can't be more specific. 49992725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor } else { 50002725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // Assume that "super" names some kind of value and parse that way. 50012725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor CXXScopeSpec SS; 5002e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara SourceLocation TemplateKWLoc; 50032725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor UnqualifiedId id; 50042725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor id.setIdentifier(Super, SuperLoc); 5005e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara ExprResult SuperExpr = ActOnIdExpression(S, SS, TemplateKWLoc, id, 5006e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara false, false); 50072725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor return CodeCompleteObjCInstanceMessage(S, (Expr *)SuperExpr.get(), 500870c5ac70ace21b011dc2d4001bae26cdcf62ff8dDouglas Gregor SelIdents, NumSelIdents, 500970c5ac70ace21b011dc2d4001bae26cdcf62ff8dDouglas Gregor AtArgumentExpression); 50102725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor } 501124a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor 50122725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // Fall through 501324a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor } 501424a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor 5015b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall ParsedType Receiver; 50162725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (CDecl) 5017b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall Receiver = ParsedType::make(Context.getObjCInterfaceType(CDecl)); 50182725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor return CodeCompleteObjCClassMessage(S, Receiver, SelIdents, 501970c5ac70ace21b011dc2d4001bae26cdcf62ff8dDouglas Gregor NumSelIdents, AtArgumentExpression, 502070c5ac70ace21b011dc2d4001bae26cdcf62ff8dDouglas Gregor /*IsSuper=*/true); 50212725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor} 50222725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor 5023b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor/// \brief Given a set of code-completion results for the argument of a message 5024b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor/// send, determine the preferred type (if any) for that argument expression. 5025b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregorstatic QualType getPreferredArgumentTypeForMessageSend(ResultBuilder &Results, 5026b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor unsigned NumSelIdents) { 5027b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor typedef CodeCompletionResult Result; 5028b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor ASTContext &Context = Results.getSema().Context; 5029b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor 5030b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor QualType PreferredType; 5031b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor unsigned BestPriority = CCP_Unlikely * 2; 5032b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor Result *ResultsData = Results.data(); 5033b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor for (unsigned I = 0, N = Results.size(); I != N; ++I) { 5034b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor Result &R = ResultsData[I]; 5035b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor if (R.Kind == Result::RK_Declaration && 5036b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor isa<ObjCMethodDecl>(R.Declaration)) { 5037b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor if (R.Priority <= BestPriority) { 5038b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor ObjCMethodDecl *Method = cast<ObjCMethodDecl>(R.Declaration); 5039b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor if (NumSelIdents <= Method->param_size()) { 5040b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor QualType MyPreferredType = Method->param_begin()[NumSelIdents - 1] 5041b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor ->getType(); 5042b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor if (R.Priority < BestPriority || PreferredType.isNull()) { 5043b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor BestPriority = R.Priority; 5044b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor PreferredType = MyPreferredType; 5045b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor } else if (!Context.hasSameUnqualifiedType(PreferredType, 5046b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor MyPreferredType)) { 5047b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor PreferredType = QualType(); 5048b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor } 5049b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor } 5050b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor } 5051b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor } 5052b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor } 5053b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor 5054b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor return PreferredType; 5055b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor} 5056b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor 5057c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregorstatic void AddClassMessageCompletions(Sema &SemaRef, Scope *S, 5058c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor ParsedType Receiver, 5059c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor IdentifierInfo **SelIdents, 5060c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor unsigned NumSelIdents, 506170c5ac70ace21b011dc2d4001bae26cdcf62ff8dDouglas Gregor bool AtArgumentExpression, 5062c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor bool IsSuper, 5063c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor ResultBuilder &Results) { 50640a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 50652725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor ObjCInterfaceDecl *CDecl = 0; 5066c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor 506724a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor // If the given name refers to an interface type, retrieve the 506824a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor // corresponding declaration. 50692725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (Receiver) { 5070c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor QualType T = SemaRef.GetTypeFromParser(Receiver, 0); 50712725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (!T.isNull()) 5072c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (const ObjCObjectType *Interface = T->getAs<ObjCObjectType>()) 5073c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall CDecl = Interface->getInterface(); 507424a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor } 5075c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor 507636ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add all of the factory methods in this Objective-C class, its protocols, 507736ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // superclasses, categories, implementation, etc. 5078c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff Results.EnterNewScope(); 5079c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor 508003d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor // If this is a send-to-super, try to add the special "super" send 508103d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor // completion. 508203d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (IsSuper) { 508303d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (ObjCMethodDecl *SuperMethod 5084c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor = AddSuperSendCompletion(SemaRef, false, SelIdents, NumSelIdents, 5085c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor Results)) 508603d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor Results.Ignore(SuperMethod); 508703d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor } 5088c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor 5089265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor // If we're inside an Objective-C method definition, prefer its selector to 5090265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor // others. 5091c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor if (ObjCMethodDecl *CurMethod = SemaRef.getCurMethodDecl()) 5092265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor Results.setPreferredSelector(CurMethod->getSelector()); 5093c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor 5094d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor VisitedSelectorSet Selectors; 509513438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor if (CDecl) 5096c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor AddObjCMethods(CDecl, false, MK_Any, SelIdents, NumSelIdents, 5097cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor SemaRef.CurContext, Selectors, AtArgumentExpression, 5098cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor Results); 50992725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor else { 510013438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor // We're messaging "id" as a type; provide all class/factory methods. 5101c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor 5102719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor // If we have an external source, load the entire class method 51033c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl // pool from the AST file. 5104c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor if (SemaRef.ExternalSource) { 5105c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor for (uint32_t I = 0, 5106c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor N = SemaRef.ExternalSource->GetNumExternalSelectors(); 510776bd1f387e6a7b7abfe53f63b3bd429b97bb80f0John McCall I != N; ++I) { 5108c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor Selector Sel = SemaRef.ExternalSource->GetExternalSelector(I); 5109c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor if (Sel.isNull() || SemaRef.MethodPool.count(Sel)) 5110719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor continue; 5111c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor 5112c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor SemaRef.ReadMethodPool(Sel); 5113719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor } 5114719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor } 5115c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor 5116c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor for (Sema::GlobalMethodPool::iterator M = SemaRef.MethodPool.begin(), 5117c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor MEnd = SemaRef.MethodPool.end(); 5118db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl M != MEnd; ++M) { 5119db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl for (ObjCMethodList *MethList = &M->second.second; 5120db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl MethList && MethList->Method; 512113438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor MethList = MethList->Next) { 512213438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor if (!isAcceptableObjCMethod(MethList->Method, MK_Any, SelIdents, 512313438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor NumSelIdents)) 512413438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor continue; 5125c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor 512613438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor Result R(MethList->Method, 0); 512713438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor R.StartParameter = NumSelIdents; 512813438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor R.AllParametersAreInformative = false; 5129c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor Results.MaybeAddResult(R, SemaRef.CurContext); 513013438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor } 513113438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor } 513213438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor } 5133c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor 5134c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor Results.ExitScope(); 5135c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor} 513613438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor 5137c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregorvoid Sema::CodeCompleteObjCClassMessage(Scope *S, ParsedType Receiver, 5138c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor IdentifierInfo **SelIdents, 5139c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor unsigned NumSelIdents, 514070c5ac70ace21b011dc2d4001bae26cdcf62ff8dDouglas Gregor bool AtArgumentExpression, 5141c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor bool IsSuper) { 5142e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor 5143e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor QualType T = this->GetTypeFromParser(Receiver); 5144e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor 5145218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5146e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor CodeCompletionContext(CodeCompletionContext::CCC_ObjCClassMessage, 51470a47d69af8bda945352997af3da4687a3356096aDouglas Gregor T, SelIdents, NumSelIdents)); 5148e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor 514970c5ac70ace21b011dc2d4001bae26cdcf62ff8dDouglas Gregor AddClassMessageCompletions(*this, S, Receiver, SelIdents, NumSelIdents, 515070c5ac70ace21b011dc2d4001bae26cdcf62ff8dDouglas Gregor AtArgumentExpression, IsSuper, Results); 5151b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor 5152b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor // If we're actually at the argument expression (rather than prior to the 5153b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor // selector), we're actually performing code completion for an expression. 5154b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor // Determine whether we have a single, best method. If so, we can 5155b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor // code-complete the expression using the corresponding parameter type as 5156b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor // our preferred type, improving completion results. 5157b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor if (AtArgumentExpression) { 5158b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor QualType PreferredType = getPreferredArgumentTypeForMessageSend(Results, 5159e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor NumSelIdents); 5160b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor if (PreferredType.isNull()) 5161b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor CodeCompleteOrdinaryName(S, PCC_Expression); 5162b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor else 5163b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor CodeCompleteExpression(S, PreferredType); 5164b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor return; 5165b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor } 5166b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor 5167e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 5168e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor Results.getCompletionContext(), 516903d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor Results.data(), Results.size()); 5170c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff} 5171c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff 5172f81e5a9e3f3ff80c56e4afb4fe6311a8735f36e8Richard Trieuvoid Sema::CodeCompleteObjCInstanceMessage(Scope *S, Expr *Receiver, 5173d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor IdentifierInfo **SelIdents, 517403d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor unsigned NumSelIdents, 517570c5ac70ace21b011dc2d4001bae26cdcf62ff8dDouglas Gregor bool AtArgumentExpression, 51766b0656a7c386662e1bec5f23a3bd0bf2687a9635Douglas Gregor ObjCInterfaceDecl *Super) { 51770a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 5178c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff 5179c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff Expr *RecExpr = static_cast<Expr *>(Receiver); 5180c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff 518136ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // If necessary, apply function/array conversion to the receiver. 518236ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // C99 6.7.5.3p[7,8]. 5183429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley if (RecExpr) { 5184429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley ExprResult Conv = DefaultFunctionArrayLvalueConversion(RecExpr); 5185429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley if (Conv.isInvalid()) // conversion failed. bail. 5186429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley return; 5187429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley RecExpr = Conv.take(); 5188429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley } 51896b0656a7c386662e1bec5f23a3bd0bf2687a9635Douglas Gregor QualType ReceiverType = RecExpr? RecExpr->getType() 51906b0656a7c386662e1bec5f23a3bd0bf2687a9635Douglas Gregor : Super? Context.getObjCObjectPointerType( 51916b0656a7c386662e1bec5f23a3bd0bf2687a9635Douglas Gregor Context.getObjCInterfaceType(Super)) 51926b0656a7c386662e1bec5f23a3bd0bf2687a9635Douglas Gregor : Context.getObjCIdType(); 5193c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff 5194da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor // If we're messaging an expression with type "id" or "Class", check 5195da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor // whether we know something special about the receiver that allows 5196da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor // us to assume a more-specific receiver type. 5197da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor if (ReceiverType->isObjCIdType() || ReceiverType->isObjCClassType()) 5198da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor if (ObjCInterfaceDecl *IFace = GetAssumedMessageSendExprType(RecExpr)) { 5199da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor if (ReceiverType->isObjCClassType()) 5200da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor return CodeCompleteObjCClassMessage(S, 5201da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor ParsedType::make(Context.getObjCInterfaceType(IFace)), 5202da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor SelIdents, NumSelIdents, 5203da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor AtArgumentExpression, Super); 5204da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor 5205da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor ReceiverType = Context.getObjCObjectPointerType( 5206da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor Context.getObjCInterfaceType(IFace)); 5207da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor } 5208da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor 520936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Build the set of methods we can see. 5210218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5211e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor CodeCompletionContext(CodeCompletionContext::CCC_ObjCInstanceMessage, 52120a47d69af8bda945352997af3da4687a3356096aDouglas Gregor ReceiverType, SelIdents, NumSelIdents)); 5213e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor 521436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor Results.EnterNewScope(); 521522f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor 521603d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor // If this is a send-to-super, try to add the special "super" send 521703d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor // completion. 52186b0656a7c386662e1bec5f23a3bd0bf2687a9635Douglas Gregor if (Super) { 521903d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (ObjCMethodDecl *SuperMethod 522003d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor = AddSuperSendCompletion(*this, false, SelIdents, NumSelIdents, 522103d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor Results)) 522203d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor Results.Ignore(SuperMethod); 522303d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor } 522403d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 5225265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor // If we're inside an Objective-C method definition, prefer its selector to 5226265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor // others. 5227265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) 5228265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor Results.setPreferredSelector(CurMethod->getSelector()); 522936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 5230d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor // Keep track of the selectors we've already added. 5231d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor VisitedSelectorSet Selectors; 5232d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor 5233f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // Handle messages to Class. This really isn't a message to an instance 5234f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // method, so we treat it the same way we would treat a message send to a 5235f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // class method. 5236f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor if (ReceiverType->isObjCClassType() || 5237f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor ReceiverType->isObjCQualifiedClassType()) { 5238f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) { 5239f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor if (ObjCInterfaceDecl *ClassDecl = CurMethod->getClassInterface()) 52404ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(ClassDecl, false, MK_Any, SelIdents, NumSelIdents, 5241cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor CurContext, Selectors, AtArgumentExpression, Results); 5242f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor } 5243f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor } 5244f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // Handle messages to a qualified ID ("id<foo>"). 5245f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor else if (const ObjCObjectPointerType *QualID 5246f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor = ReceiverType->getAsObjCQualifiedIdType()) { 5247f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // Search protocols for instance methods. 5248f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor for (ObjCObjectPointerType::qual_iterator I = QualID->qual_begin(), 5249f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor E = QualID->qual_end(); 5250f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor I != E; ++I) 52514ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(*I, true, MK_Any, SelIdents, NumSelIdents, CurContext, 5252cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor Selectors, AtArgumentExpression, Results); 5253f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor } 5254f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // Handle messages to a pointer to interface type. 5255f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor else if (const ObjCObjectPointerType *IFacePtr 5256f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor = ReceiverType->getAsObjCInterfacePointerType()) { 5257f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // Search the class, its superclasses, etc., for instance methods. 52584ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(IFacePtr->getInterfaceDecl(), true, MK_Any, SelIdents, 5259cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor NumSelIdents, CurContext, Selectors, AtArgumentExpression, 5260cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor Results); 5261f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor 5262f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // Search protocols for instance methods. 5263f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor for (ObjCObjectPointerType::qual_iterator I = IFacePtr->qual_begin(), 5264f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor E = IFacePtr->qual_end(); 5265f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor I != E; ++I) 52664ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(*I, true, MK_Any, SelIdents, NumSelIdents, CurContext, 5267cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor Selectors, AtArgumentExpression, Results); 5268f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor } 526913438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor // Handle messages to "id". 527013438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor else if (ReceiverType->isObjCIdType()) { 5271719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor // We're messaging "id", so provide all instance methods we know 5272719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor // about as code-completion results. 5273719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor 5274719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor // If we have an external source, load the entire class method 52753c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl // pool from the AST file. 5276719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor if (ExternalSource) { 527776bd1f387e6a7b7abfe53f63b3bd429b97bb80f0John McCall for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors(); 527876bd1f387e6a7b7abfe53f63b3bd429b97bb80f0John McCall I != N; ++I) { 527976bd1f387e6a7b7abfe53f63b3bd429b97bb80f0John McCall Selector Sel = ExternalSource->GetExternalSelector(I); 5280db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl if (Sel.isNull() || MethodPool.count(Sel)) 5281719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor continue; 5282719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor 5283db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl ReadMethodPool(Sel); 5284719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor } 5285719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor } 5286719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor 5287db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl for (GlobalMethodPool::iterator M = MethodPool.begin(), 5288db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl MEnd = MethodPool.end(); 5289db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl M != MEnd; ++M) { 5290db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl for (ObjCMethodList *MethList = &M->second.first; 5291db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl MethList && MethList->Method; 529213438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor MethList = MethList->Next) { 529313438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor if (!isAcceptableObjCMethod(MethList->Method, MK_Any, SelIdents, 529413438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor NumSelIdents)) 529513438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor continue; 5296d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor 5297d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor if (!Selectors.insert(MethList->Method->getSelector())) 5298d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor continue; 5299d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor 530013438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor Result R(MethList->Method, 0); 530113438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor R.StartParameter = NumSelIdents; 530213438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor R.AllParametersAreInformative = false; 530313438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor Results.MaybeAddResult(R, CurContext); 530413438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor } 530513438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor } 530613438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor } 5307f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor Results.ExitScope(); 5308b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor 5309b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor 5310b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor // If we're actually at the argument expression (rather than prior to the 5311b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor // selector), we're actually performing code completion for an expression. 5312b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor // Determine whether we have a single, best method. If so, we can 5313b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor // code-complete the expression using the corresponding parameter type as 5314b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor // our preferred type, improving completion results. 5315b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor if (AtArgumentExpression) { 5316b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor QualType PreferredType = getPreferredArgumentTypeForMessageSend(Results, 5317b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor NumSelIdents); 5318b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor if (PreferredType.isNull()) 5319b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor CodeCompleteOrdinaryName(S, PCC_Expression); 5320b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor else 5321b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor CodeCompleteExpression(S, PreferredType); 5322b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor return; 5323b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor } 5324b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor 5325e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 5326e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor Results.getCompletionContext(), 5327e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 5328c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff} 532955385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor 5330fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregorvoid Sema::CodeCompleteObjCForCollection(Scope *S, 5331fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor DeclGroupPtrTy IterationVar) { 5332fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor CodeCompleteExpressionData Data; 5333fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor Data.ObjCCollection = true; 5334fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor 5335fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor if (IterationVar.getAsOpaquePtr()) { 5336fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor DeclGroupRef DG = IterationVar.getAsVal<DeclGroupRef>(); 5337fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor for (DeclGroupRef::iterator I = DG.begin(), End = DG.end(); I != End; ++I) { 5338fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor if (*I) 5339fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor Data.IgnoreDecls.push_back(*I); 5340fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor } 5341fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor } 5342fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor 5343fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor CodeCompleteExpression(S, Data); 5344fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor} 5345fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor 5346458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregorvoid Sema::CodeCompleteObjCSelector(Scope *S, IdentifierInfo **SelIdents, 5347458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor unsigned NumSelIdents) { 5348458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor // If we have an external source, load the entire class method 5349458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor // pool from the AST file. 5350458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor if (ExternalSource) { 5351458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors(); 5352458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor I != N; ++I) { 5353458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor Selector Sel = ExternalSource->GetExternalSelector(I); 5354458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor if (Sel.isNull() || MethodPool.count(Sel)) 5355458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor continue; 5356458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor 5357458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor ReadMethodPool(Sel); 5358458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor } 5359458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor } 5360458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor 5361218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5362218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_SelectorName); 5363458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor Results.EnterNewScope(); 5364458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor for (GlobalMethodPool::iterator M = MethodPool.begin(), 5365458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor MEnd = MethodPool.end(); 5366458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor M != MEnd; ++M) { 5367458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor 5368458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor Selector Sel = M->first; 5369458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor if (!isAcceptableObjCSelector(Sel, MK_Any, SelIdents, NumSelIdents)) 5370458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor continue; 5371458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor 5372218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder Builder(Results.getAllocator()); 5373458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor if (Sel.isUnarySelector()) { 5374dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddTypedTextChunk(Builder.getAllocator().CopyString( 5375813d8346529bf094eb2b249648906ba7fd226688Douglas Gregor Sel.getNameForSlot(0))); 5376218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 5377458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor continue; 5378458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor } 5379458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor 53802d9e21f4675232a39a39611a5b4bb1f4914b2742Douglas Gregor std::string Accumulator; 5381458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor for (unsigned I = 0, N = Sel.getNumArgs(); I != N; ++I) { 53822d9e21f4675232a39a39611a5b4bb1f4914b2742Douglas Gregor if (I == NumSelIdents) { 53832d9e21f4675232a39a39611a5b4bb1f4914b2742Douglas Gregor if (!Accumulator.empty()) { 5384dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddInformativeChunk(Builder.getAllocator().CopyString( 5385218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Accumulator)); 53862d9e21f4675232a39a39611a5b4bb1f4914b2742Douglas Gregor Accumulator.clear(); 53872d9e21f4675232a39a39611a5b4bb1f4914b2742Douglas Gregor } 53882d9e21f4675232a39a39611a5b4bb1f4914b2742Douglas Gregor } 53892d9e21f4675232a39a39611a5b4bb1f4914b2742Douglas Gregor 5390a0651c5f5d1c8928d3ae062435ed9cf0aa0d04baBenjamin Kramer Accumulator += Sel.getNameForSlot(I); 53912d9e21f4675232a39a39611a5b4bb1f4914b2742Douglas Gregor Accumulator += ':'; 5392458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor } 5393dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddTypedTextChunk(Builder.getAllocator().CopyString( Accumulator)); 5394218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 5395458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor } 5396458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor Results.ExitScope(); 5397458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor 5398458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 5399458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor CodeCompletionContext::CCC_SelectorName, 5400458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor Results.data(), Results.size()); 5401458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor} 5402458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor 540355385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor/// \brief Add all of the protocol declarations that we find in the given 540455385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor/// (translation unit) context. 540555385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregorstatic void AddProtocolResults(DeclContext *Ctx, DeclContext *CurContext, 5406083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor bool OnlyForwardDeclarations, 540755385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor ResultBuilder &Results) { 54080a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 540955385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor 541055385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor for (DeclContext::decl_iterator D = Ctx->decls_begin(), 541155385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor DEnd = Ctx->decls_end(); 541255385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor D != DEnd; ++D) { 541355385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor // Record any protocols we find. 541455385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor if (ObjCProtocolDecl *Proto = dyn_cast<ObjCProtocolDecl>(*D)) 54155e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor if (!OnlyForwardDeclarations || !Proto->hasDefinition()) 5416608300be1972c43fe99154d25d62d697e7c0a0c2Douglas Gregor Results.AddResult(Result(Proto, 0), CurContext, 0, false); 541755385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor } 541855385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor} 541955385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor 542055385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregorvoid Sema::CodeCompleteObjCProtocolReferences(IdentifierLocPair *Protocols, 542155385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor unsigned NumProtocols) { 5422218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5423218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_ObjCProtocolName); 542455385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor 542570c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor if (CodeCompleter && CodeCompleter->includeGlobals()) { 542670c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor Results.EnterNewScope(); 542770c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor 542870c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor // Tell the result set to ignore all of the protocols we have 542970c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor // already seen. 543070c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor // FIXME: This doesn't work when caching code-completion results. 543170c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor for (unsigned I = 0; I != NumProtocols; ++I) 543270c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor if (ObjCProtocolDecl *Protocol = LookupProtocol(Protocols[I].first, 543370c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor Protocols[I].second)) 543470c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor Results.Ignore(Protocol); 543570c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor 543670c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor // Add all protocols. 543770c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor AddProtocolResults(Context.getTranslationUnitDecl(), CurContext, false, 543870c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor Results); 5439083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor 544070c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor Results.ExitScope(); 544170c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor } 544270c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor 5443e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 5444e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_ObjCProtocolName, 5445e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 5446083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor} 5447083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor 5448083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregorvoid Sema::CodeCompleteObjCProtocolDecl(Scope *) { 5449218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5450218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_ObjCProtocolName); 5451083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor 545270c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor if (CodeCompleter && CodeCompleter->includeGlobals()) { 545370c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor Results.EnterNewScope(); 545470c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor 545570c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor // Add all protocols. 545670c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor AddProtocolResults(Context.getTranslationUnitDecl(), CurContext, true, 545770c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor Results); 545855385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor 545970c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor Results.ExitScope(); 546070c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor } 546170c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor 5462e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 5463e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_ObjCProtocolName, 5464e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 546555385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor} 54663b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 54673b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor/// \brief Add all of the Objective-C interface declarations that we find in 54683b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor/// the given (translation unit) context. 54693b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregorstatic void AddInterfaceResults(DeclContext *Ctx, DeclContext *CurContext, 54703b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor bool OnlyForwardDeclarations, 54713b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor bool OnlyUnimplemented, 54723b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor ResultBuilder &Results) { 54730a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 54743b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 54753b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor for (DeclContext::decl_iterator D = Ctx->decls_begin(), 54763b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor DEnd = Ctx->decls_end(); 54773b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor D != DEnd; ++D) { 5478deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor // Record any interfaces we find. 5479deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor if (ObjCInterfaceDecl *Class = dyn_cast<ObjCInterfaceDecl>(*D)) 54807723fec9b45b7258c0eddf4cbfd0d335348f5edcDouglas Gregor if ((!OnlyForwardDeclarations || !Class->hasDefinition()) && 5481deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor (!OnlyUnimplemented || !Class->getImplementation())) 5482deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor Results.AddResult(Result(Class, 0), CurContext, 0, false); 54833b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor } 54843b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor} 54853b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 54863b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregorvoid Sema::CodeCompleteObjCInterfaceDecl(Scope *S) { 5487218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5488218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 54893b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.EnterNewScope(); 54903b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 54910f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor if (CodeCompleter->includeGlobals()) { 54920f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor // Add all classes. 54930f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false, 54940f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor false, Results); 54950f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor } 54960f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor 54973b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.ExitScope(); 54980f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor 5499e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 55000f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor CodeCompletionContext::CCC_ObjCInterfaceName, 5501e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 55023b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor} 55033b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 5504c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregorvoid Sema::CodeCompleteObjCSuperclass(Scope *S, IdentifierInfo *ClassName, 5505c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor SourceLocation ClassNameLoc) { 5506218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 55070f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor CodeCompletionContext::CCC_ObjCInterfaceName); 55083b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.EnterNewScope(); 55093b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 55103b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor // Make sure that we ignore the class we're currently defining. 55113b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor NamedDecl *CurClass 5512c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor = LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName); 551333ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor if (CurClass && isa<ObjCInterfaceDecl>(CurClass)) 55143b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.Ignore(CurClass); 55153b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 55160f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor if (CodeCompleter->includeGlobals()) { 55170f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor // Add all classes. 55180f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false, 55190f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor false, Results); 55200f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor } 55210f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor 55223b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.ExitScope(); 55230f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor 5524e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 55250f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor CodeCompletionContext::CCC_ObjCInterfaceName, 5526e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 55273b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor} 55283b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 55293b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregorvoid Sema::CodeCompleteObjCImplementationDecl(Scope *S) { 5530218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5531218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 55323b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.EnterNewScope(); 55333b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 55340f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor if (CodeCompleter->includeGlobals()) { 55350f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor // Add all unimplemented classes. 55360f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false, 55370f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor true, Results); 55380f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor } 55390f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor 55403b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.ExitScope(); 55410f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor 5542e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 55430f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor CodeCompletionContext::CCC_ObjCInterfaceName, 5544e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 55453b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor} 554633ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 554733ced0b8550f3e7169f326944731ee02e9338659Douglas Gregorvoid Sema::CodeCompleteObjCInterfaceCategory(Scope *S, 5548c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor IdentifierInfo *ClassName, 5549c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor SourceLocation ClassNameLoc) { 55500a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 555133ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 5552218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 55533da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CodeCompletionContext::CCC_ObjCCategoryName); 555433ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 555533ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // Ignore any categories we find that have already been implemented by this 555633ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // interface. 555733ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor llvm::SmallPtrSet<IdentifierInfo *, 16> CategoryNames; 555833ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor NamedDecl *CurClass 5559c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor = LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName); 556033ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor if (ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurClass)) 556133ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor for (ObjCCategoryDecl *Category = Class->getCategoryList(); Category; 556233ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Category = Category->getNextClassCategory()) 556333ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor CategoryNames.insert(Category->getIdentifier()); 556433ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 556533ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // Add all of the categories we know about. 556633ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Results.EnterNewScope(); 556733ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor TranslationUnitDecl *TU = Context.getTranslationUnitDecl(); 556833ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor for (DeclContext::decl_iterator D = TU->decls_begin(), 556933ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor DEnd = TU->decls_end(); 557033ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor D != DEnd; ++D) 557133ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(*D)) 557233ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor if (CategoryNames.insert(Category->getIdentifier())) 5573608300be1972c43fe99154d25d62d697e7c0a0c2Douglas Gregor Results.AddResult(Result(Category, 0), CurContext, 0, false); 557433ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Results.ExitScope(); 557533ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 5576e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 55773da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CodeCompletionContext::CCC_ObjCCategoryName, 5578e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 557933ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor} 558033ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 558133ced0b8550f3e7169f326944731ee02e9338659Douglas Gregorvoid Sema::CodeCompleteObjCImplementationCategory(Scope *S, 5582c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor IdentifierInfo *ClassName, 5583c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor SourceLocation ClassNameLoc) { 55840a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 558533ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 558633ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // Find the corresponding interface. If we couldn't find the interface, the 558733ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // program itself is ill-formed. However, we'll try to be helpful still by 558833ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // providing the list of all of the categories we know about. 558933ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor NamedDecl *CurClass 5590c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor = LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName); 559133ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurClass); 559233ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor if (!Class) 5593c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor return CodeCompleteObjCInterfaceCategory(S, ClassName, ClassNameLoc); 559433ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 5595218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 55963da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CodeCompletionContext::CCC_ObjCCategoryName); 559733ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 559833ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // Add all of the categories that have have corresponding interface 559933ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // declarations in this class and any of its superclasses, except for 560033ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // already-implemented categories in the class itself. 560133ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor llvm::SmallPtrSet<IdentifierInfo *, 16> CategoryNames; 560233ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Results.EnterNewScope(); 560333ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor bool IgnoreImplemented = true; 560433ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor while (Class) { 560533ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor for (ObjCCategoryDecl *Category = Class->getCategoryList(); Category; 560633ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Category = Category->getNextClassCategory()) 560733ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor if ((!IgnoreImplemented || !Category->getImplementation()) && 560833ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor CategoryNames.insert(Category->getIdentifier())) 5609608300be1972c43fe99154d25d62d697e7c0a0c2Douglas Gregor Results.AddResult(Result(Category, 0), CurContext, 0, false); 561033ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 561133ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Class = Class->getSuperClass(); 561233ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor IgnoreImplemented = false; 561333ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor } 561433ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Results.ExitScope(); 561533ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 5616e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 56173da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CodeCompletionContext::CCC_ObjCCategoryName, 5618e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 561933ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor} 5620322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 5621a28948f34817476d02412fa204cae038e228c827Fariborz Jahanianvoid Sema::CodeCompleteObjCPropertyDefinition(Scope *S) { 56220a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 5623218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5624218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 5625322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 5626322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Figure out where this @synthesize lives. 5627322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor ObjCContainerDecl *Container 5628a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian = dyn_cast_or_null<ObjCContainerDecl>(CurContext); 5629322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor if (!Container || 5630322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor (!isa<ObjCImplementationDecl>(Container) && 5631322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor !isa<ObjCCategoryImplDecl>(Container))) 5632322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor return; 5633322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 5634322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Ignore any properties that have already been implemented. 5635322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor for (DeclContext::decl_iterator D = Container->decls_begin(), 5636322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor DEnd = Container->decls_end(); 5637322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor D != DEnd; ++D) 5638322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor if (ObjCPropertyImplDecl *PropertyImpl = dyn_cast<ObjCPropertyImplDecl>(*D)) 5639322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Results.Ignore(PropertyImpl->getPropertyDecl()); 5640322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 5641322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Add any properties that we find. 56427344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor AddedPropertiesSet AddedProperties; 5643322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Results.EnterNewScope(); 5644322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor if (ObjCImplementationDecl *ClassImpl 5645322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor = dyn_cast<ObjCImplementationDecl>(Container)) 56464b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddObjCProperties(ClassImpl->getClassInterface(), false, 56474b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor /*AllowNullaryMethods=*/false, CurContext, 56487344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor AddedProperties, Results); 5649322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor else 5650322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor AddObjCProperties(cast<ObjCCategoryImplDecl>(Container)->getCategoryDecl(), 56514b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor false, /*AllowNullaryMethods=*/false, CurContext, 56524b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddedProperties, Results); 5653322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Results.ExitScope(); 5654322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 5655e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 5656e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 5657e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 5658322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor} 5659322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 5660322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregorvoid Sema::CodeCompleteObjCPropertySynthesizeIvar(Scope *S, 5661a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian IdentifierInfo *PropertyName) { 56620a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 5663218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5664218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 5665322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 5666322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Figure out where this @synthesize lives. 5667322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor ObjCContainerDecl *Container 5668a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian = dyn_cast_or_null<ObjCContainerDecl>(CurContext); 5669322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor if (!Container || 5670322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor (!isa<ObjCImplementationDecl>(Container) && 5671322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor !isa<ObjCCategoryImplDecl>(Container))) 5672322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor return; 5673322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 5674322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Figure out which interface we're looking into. 5675322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor ObjCInterfaceDecl *Class = 0; 5676322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor if (ObjCImplementationDecl *ClassImpl 5677322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor = dyn_cast<ObjCImplementationDecl>(Container)) 5678322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Class = ClassImpl->getClassInterface(); 5679322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor else 5680322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Class = cast<ObjCCategoryImplDecl>(Container)->getCategoryDecl() 5681322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor ->getClassInterface(); 5682322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 5683e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor // Determine the type of the property we're synthesizing. 5684e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor QualType PropertyType = Context.getObjCIdType(); 5685e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor if (Class) { 5686e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor if (ObjCPropertyDecl *Property 5687e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor = Class->FindPropertyDeclaration(PropertyName)) { 5688e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor PropertyType 5689e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor = Property->getType().getNonReferenceType().getUnqualifiedType(); 5690e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor 5691e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor // Give preference to ivars 5692e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor Results.setPreferredType(PropertyType); 5693e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor } 5694e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor } 5695e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor 5696322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Add all of the instance variables in this class and its superclasses. 5697322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Results.EnterNewScope(); 5698aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor bool SawSimilarlyNamedIvar = false; 5699aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor std::string NameWithPrefix; 5700aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor NameWithPrefix += '_'; 5701a0651c5f5d1c8928d3ae062435ed9cf0aa0d04baBenjamin Kramer NameWithPrefix += PropertyName->getName(); 5702aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor std::string NameWithSuffix = PropertyName->getName().str(); 5703aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor NameWithSuffix += '_'; 5704322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor for(; Class; Class = Class->getSuperClass()) { 5705aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor for (ObjCIvarDecl *Ivar = Class->all_declared_ivar_begin(); Ivar; 5706aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor Ivar = Ivar->getNextIvar()) { 5707e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor Results.AddResult(Result(Ivar, 0), CurContext, 0, false); 5708e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor 5709aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor // Determine whether we've seen an ivar with a name similar to the 5710aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor // property. 5711e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor if ((PropertyName == Ivar->getIdentifier() || 5712aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor NameWithPrefix == Ivar->getName() || 5713e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor NameWithSuffix == Ivar->getName())) { 5714aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor SawSimilarlyNamedIvar = true; 5715e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor 5716e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor // Reduce the priority of this result by one, to give it a slight 5717e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor // advantage over other results whose names don't match so closely. 5718e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor if (Results.size() && 5719e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor Results.data()[Results.size() - 1].Kind 5720e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor == CodeCompletionResult::RK_Declaration && 5721e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor Results.data()[Results.size() - 1].Declaration == Ivar) 5722e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor Results.data()[Results.size() - 1].Priority--; 5723e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor } 5724aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor } 5725322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor } 5726aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor 5727aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor if (!SawSimilarlyNamedIvar) { 5728aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor // Create ivar result _propName, that the user can use to synthesize 5729e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor // an ivar of the appropriate type. 5730e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor unsigned Priority = CCP_MemberDeclaration + 1; 5731aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor typedef CodeCompletionResult Result; 5732aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor CodeCompletionAllocator &Allocator = Results.getAllocator(); 5733aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor CodeCompletionBuilder Builder(Allocator, Priority,CXAvailability_Available); 5734aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor 57358987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor PrintingPolicy Policy = getCompletionPrintingPolicy(*this); 5736e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor Builder.AddResultTypeChunk(GetCompletionTypeString(PropertyType, Context, 57378987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor Policy, Allocator)); 5738aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(NameWithPrefix)); 5739aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor Results.AddResult(Result(Builder.TakeString(), Priority, 5740aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor CXCursor_ObjCIvarDecl)); 5741aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor } 5742aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor 5743322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Results.ExitScope(); 5744322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 5745e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 5746e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 5747e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 5748322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor} 5749e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 5750408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor// Mapping from selectors to the methods that implement that selector, along 5751408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor// with the "in original class" flag. 5752408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregortypedef llvm::DenseMap<Selector, std::pair<ObjCMethodDecl *, bool> > 5753408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor KnownMethodsMap; 5754e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 5755e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor/// \brief Find all of the methods that reside in the given container 5756e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor/// (and its superclasses, protocols, etc.) that meet the given 5757e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor/// criteria. Insert those methods into the map of known methods, 5758e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor/// indexed by selector so they can be easily found. 5759e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregorstatic void FindImplementableMethods(ASTContext &Context, 5760e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor ObjCContainerDecl *Container, 5761e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor bool WantInstanceMethods, 5762e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor QualType ReturnType, 5763408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor KnownMethodsMap &KnownMethods, 5764408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor bool InOriginalClass = true) { 5765e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container)) { 5766e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Recurse into protocols. 57672e5c15be82f362611c5928ce853d0685ff98c766Douglas Gregor if (!IFace->hasDefinition()) 57682e5c15be82f362611c5928ce853d0685ff98c766Douglas Gregor return; 57692e5c15be82f362611c5928ce853d0685ff98c766Douglas Gregor 5770e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor const ObjCList<ObjCProtocolDecl> &Protocols 5771e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor = IFace->getReferencedProtocols(); 5772e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 5773ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor E = Protocols.end(); 5774e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor I != E; ++I) 5775e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType, 5776ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor KnownMethods, InOriginalClass); 5777e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 5778ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor // Add methods from any class extensions and categories. 5779ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor for (const ObjCCategoryDecl *Cat = IFace->getCategoryList(); Cat; 5780ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor Cat = Cat->getNextClassCategory()) 578180aa1cd7973561889e51c1c152c8990a8de9c953Fariborz Jahanian FindImplementableMethods(Context, const_cast<ObjCCategoryDecl*>(Cat), 578280aa1cd7973561889e51c1c152c8990a8de9c953Fariborz Jahanian WantInstanceMethods, ReturnType, 5783ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor KnownMethods, false); 5784ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor 5785ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor // Visit the superclass. 5786ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor if (IFace->getSuperClass()) 5787ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor FindImplementableMethods(Context, IFace->getSuperClass(), 5788ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor WantInstanceMethods, ReturnType, 5789ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor KnownMethods, false); 5790e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 5791e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 5792e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(Container)) { 5793e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Recurse into protocols. 5794e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor const ObjCList<ObjCProtocolDecl> &Protocols 5795e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor = Category->getReferencedProtocols(); 5796e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 5797ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor E = Protocols.end(); 5798e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor I != E; ++I) 5799e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType, 5800ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor KnownMethods, InOriginalClass); 5801ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor 5802ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor // If this category is the original class, jump to the interface. 5803ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor if (InOriginalClass && Category->getClassInterface()) 5804ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor FindImplementableMethods(Context, Category->getClassInterface(), 5805ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor WantInstanceMethods, ReturnType, KnownMethods, 5806ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor false); 5807e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 5808e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 5809e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) { 58105e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor if (Protocol->hasDefinition()) { 58115e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor // Recurse into protocols. 58125e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor const ObjCList<ObjCProtocolDecl> &Protocols 58135e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor = Protocol->getReferencedProtocols(); 58145e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 58155e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor E = Protocols.end(); 58165e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor I != E; ++I) 58175e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType, 58185e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor KnownMethods, false); 58195e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor } 5820e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 5821e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 5822e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Add methods in this container. This operation occurs last because 5823e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // we want the methods from this container to override any methods 5824e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // we've previously seen with the same selector. 5825e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor for (ObjCContainerDecl::method_iterator M = Container->meth_begin(), 5826e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor MEnd = Container->meth_end(); 5827e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor M != MEnd; ++M) { 5828e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if ((*M)->isInstanceMethod() == WantInstanceMethods) { 5829e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (!ReturnType.isNull() && 5830e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor !Context.hasSameUnqualifiedType(ReturnType, (*M)->getResultType())) 5831e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor continue; 5832e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 5833408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor KnownMethods[(*M)->getSelector()] = std::make_pair(*M, InOriginalClass); 5834e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 5835e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 5836e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor} 5837e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 5838577cdfdb20840350e841a483df630237326126d5Douglas Gregor/// \brief Add the parenthesized return or parameter type chunk to a code 5839577cdfdb20840350e841a483df630237326126d5Douglas Gregor/// completion string. 5840577cdfdb20840350e841a483df630237326126d5Douglas Gregorstatic void AddObjCPassingTypeChunk(QualType Type, 5841577cdfdb20840350e841a483df630237326126d5Douglas Gregor ASTContext &Context, 58428987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor const PrintingPolicy &Policy, 5843577cdfdb20840350e841a483df630237326126d5Douglas Gregor CodeCompletionBuilder &Builder) { 5844577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 58458987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor Builder.AddTextChunk(GetCompletionTypeString(Type, Context, Policy, 5846577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.getAllocator())); 5847577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 5848577cdfdb20840350e841a483df630237326126d5Douglas Gregor} 5849577cdfdb20840350e841a483df630237326126d5Douglas Gregor 5850577cdfdb20840350e841a483df630237326126d5Douglas Gregor/// \brief Determine whether the given class is or inherits from a class by 5851577cdfdb20840350e841a483df630237326126d5Douglas Gregor/// the given name. 5852577cdfdb20840350e841a483df630237326126d5Douglas Gregorstatic bool InheritsFromClassNamed(ObjCInterfaceDecl *Class, 58535f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef Name) { 5854577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (!Class) 5855577cdfdb20840350e841a483df630237326126d5Douglas Gregor return false; 5856577cdfdb20840350e841a483df630237326126d5Douglas Gregor 5857577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (Class->getIdentifier() && Class->getIdentifier()->getName() == Name) 5858577cdfdb20840350e841a483df630237326126d5Douglas Gregor return true; 5859577cdfdb20840350e841a483df630237326126d5Douglas Gregor 5860577cdfdb20840350e841a483df630237326126d5Douglas Gregor return InheritsFromClassNamed(Class->getSuperClass(), Name); 5861577cdfdb20840350e841a483df630237326126d5Douglas Gregor} 5862577cdfdb20840350e841a483df630237326126d5Douglas Gregor 5863577cdfdb20840350e841a483df630237326126d5Douglas Gregor/// \brief Add code completions for Objective-C Key-Value Coding (KVC) and 5864577cdfdb20840350e841a483df630237326126d5Douglas Gregor/// Key-Value Observing (KVO). 5865577cdfdb20840350e841a483df630237326126d5Douglas Gregorstatic void AddObjCKeyValueCompletions(ObjCPropertyDecl *Property, 5866577cdfdb20840350e841a483df630237326126d5Douglas Gregor bool IsInstanceMethod, 5867577cdfdb20840350e841a483df630237326126d5Douglas Gregor QualType ReturnType, 5868577cdfdb20840350e841a483df630237326126d5Douglas Gregor ASTContext &Context, 5869e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor VisitedSelectorSet &KnownSelectors, 5870577cdfdb20840350e841a483df630237326126d5Douglas Gregor ResultBuilder &Results) { 5871577cdfdb20840350e841a483df630237326126d5Douglas Gregor IdentifierInfo *PropName = Property->getIdentifier(); 5872577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (!PropName || PropName->getLength() == 0) 5873577cdfdb20840350e841a483df630237326126d5Douglas Gregor return; 5874577cdfdb20840350e841a483df630237326126d5Douglas Gregor 58758987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor PrintingPolicy Policy = getCompletionPrintingPolicy(Results.getSema()); 58768987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor 5877577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Builder that will create each code completion. 5878577cdfdb20840350e841a483df630237326126d5Douglas Gregor typedef CodeCompletionResult Result; 5879577cdfdb20840350e841a483df630237326126d5Douglas Gregor CodeCompletionAllocator &Allocator = Results.getAllocator(); 5880577cdfdb20840350e841a483df630237326126d5Douglas Gregor CodeCompletionBuilder Builder(Allocator); 5881577cdfdb20840350e841a483df630237326126d5Douglas Gregor 5882577cdfdb20840350e841a483df630237326126d5Douglas Gregor // The selector table. 5883577cdfdb20840350e841a483df630237326126d5Douglas Gregor SelectorTable &Selectors = Context.Selectors; 5884577cdfdb20840350e841a483df630237326126d5Douglas Gregor 5885577cdfdb20840350e841a483df630237326126d5Douglas Gregor // The property name, copied into the code completion allocation region 5886577cdfdb20840350e841a483df630237326126d5Douglas Gregor // on demand. 5887577cdfdb20840350e841a483df630237326126d5Douglas Gregor struct KeyHolder { 5888577cdfdb20840350e841a483df630237326126d5Douglas Gregor CodeCompletionAllocator &Allocator; 58895f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef Key; 5890577cdfdb20840350e841a483df630237326126d5Douglas Gregor const char *CopiedKey; 5891577cdfdb20840350e841a483df630237326126d5Douglas Gregor 58925f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner KeyHolder(CodeCompletionAllocator &Allocator, StringRef Key) 5893577cdfdb20840350e841a483df630237326126d5Douglas Gregor : Allocator(Allocator), Key(Key), CopiedKey(0) { } 5894577cdfdb20840350e841a483df630237326126d5Douglas Gregor 5895577cdfdb20840350e841a483df630237326126d5Douglas Gregor operator const char *() { 5896577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (CopiedKey) 5897577cdfdb20840350e841a483df630237326126d5Douglas Gregor return CopiedKey; 5898577cdfdb20840350e841a483df630237326126d5Douglas Gregor 5899577cdfdb20840350e841a483df630237326126d5Douglas Gregor return CopiedKey = Allocator.CopyString(Key); 5900577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 5901577cdfdb20840350e841a483df630237326126d5Douglas Gregor } Key(Allocator, PropName->getName()); 5902577cdfdb20840350e841a483df630237326126d5Douglas Gregor 5903577cdfdb20840350e841a483df630237326126d5Douglas Gregor // The uppercased name of the property name. 5904577cdfdb20840350e841a483df630237326126d5Douglas Gregor std::string UpperKey = PropName->getName(); 5905577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (!UpperKey.empty()) 5906577cdfdb20840350e841a483df630237326126d5Douglas Gregor UpperKey[0] = toupper(UpperKey[0]); 5907577cdfdb20840350e841a483df630237326126d5Douglas Gregor 5908577cdfdb20840350e841a483df630237326126d5Douglas Gregor bool ReturnTypeMatchesProperty = ReturnType.isNull() || 5909577cdfdb20840350e841a483df630237326126d5Douglas Gregor Context.hasSameUnqualifiedType(ReturnType.getNonReferenceType(), 5910577cdfdb20840350e841a483df630237326126d5Douglas Gregor Property->getType()); 5911577cdfdb20840350e841a483df630237326126d5Douglas Gregor bool ReturnTypeMatchesVoid 5912577cdfdb20840350e841a483df630237326126d5Douglas Gregor = ReturnType.isNull() || ReturnType->isVoidType(); 5913577cdfdb20840350e841a483df630237326126d5Douglas Gregor 5914577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Add the normal accessor -(type)key. 5915577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && 5916e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor KnownSelectors.insert(Selectors.getNullarySelector(PropName)) && 5917577cdfdb20840350e841a483df630237326126d5Douglas Gregor ReturnTypeMatchesProperty && !Property->getGetterMethodDecl()) { 5918577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) 59198987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor AddObjCPassingTypeChunk(Property->getType(), Context, Policy, Builder); 5920577cdfdb20840350e841a483df630237326126d5Douglas Gregor 5921577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Key); 5922577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern, 5923577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 5924577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 5925577cdfdb20840350e841a483df630237326126d5Douglas Gregor 5926577cdfdb20840350e841a483df630237326126d5Douglas Gregor // If we have an integral or boolean property (or the user has provided 5927577cdfdb20840350e841a483df630237326126d5Douglas Gregor // an integral or boolean return type), add the accessor -(type)isKey. 5928577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && 5929577cdfdb20840350e841a483df630237326126d5Douglas Gregor ((!ReturnType.isNull() && 5930577cdfdb20840350e841a483df630237326126d5Douglas Gregor (ReturnType->isIntegerType() || ReturnType->isBooleanType())) || 5931577cdfdb20840350e841a483df630237326126d5Douglas Gregor (ReturnType.isNull() && 5932577cdfdb20840350e841a483df630237326126d5Douglas Gregor (Property->getType()->isIntegerType() || 5933577cdfdb20840350e841a483df630237326126d5Douglas Gregor Property->getType()->isBooleanType())))) { 59345f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::string SelectorName = (Twine("is") + UpperKey).str(); 59356204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 5936e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))) { 5937577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 5938577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 5939577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("BOOL"); 5940577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 5941577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 5942577cdfdb20840350e841a483df630237326126d5Douglas Gregor 5943577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk( 5944577cdfdb20840350e841a483df630237326126d5Douglas Gregor Allocator.CopyString(SelectorId->getName())); 5945577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern, 5946577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 5947577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 5948577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 5949577cdfdb20840350e841a483df630237326126d5Douglas Gregor 5950577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Add the normal mutator. 5951577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid && 5952577cdfdb20840350e841a483df630237326126d5Douglas Gregor !Property->getSetterMethodDecl()) { 59535f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::string SelectorName = (Twine("set") + UpperKey).str(); 59546204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 5955e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 5956577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 5957577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 5958577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 5959577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 5960577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 5961577cdfdb20840350e841a483df630237326126d5Douglas Gregor 5962577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk( 5963577cdfdb20840350e841a483df630237326126d5Douglas Gregor Allocator.CopyString(SelectorId->getName())); 5964577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(":"); 59658987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor AddObjCPassingTypeChunk(Property->getType(), Context, Policy, Builder); 5966577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk(Key); 5967577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern, 5968577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 5969577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 5970577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 5971577cdfdb20840350e841a483df630237326126d5Douglas Gregor 5972577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Indexed and unordered accessors 5973577cdfdb20840350e841a483df630237326126d5Douglas Gregor unsigned IndexedGetterPriority = CCP_CodePattern; 5974577cdfdb20840350e841a483df630237326126d5Douglas Gregor unsigned IndexedSetterPriority = CCP_CodePattern; 5975577cdfdb20840350e841a483df630237326126d5Douglas Gregor unsigned UnorderedGetterPriority = CCP_CodePattern; 5976577cdfdb20840350e841a483df630237326126d5Douglas Gregor unsigned UnorderedSetterPriority = CCP_CodePattern; 5977577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (const ObjCObjectPointerType *ObjCPointer 5978577cdfdb20840350e841a483df630237326126d5Douglas Gregor = Property->getType()->getAs<ObjCObjectPointerType>()) { 5979577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ObjCInterfaceDecl *IFace = ObjCPointer->getInterfaceDecl()) { 5980577cdfdb20840350e841a483df630237326126d5Douglas Gregor // If this interface type is not provably derived from a known 5981577cdfdb20840350e841a483df630237326126d5Douglas Gregor // collection, penalize the corresponding completions. 5982577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (!InheritsFromClassNamed(IFace, "NSMutableArray")) { 5983577cdfdb20840350e841a483df630237326126d5Douglas Gregor IndexedSetterPriority += CCD_ProbablyNotObjCCollection; 5984577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (!InheritsFromClassNamed(IFace, "NSArray")) 5985577cdfdb20840350e841a483df630237326126d5Douglas Gregor IndexedGetterPriority += CCD_ProbablyNotObjCCollection; 5986577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 5987577cdfdb20840350e841a483df630237326126d5Douglas Gregor 5988577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (!InheritsFromClassNamed(IFace, "NSMutableSet")) { 5989577cdfdb20840350e841a483df630237326126d5Douglas Gregor UnorderedSetterPriority += CCD_ProbablyNotObjCCollection; 5990577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (!InheritsFromClassNamed(IFace, "NSSet")) 5991577cdfdb20840350e841a483df630237326126d5Douglas Gregor UnorderedGetterPriority += CCD_ProbablyNotObjCCollection; 5992577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 5993577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 5994577cdfdb20840350e841a483df630237326126d5Douglas Gregor } else { 5995577cdfdb20840350e841a483df630237326126d5Douglas Gregor IndexedGetterPriority += CCD_ProbablyNotObjCCollection; 5996577cdfdb20840350e841a483df630237326126d5Douglas Gregor IndexedSetterPriority += CCD_ProbablyNotObjCCollection; 5997577cdfdb20840350e841a483df630237326126d5Douglas Gregor UnorderedGetterPriority += CCD_ProbablyNotObjCCollection; 5998577cdfdb20840350e841a483df630237326126d5Douglas Gregor UnorderedSetterPriority += CCD_ProbablyNotObjCCollection; 5999577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6000577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6001577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Add -(NSUInteger)countOf<key> 6002577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && 6003577cdfdb20840350e841a483df630237326126d5Douglas Gregor (ReturnType.isNull() || ReturnType->isIntegerType())) { 60045f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::string SelectorName = (Twine("countOf") + UpperKey).str(); 60056204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6006e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))) { 6007577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6008577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6009577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSUInteger"); 6010577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6011577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6012577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6013577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk( 6014577cdfdb20840350e841a483df630237326126d5Douglas Gregor Allocator.CopyString(SelectorId->getName())); 6015577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), 6016577cdfdb20840350e841a483df630237326126d5Douglas Gregor std::min(IndexedGetterPriority, 6017577cdfdb20840350e841a483df630237326126d5Douglas Gregor UnorderedGetterPriority), 6018577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6019577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6020577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6021577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6022577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Indexed getters 6023577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Add -(id)objectInKeyAtIndex:(NSUInteger)index 6024577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && 6025577cdfdb20840350e841a483df630237326126d5Douglas Gregor (ReturnType.isNull() || ReturnType->isObjCObjectPointerType())) { 60266204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor std::string SelectorName 60275f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner = (Twine("objectIn") + UpperKey + "AtIndex").str(); 60286204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6029e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6030577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6031577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6032577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("id"); 6033577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6034577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6035577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6036577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6037577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6038577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSUInteger"); 6039577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6040577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("index"); 6041577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority, 6042577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6043577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6044577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6045577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6046577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Add -(NSArray *)keyAtIndexes:(NSIndexSet *)indexes 6047577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && 6048577cdfdb20840350e841a483df630237326126d5Douglas Gregor (ReturnType.isNull() || 6049577cdfdb20840350e841a483df630237326126d5Douglas Gregor (ReturnType->isObjCObjectPointerType() && 6050577cdfdb20840350e841a483df630237326126d5Douglas Gregor ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() && 6051577cdfdb20840350e841a483df630237326126d5Douglas Gregor ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() 6052577cdfdb20840350e841a483df630237326126d5Douglas Gregor ->getName() == "NSArray"))) { 60536204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor std::string SelectorName 60545f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner = (Twine(Property->getName()) + "AtIndexes").str(); 60556204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6056e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6057577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6058577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6059577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSArray *"); 6060577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6061577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6062577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6063577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6064577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6065577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSIndexSet *"); 6066577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6067577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("indexes"); 6068577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority, 6069577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6070577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6071577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6072577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6073577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Add -(void)getKey:(type **)buffer range:(NSRange)inRange 6074577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid) { 60755f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::string SelectorName = (Twine("get") + UpperKey).str(); 6076577cdfdb20840350e841a483df630237326126d5Douglas Gregor IdentifierInfo *SelectorIds[2] = { 60776204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor &Context.Idents.get(SelectorName), 6078577cdfdb20840350e841a483df630237326126d5Douglas Gregor &Context.Idents.get("range") 6079577cdfdb20840350e841a483df630237326126d5Douglas Gregor }; 6080577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6081e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds))) { 6082577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6083577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6084577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6085577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6086577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6087577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6088577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6089577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6090577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddPlaceholderChunk("object-type"); 6091577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk(" **"); 6092577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6093577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("buffer"); 6094577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6095577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk("range:"); 6096577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6097577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSRange"); 6098577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6099577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("inRange"); 6100577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority, 6101577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6102577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6103577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6104577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6105577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Mutable indexed accessors 6106577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6107577cdfdb20840350e841a483df630237326126d5Douglas Gregor // - (void)insertObject:(type *)object inKeyAtIndex:(NSUInteger)index 6108577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid) { 61095f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::string SelectorName = (Twine("in") + UpperKey + "AtIndex").str(); 6110577cdfdb20840350e841a483df630237326126d5Douglas Gregor IdentifierInfo *SelectorIds[2] = { 6111577cdfdb20840350e841a483df630237326126d5Douglas Gregor &Context.Idents.get("insertObject"), 61126204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor &Context.Idents.get(SelectorName) 6113577cdfdb20840350e841a483df630237326126d5Douglas Gregor }; 6114577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6115e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds))) { 6116577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6117577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6118577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6119577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6120577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6121577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6122577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk("insertObject:"); 6123577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6124577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddPlaceholderChunk("object-type"); 6125577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk(" *"); 6126577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6127577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("object"); 6128577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6129577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6130577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6131577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddPlaceholderChunk("NSUInteger"); 6132577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6133577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("index"); 6134577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 6135577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6136577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6137577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6138577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6139577cdfdb20840350e841a483df630237326126d5Douglas Gregor // - (void)insertKey:(NSArray *)array atIndexes:(NSIndexSet *)indexes 6140577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid) { 61415f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::string SelectorName = (Twine("insert") + UpperKey).str(); 6142577cdfdb20840350e841a483df630237326126d5Douglas Gregor IdentifierInfo *SelectorIds[2] = { 61436204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor &Context.Idents.get(SelectorName), 6144577cdfdb20840350e841a483df630237326126d5Douglas Gregor &Context.Idents.get("atIndexes") 6145577cdfdb20840350e841a483df630237326126d5Douglas Gregor }; 6146577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6147e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds))) { 6148577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6149577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6150577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6151577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6152577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6153577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6154577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6155577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6156577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSArray *"); 6157577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6158577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("array"); 6159577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6160577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk("atIndexes:"); 6161577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6162577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddPlaceholderChunk("NSIndexSet *"); 6163577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6164577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("indexes"); 6165577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 6166577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6167577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6168577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6169577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6170577cdfdb20840350e841a483df630237326126d5Douglas Gregor // -(void)removeObjectFromKeyAtIndex:(NSUInteger)index 6171577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid) { 61726204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor std::string SelectorName 61735f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner = (Twine("removeObjectFrom") + UpperKey + "AtIndex").str(); 61746204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6175e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6176577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6177577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6178577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6179577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6180577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6181577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6182577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6183577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6184577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSUInteger"); 6185577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6186577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("index"); 6187577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 6188577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6189577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6190577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6191577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6192577cdfdb20840350e841a483df630237326126d5Douglas Gregor // -(void)removeKeyAtIndexes:(NSIndexSet *)indexes 6193577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid) { 61946204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor std::string SelectorName 61955f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner = (Twine("remove") + UpperKey + "AtIndexes").str(); 61966204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6197e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6198577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6199577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6200577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6201577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6202577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6203577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6204577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6205577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6206577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSIndexSet *"); 6207577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6208577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("indexes"); 6209577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 6210577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6211577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6212577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6213577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6214577cdfdb20840350e841a483df630237326126d5Douglas Gregor // - (void)replaceObjectInKeyAtIndex:(NSUInteger)index withObject:(id)object 6215577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid) { 62166204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor std::string SelectorName 62175f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner = (Twine("replaceObjectIn") + UpperKey + "AtIndex").str(); 6218577cdfdb20840350e841a483df630237326126d5Douglas Gregor IdentifierInfo *SelectorIds[2] = { 62196204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor &Context.Idents.get(SelectorName), 6220577cdfdb20840350e841a483df630237326126d5Douglas Gregor &Context.Idents.get("withObject") 6221577cdfdb20840350e841a483df630237326126d5Douglas Gregor }; 6222577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6223e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds))) { 6224577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6225577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6226577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6227577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6228577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6229577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6230577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6231577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6232577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddPlaceholderChunk("NSUInteger"); 6233577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6234577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("index"); 6235577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6236577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk("withObject:"); 6237577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6238577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("id"); 6239577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6240577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("object"); 6241577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 6242577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6243577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6244577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6245577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6246577cdfdb20840350e841a483df630237326126d5Douglas Gregor // - (void)replaceKeyAtIndexes:(NSIndexSet *)indexes withKey:(NSArray *)array 6247577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid) { 62486204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor std::string SelectorName1 62495f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner = (Twine("replace") + UpperKey + "AtIndexes").str(); 62505f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::string SelectorName2 = (Twine("with") + UpperKey).str(); 6251577cdfdb20840350e841a483df630237326126d5Douglas Gregor IdentifierInfo *SelectorIds[2] = { 62526204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor &Context.Idents.get(SelectorName1), 62536204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor &Context.Idents.get(SelectorName2) 6254577cdfdb20840350e841a483df630237326126d5Douglas Gregor }; 6255577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6256e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds))) { 6257577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6258577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6259577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6260577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6261577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6262577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6263577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName1 + ":")); 6264577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6265577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddPlaceholderChunk("NSIndexSet *"); 6266577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6267577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("indexes"); 6268577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6269577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName2 + ":")); 6270577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6271577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSArray *"); 6272577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6273577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("array"); 6274577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 6275577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6276577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6277577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6278577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6279577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Unordered getters 6280577cdfdb20840350e841a483df630237326126d5Douglas Gregor // - (NSEnumerator *)enumeratorOfKey 6281577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && 6282577cdfdb20840350e841a483df630237326126d5Douglas Gregor (ReturnType.isNull() || 6283577cdfdb20840350e841a483df630237326126d5Douglas Gregor (ReturnType->isObjCObjectPointerType() && 6284577cdfdb20840350e841a483df630237326126d5Douglas Gregor ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() && 6285577cdfdb20840350e841a483df630237326126d5Douglas Gregor ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() 6286577cdfdb20840350e841a483df630237326126d5Douglas Gregor ->getName() == "NSEnumerator"))) { 62875f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::string SelectorName = (Twine("enumeratorOf") + UpperKey).str(); 62886204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6289e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))) { 6290577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6291577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6292577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSEnumerator *"); 6293577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6294577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6295577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6296577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName)); 6297577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), UnorderedGetterPriority, 6298577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6299577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6300577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6301577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6302577cdfdb20840350e841a483df630237326126d5Douglas Gregor // - (type *)memberOfKey:(type *)object 6303577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && 6304577cdfdb20840350e841a483df630237326126d5Douglas Gregor (ReturnType.isNull() || ReturnType->isObjCObjectPointerType())) { 63055f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::string SelectorName = (Twine("memberOf") + UpperKey).str(); 63066204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6307e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6308577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6309577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6310577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddPlaceholderChunk("object-type"); 6311577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk(" *"); 6312577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6313577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6314577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6315577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6316577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6317577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6318577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddPlaceholderChunk("object-type"); 6319577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk(" *"); 6320577cdfdb20840350e841a483df630237326126d5Douglas Gregor } else { 6321577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk(GetCompletionTypeString(ReturnType, Context, 63228987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor Policy, 6323577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.getAllocator())); 6324577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6325577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6326577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("object"); 6327577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), UnorderedGetterPriority, 6328577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6329577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6330577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6331577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6332577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Mutable unordered accessors 6333577cdfdb20840350e841a483df630237326126d5Douglas Gregor // - (void)addKeyObject:(type *)object 6334577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid) { 63356204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor std::string SelectorName 63365f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner = (Twine("add") + UpperKey + Twine("Object")).str(); 63376204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6338e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6339577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6340577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6341577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6342577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6343577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6344577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6345577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6346577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6347577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddPlaceholderChunk("object-type"); 6348577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk(" *"); 6349577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6350577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("object"); 6351577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority, 6352577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6353577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6354577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6355577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6356577cdfdb20840350e841a483df630237326126d5Douglas Gregor // - (void)addKey:(NSSet *)objects 6357577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid) { 63585f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::string SelectorName = (Twine("add") + UpperKey).str(); 63596204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6360e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6361577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6362577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6363577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6364577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6365577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6366577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6367577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6368577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6369577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSSet *"); 6370577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6371577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("objects"); 6372577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority, 6373577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6374577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6375577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6376577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6377577cdfdb20840350e841a483df630237326126d5Douglas Gregor // - (void)removeKeyObject:(type *)object 6378577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid) { 63796204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor std::string SelectorName 63805f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner = (Twine("remove") + UpperKey + Twine("Object")).str(); 63816204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6382e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6383577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6384577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6385577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6386577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6387577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6388577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6389577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6390577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6391577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddPlaceholderChunk("object-type"); 6392577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk(" *"); 6393577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6394577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("object"); 6395577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority, 6396577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6397577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6398577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6399577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6400577cdfdb20840350e841a483df630237326126d5Douglas Gregor // - (void)removeKey:(NSSet *)objects 6401577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid) { 64025f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::string SelectorName = (Twine("remove") + UpperKey).str(); 64036204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6404e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6405577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6406577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6407577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6408577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6409577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6410577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6411577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6412577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6413577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSSet *"); 6414577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6415577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("objects"); 6416577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority, 6417577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6418577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6419577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6420577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6421577cdfdb20840350e841a483df630237326126d5Douglas Gregor // - (void)intersectKey:(NSSet *)objects 6422577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid) { 64235f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::string SelectorName = (Twine("intersect") + UpperKey).str(); 64246204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6425e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6426577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6427577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6428577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6429577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6430577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6431577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6432577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6433577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6434577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSSet *"); 6435577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6436577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("objects"); 6437577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority, 6438577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6439577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6440577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6441577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6442577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Key-Value Observing 6443577cdfdb20840350e841a483df630237326126d5Douglas Gregor // + (NSSet *)keyPathsForValuesAffectingKey 6444577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (!IsInstanceMethod && 6445577cdfdb20840350e841a483df630237326126d5Douglas Gregor (ReturnType.isNull() || 6446577cdfdb20840350e841a483df630237326126d5Douglas Gregor (ReturnType->isObjCObjectPointerType() && 6447577cdfdb20840350e841a483df630237326126d5Douglas Gregor ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() && 6448577cdfdb20840350e841a483df630237326126d5Douglas Gregor ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() 6449577cdfdb20840350e841a483df630237326126d5Douglas Gregor ->getName() == "NSSet"))) { 64506204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor std::string SelectorName 64515f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner = (Twine("keyPathsForValuesAffecting") + UpperKey).str(); 64526204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6453e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))) { 6454577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6455577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6456577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSSet *"); 6457577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6458577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6459577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6460577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName)); 6461577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern, 64623f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor CXCursor_ObjCClassMethodDecl)); 64633f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor } 64643f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor } 64653f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor 64663f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor // + (BOOL)automaticallyNotifiesObserversForKey 64673f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor if (!IsInstanceMethod && 64683f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor (ReturnType.isNull() || 64693f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor ReturnType->isIntegerType() || 64703f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor ReturnType->isBooleanType())) { 64713f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor std::string SelectorName 64725f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner = (Twine("automaticallyNotifiesObserversOf") + UpperKey).str(); 64733f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 64743f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))) { 64753f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor if (ReturnType.isNull()) { 64763f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 64773f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor Builder.AddTextChunk("BOOL"); 64783f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 64793f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor } 64803f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor 64813f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName)); 64823f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern, 64833f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor CXCursor_ObjCClassMethodDecl)); 6484577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6485577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6486577cdfdb20840350e841a483df630237326126d5Douglas Gregor} 6487577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6488e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregorvoid Sema::CodeCompleteObjCMethodDecl(Scope *S, 6489e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor bool IsInstanceMethod, 6490a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian ParsedType ReturnTy) { 6491e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Determine the return type of the method we're declaring, if 6492e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // provided. 6493e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor QualType ReturnType = GetTypeFromParser(ReturnTy); 6494a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian Decl *IDecl = 0; 6495a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian if (CurContext->isObjCContainer()) { 6496a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian ObjCContainerDecl *OCD = dyn_cast<ObjCContainerDecl>(CurContext); 6497a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian IDecl = cast<Decl>(OCD); 6498a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian } 6499ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor // Determine where we should start searching for methods. 6500ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor ObjCContainerDecl *SearchDecl = 0; 6501e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor bool IsInImplementation = false; 6502d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall if (Decl *D = IDecl) { 6503e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (ObjCImplementationDecl *Impl = dyn_cast<ObjCImplementationDecl>(D)) { 6504e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor SearchDecl = Impl->getClassInterface(); 6505e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor IsInImplementation = true; 6506e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } else if (ObjCCategoryImplDecl *CatImpl 6507ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor = dyn_cast<ObjCCategoryImplDecl>(D)) { 6508e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor SearchDecl = CatImpl->getCategoryDecl(); 6509e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor IsInImplementation = true; 6510ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor } else 6511e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor SearchDecl = dyn_cast<ObjCContainerDecl>(D); 6512e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 6513e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6514e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (!SearchDecl && S) { 6515ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor if (DeclContext *DC = static_cast<DeclContext *>(S->getEntity())) 6516e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor SearchDecl = dyn_cast<ObjCContainerDecl>(DC); 6517e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 6518e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6519ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor if (!SearchDecl) { 6520e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 6521e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 6522e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor 0, 0); 6523e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor return; 6524e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 6525e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6526e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Find all of the methods that we could declare/implement here. 6527e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor KnownMethodsMap KnownMethods; 6528e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor FindImplementableMethods(Context, SearchDecl, IsInstanceMethod, 6529ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor ReturnType, KnownMethods); 6530e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6531e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Add declarations or definitions for each of the known methods. 65320a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 6533218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 6534218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 6535e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Results.EnterNewScope(); 65368987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor PrintingPolicy Policy = getCompletionPrintingPolicy(*this); 6537e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor for (KnownMethodsMap::iterator M = KnownMethods.begin(), 6538e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor MEnd = KnownMethods.end(); 6539e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor M != MEnd; ++M) { 6540408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor ObjCMethodDecl *Method = M->second.first; 6541218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder Builder(Results.getAllocator()); 6542e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6543e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // If the result type was not already provided, add it to the 6544e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // pattern as (type). 6545577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) 65468987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor AddObjCPassingTypeChunk(Method->getResultType(), Context, Policy, 65478987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor Builder); 6548e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6549e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Selector Sel = Method->getSelector(); 6550e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6551e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Add the first part of the selector to the pattern. 6552dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddTypedTextChunk(Builder.getAllocator().CopyString( 6553813d8346529bf094eb2b249648906ba7fd226688Douglas Gregor Sel.getNameForSlot(0))); 6554e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6555e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Add parameters to the pattern. 6556e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor unsigned I = 0; 6557e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor for (ObjCMethodDecl::param_iterator P = Method->param_begin(), 6558e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor PEnd = Method->param_end(); 6559e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor P != PEnd; (void)++P, ++I) { 6560e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Add the part of the selector name. 6561e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (I == 0) 6562218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk(":"); 6563e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor else if (I < Sel.getNumArgs()) { 6564218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6565218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk( 6566813d8346529bf094eb2b249648906ba7fd226688Douglas Gregor Builder.getAllocator().CopyString(Sel.getNameForSlot(I) + ":")); 6567e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } else 6568e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor break; 6569e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6570e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Add the parameter type. 65718987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor AddObjCPassingTypeChunk((*P)->getOriginalType(), Context, Policy, 65728987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor Builder); 6573e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6574e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (IdentifierInfo *Id = (*P)->getIdentifier()) 6575dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddTextChunk(Builder.getAllocator().CopyString( Id->getName())); 6576e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 6577e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6578e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (Method->isVariadic()) { 6579e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (Method->param_size() > 0) 6580218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_Comma); 6581218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("..."); 6582e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor } 6583e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6584447107dfff705ab79d1dbf33ce79b524d63572fdDouglas Gregor if (IsInImplementation && Results.includeCodePatterns()) { 6585e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // We will be defining the method here, so add a compound statement. 6586218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6587218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 6588218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 6589e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (!Method->getResultType()->isVoidType()) { 6590e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // If the result type is not void, add a return clause. 6591218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("return"); 6592218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6593218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 6594218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_SemiColon); 6595e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } else 6596218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("statements"); 6597e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6598218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 6599218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 6600e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 6601e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6602408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor unsigned Priority = CCP_CodePattern; 6603408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor if (!M->second.second) 6604408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor Priority += CCD_InBaseClass; 6605408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor 6606218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString(), Priority, 660716ed9ada523a990ca4bb5015c7bf8d0ead60c7d9Douglas Gregor Method->isInstanceMethod() 660816ed9ada523a990ca4bb5015c7bf8d0ead60c7d9Douglas Gregor ? CXCursor_ObjCInstanceMethodDecl 660916ed9ada523a990ca4bb5015c7bf8d0ead60c7d9Douglas Gregor : CXCursor_ObjCClassMethodDecl)); 6610e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 6611e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6612577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Add Key-Value-Coding and Key-Value-Observing accessor methods for all of 6613577cdfdb20840350e841a483df630237326126d5Douglas Gregor // the properties in this class and its categories. 6614577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (Context.getLangOptions().ObjC2) { 66155f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<ObjCContainerDecl *, 4> Containers; 6616577cdfdb20840350e841a483df630237326126d5Douglas Gregor Containers.push_back(SearchDecl); 6617577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6618e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor VisitedSelectorSet KnownSelectors; 6619e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor for (KnownMethodsMap::iterator M = KnownMethods.begin(), 6620e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor MEnd = KnownMethods.end(); 6621e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor M != MEnd; ++M) 6622e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor KnownSelectors.insert(M->first); 6623e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor 6624e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor 6625577cdfdb20840350e841a483df630237326126d5Douglas Gregor ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(SearchDecl); 6626577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (!IFace) 6627577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(SearchDecl)) 6628577cdfdb20840350e841a483df630237326126d5Douglas Gregor IFace = Category->getClassInterface(); 6629577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6630577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IFace) { 6631577cdfdb20840350e841a483df630237326126d5Douglas Gregor for (ObjCCategoryDecl *Category = IFace->getCategoryList(); Category; 6632577cdfdb20840350e841a483df630237326126d5Douglas Gregor Category = Category->getNextClassCategory()) 6633577cdfdb20840350e841a483df630237326126d5Douglas Gregor Containers.push_back(Category); 6634577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6635577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6636577cdfdb20840350e841a483df630237326126d5Douglas Gregor for (unsigned I = 0, N = Containers.size(); I != N; ++I) { 6637577cdfdb20840350e841a483df630237326126d5Douglas Gregor for (ObjCContainerDecl::prop_iterator P = Containers[I]->prop_begin(), 6638577cdfdb20840350e841a483df630237326126d5Douglas Gregor PEnd = Containers[I]->prop_end(); 6639577cdfdb20840350e841a483df630237326126d5Douglas Gregor P != PEnd; ++P) { 6640577cdfdb20840350e841a483df630237326126d5Douglas Gregor AddObjCKeyValueCompletions(*P, IsInstanceMethod, ReturnType, Context, 6641e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor KnownSelectors, Results); 6642577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6643577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6644577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6645577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6646e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Results.ExitScope(); 6647e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6648e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 6649e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 6650e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 6651e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor} 66521f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 66531f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregorvoid Sema::CodeCompleteObjCMethodDeclSelector(Scope *S, 66541f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor bool IsInstanceMethod, 665540ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor bool AtParameterName, 6656b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall ParsedType ReturnTy, 66571f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor IdentifierInfo **SelIdents, 66581f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor unsigned NumSelIdents) { 66591f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor // If we have an external source, load the entire class method 66603c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl // pool from the AST file. 66611f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor if (ExternalSource) { 66621f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors(); 66631f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor I != N; ++I) { 66641f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor Selector Sel = ExternalSource->GetExternalSelector(I); 6665db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl if (Sel.isNull() || MethodPool.count(Sel)) 66661f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor continue; 6667db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl 6668db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl ReadMethodPool(Sel); 66691f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor } 66701f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor } 66711f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 66721f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor // Build the set of methods we can see. 66730a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 6674218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 6675218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 66761f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 66771f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor if (ReturnTy) 66781f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor Results.setPreferredType(GetTypeFromParser(ReturnTy).getNonReferenceType()); 6679db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl 66801f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor Results.EnterNewScope(); 6681db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl for (GlobalMethodPool::iterator M = MethodPool.begin(), 6682db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl MEnd = MethodPool.end(); 6683db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl M != MEnd; ++M) { 6684db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl for (ObjCMethodList *MethList = IsInstanceMethod ? &M->second.first : 6685db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl &M->second.second; 6686db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl MethList && MethList->Method; 66871f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor MethList = MethList->Next) { 66881f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor if (!isAcceptableObjCMethod(MethList->Method, MK_Any, SelIdents, 66891f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor NumSelIdents)) 66901f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor continue; 66911f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 669240ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor if (AtParameterName) { 669340ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor // Suggest parameter names we've seen before. 669440ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor if (NumSelIdents && NumSelIdents <= MethList->Method->param_size()) { 669540ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor ParmVarDecl *Param = MethList->Method->param_begin()[NumSelIdents-1]; 669640ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor if (Param->getIdentifier()) { 6697218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder Builder(Results.getAllocator()); 6698dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddTypedTextChunk(Builder.getAllocator().CopyString( 6699218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Param->getIdentifier()->getName())); 6700218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 670140ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor } 670240ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor } 670340ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor 670440ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor continue; 670540ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor } 670640ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor 67071f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor Result R(MethList->Method, 0); 67081f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor R.StartParameter = NumSelIdents; 67091f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor R.AllParametersAreInformative = false; 67101f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor R.DeclaringEntity = true; 67111f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor Results.MaybeAddResult(R, CurContext); 67121f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor } 67131f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor } 67141f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 67151f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor Results.ExitScope(); 6716e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 6717e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 6718e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 67191f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor} 672087c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor 6721f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregorvoid Sema::CodeCompletePreprocessorDirective(bool InConditional) { 6722218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 672352779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor CodeCompletionContext::CCC_PreprocessorDirective); 6724f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor Results.EnterNewScope(); 6725f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 6726f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #if <condition> 6727218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder Builder(Results.getAllocator()); 6728218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("if"); 6729218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6730218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("condition"); 6731218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 6732f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 6733f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #ifdef <macro> 6734218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("ifdef"); 6735218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6736218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("macro"); 6737218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 6738218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor 6739f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #ifndef <macro> 6740218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("ifndef"); 6741218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6742218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("macro"); 6743218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 6744f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 6745f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor if (InConditional) { 6746f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #elif <condition> 6747218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("elif"); 6748218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6749218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("condition"); 6750218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 6751f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 6752f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #else 6753218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("else"); 6754218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 6755f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 6756f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #endif 6757218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("endif"); 6758218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 6759f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor } 6760f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 6761f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #include "header" 6762218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("include"); 6763218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6764218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("\""); 6765218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("header"); 6766218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("\""); 6767218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 6768f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 6769f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #include <header> 6770218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("include"); 6771218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6772218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("<"); 6773218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("header"); 6774218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk(">"); 6775218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 6776f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 6777f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #define <macro> 6778218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("define"); 6779218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6780218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("macro"); 6781218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 6782f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 6783f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #define <macro>(<args>) 6784218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("define"); 6785218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6786218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("macro"); 6787218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6788218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("args"); 6789218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6790218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 6791f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 6792f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #undef <macro> 6793218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("undef"); 6794218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6795218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("macro"); 6796218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 6797f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 6798f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #line <number> 6799218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("line"); 6800218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6801218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("number"); 6802218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 6803f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 6804f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #line <number> "filename" 6805218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("line"); 6806218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6807218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("number"); 6808218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6809218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("\""); 6810218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("filename"); 6811218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("\""); 6812218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 6813f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 6814f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #error <message> 6815218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("error"); 6816218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6817218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("message"); 6818218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 6819f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 6820f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #pragma <arguments> 6821218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("pragma"); 6822218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6823218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("arguments"); 6824218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 6825f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 6826f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor if (getLangOptions().ObjC1) { 6827f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #import "header" 6828218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("import"); 6829218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6830218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("\""); 6831218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("header"); 6832218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("\""); 6833218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 6834f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 6835f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #import <header> 6836218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("import"); 6837218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6838218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("<"); 6839218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("header"); 6840218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk(">"); 6841218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 6842f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor } 6843f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 6844f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #include_next "header" 6845218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("include_next"); 6846218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6847218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("\""); 6848218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("header"); 6849218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("\""); 6850218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 6851f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 6852f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #include_next <header> 6853218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("include_next"); 6854218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6855218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("<"); 6856218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("header"); 6857218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk(">"); 6858218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 6859f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 6860f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #warning <message> 6861218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("warning"); 6862218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6863218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("message"); 6864218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 6865f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 6866f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // Note: #ident and #sccs are such crazy anachronisms that we don't provide 6867f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // completions for them. And __include_macros is a Clang-internal extension 6868f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // that we don't want to encourage anyone to use. 6869f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 6870f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // FIXME: we don't support #assert or #unassert, so don't suggest them. 6871f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor Results.ExitScope(); 6872f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 6873f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 6874721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor CodeCompletionContext::CCC_PreprocessorDirective, 6875f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor Results.data(), Results.size()); 6876f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor} 6877f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 6878f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregorvoid Sema::CodeCompleteInPreprocessorConditionalExclusion(Scope *S) { 6879f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor CodeCompleteOrdinaryName(S, 6880f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall S->getFnParent()? Sema::PCC_RecoveryInFunction 6881f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall : Sema::PCC_Namespace); 6882f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor} 6883f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 6884f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregorvoid Sema::CodeCompletePreprocessorMacroName(bool IsDefinition) { 6885218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 688652779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor IsDefinition? CodeCompletionContext::CCC_MacroName 688752779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor : CodeCompletionContext::CCC_MacroNameUse); 68881fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor if (!IsDefinition && (!CodeCompleter || CodeCompleter->includeMacros())) { 68891fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor // Add just the names of macros, not their arguments. 6890218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder Builder(Results.getAllocator()); 68911fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor Results.EnterNewScope(); 68921fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor for (Preprocessor::macro_iterator M = PP.macro_begin(), 68931fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor MEnd = PP.macro_end(); 68941fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor M != MEnd; ++M) { 6895dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddTypedTextChunk(Builder.getAllocator().CopyString( 6896218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor M->first->getName())); 6897218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 68981fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor } 68991fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor Results.ExitScope(); 69001fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor } else if (IsDefinition) { 69011fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor // FIXME: Can we detect when the user just wrote an include guard above? 69021fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor } 69031fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor 690452779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 69051fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor Results.data(), Results.size()); 69061fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor} 69071fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor 6908f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregorvoid Sema::CodeCompletePreprocessorExpression() { 6909218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 691052779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor CodeCompletionContext::CCC_PreprocessorExpression); 6911f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor 6912f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor if (!CodeCompleter || CodeCompleter->includeMacros()) 6913f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor AddMacroResults(PP, Results); 6914f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor 6915f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor // defined (<macro>) 6916f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor Results.EnterNewScope(); 6917218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder Builder(Results.getAllocator()); 6918218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("defined"); 6919218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6920218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6921218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("macro"); 6922218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6923218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 6924f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor Results.ExitScope(); 6925f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor 6926f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 6927f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor CodeCompletionContext::CCC_PreprocessorExpression, 6928f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor Results.data(), Results.size()); 6929f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor} 6930f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor 6931f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregorvoid Sema::CodeCompletePreprocessorMacroArgument(Scope *S, 6932f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor IdentifierInfo *Macro, 6933f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor MacroInfo *MacroInfo, 6934f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor unsigned Argument) { 6935f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor // FIXME: In the future, we could provide "overload" results, much like we 6936f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor // do for function calls. 6937f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor 69385c5f03e4020e90b9760ec547962ba02b029cc359Argyrios Kyrtzidis // Now just ignore this. There will be another code-completion callback 69395c5f03e4020e90b9760ec547962ba02b029cc359Argyrios Kyrtzidis // for the expanded tokens. 6940f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor} 6941f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor 694255817afdf9d453a443262a733f6caf6692dca118Douglas Gregorvoid Sema::CodeCompleteNaturalLanguage() { 694355817afdf9d453a443262a733f6caf6692dca118Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 6944af1c6b532e6e1e944db987f29062e5efce71a573Douglas Gregor CodeCompletionContext::CCC_NaturalLanguage, 694555817afdf9d453a443262a733f6caf6692dca118Douglas Gregor 0, 0); 694655817afdf9d453a443262a733f6caf6692dca118Douglas Gregor} 694755817afdf9d453a443262a733f6caf6692dca118Douglas Gregor 6948dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregorvoid Sema::GatherGlobalCodeCompletions(CodeCompletionAllocator &Allocator, 69495f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVectorImpl<CodeCompletionResult> &Results) { 6950218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Builder(*this, Allocator, CodeCompletionContext::CCC_Recovery); 69518071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor if (!CodeCompleter || CodeCompleter->includeGlobals()) { 69528071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompletionDeclConsumer Consumer(Builder, 69538071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor Context.getTranslationUnitDecl()); 69548071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(Context.getTranslationUnitDecl(), LookupAnyName, 69558071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor Consumer); 69568071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor } 695787c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor 695887c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor if (!CodeCompleter || CodeCompleter->includeMacros()) 695987c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor AddMacroResults(PP, Builder); 696087c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor 696187c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor Results.clear(); 696287c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor Results.insert(Results.end(), 696387c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor Builder.data(), Builder.data() + Builder.size()); 696487c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor} 6965