SemaCodeComplete.cpp revision 8ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0
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 } 5991f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Other; 6001f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 6011f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::Complex: 6021f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Arithmetic; 6031f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 6041f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::Pointer: 6051f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Pointer; 6061f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 6071f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::BlockPointer: 6081f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Block; 6091f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 6101f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::LValueReference: 6111f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::RValueReference: 6121f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return getSimplifiedTypeClass(T->getAs<ReferenceType>()->getPointeeType()); 6131f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 6141f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::ConstantArray: 6151f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::IncompleteArray: 6161f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::VariableArray: 6171f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::DependentSizedArray: 6181f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Array; 6191f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 6201f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::DependentSizedExtVector: 6211f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::Vector: 6221f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::ExtVector: 6231f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Arithmetic; 6241f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 6251f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::FunctionProto: 6261f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::FunctionNoProto: 6271f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Function; 6281f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 6291f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::Record: 6301f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Record; 6311f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 6321f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::Enum: 6331f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Arithmetic; 6341f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 6351f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::ObjCObject: 6361f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::ObjCInterface: 6371f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::ObjCObjectPointer: 6381f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_ObjectiveC; 6391f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 6401f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor default: 6411f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Other; 6421f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor } 6431f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor} 6441f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 6451f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor/// \brief Get the type that a given expression will have if this declaration 6461f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor/// is used as an expression in its "typical" code-completion form. 6471827e10051638770ad9ccf3e285caf95f995afd1Douglas GregorQualType clang::getDeclUsageType(ASTContext &C, NamedDecl *ND) { 6481f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor ND = cast<NamedDecl>(ND->getUnderlyingDecl()); 6491f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 6501f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor if (TypeDecl *Type = dyn_cast<TypeDecl>(ND)) 6511f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return C.getTypeDeclType(Type); 6521f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor if (ObjCInterfaceDecl *Iface = dyn_cast<ObjCInterfaceDecl>(ND)) 6531f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return C.getObjCInterfaceType(Iface); 6541f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 6551f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor QualType T; 6561f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor if (FunctionDecl *Function = dyn_cast<FunctionDecl>(ND)) 6575291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor T = Function->getCallResultType(); 6581f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor else if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(ND)) 6595291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor T = Method->getSendResultType(); 6601f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor else if (FunctionTemplateDecl *FunTmpl = dyn_cast<FunctionTemplateDecl>(ND)) 6615291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor T = FunTmpl->getTemplatedDecl()->getCallResultType(); 6621f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor else if (EnumConstantDecl *Enumerator = dyn_cast<EnumConstantDecl>(ND)) 6631f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor T = C.getTypeDeclType(cast<EnumDecl>(Enumerator->getDeclContext())); 6641f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor else if (ObjCPropertyDecl *Property = dyn_cast<ObjCPropertyDecl>(ND)) 6651f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor T = Property->getType(); 6661f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor else if (ValueDecl *Value = dyn_cast<ValueDecl>(ND)) 6671f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor T = Value->getType(); 6681f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor else 6691f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return QualType(); 6703e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor 6713e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor // Dig through references, function pointers, and block pointers to 6723e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor // get down to the likely type of an expression when the entity is 6733e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor // used. 6743e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor do { 6753e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor if (const ReferenceType *Ref = T->getAs<ReferenceType>()) { 6763e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor T = Ref->getPointeeType(); 6773e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor continue; 6783e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor } 6793e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor 6803e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor if (const PointerType *Pointer = T->getAs<PointerType>()) { 6813e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor if (Pointer->getPointeeType()->isFunctionType()) { 6823e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor T = Pointer->getPointeeType(); 6833e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor continue; 6843e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor } 6853e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor 6863e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor break; 6873e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor } 6883e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor 6893e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor if (const BlockPointerType *Block = T->getAs<BlockPointerType>()) { 6903e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor T = Block->getPointeeType(); 6913e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor continue; 6923e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor } 6933e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor 6943e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor if (const FunctionType *Function = T->getAs<FunctionType>()) { 6953e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor T = Function->getResultType(); 6963e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor continue; 6973e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor } 6983e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor 6993e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor break; 7003e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor } while (true); 7013e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor 7023e64d56185f0bf7dbd536c1b3ecbc853c22a9184Douglas Gregor return T; 7031f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor} 7041f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 705cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregorvoid ResultBuilder::AdjustResultPriorityForDecl(Result &R) { 706cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor // If this is an Objective-C method declaration whose selector matches our 707cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor // preferred selector, give it a priority boost. 708cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor if (!PreferredSelector.isNull()) 709cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(R.Declaration)) 710cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor if (PreferredSelector == Method->getSelector()) 711cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor R.Priority += CCD_SelectorMatch; 71208f43cd5d966fd31b32bd5c76c0645ebbf08b2f1Douglas Gregor 713cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor // If we have a preferred type, adjust the priority for results with exactly- 714cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor // matching or nearly-matching types. 715cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor if (!PreferredType.isNull()) { 716cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor QualType T = getDeclUsageType(SemaRef.Context, R.Declaration); 717cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor if (!T.isNull()) { 718cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor CanQualType TC = SemaRef.Context.getCanonicalType(T); 719cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor // Check for exactly-matching types (modulo qualifiers). 720cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor if (SemaRef.Context.hasSameUnqualifiedType(PreferredType, TC)) 721cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor R.Priority /= CCF_ExactTypeMatch; 722cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor // Check for nearly-matching types, based on classification of each. 723cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor else if ((getSimplifiedTypeClass(PreferredType) 7241f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor == getSimplifiedTypeClass(TC)) && 725cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor !(PreferredType->isEnumeralType() && TC->isEnumeralType())) 726cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor R.Priority /= CCF_SimilarTypeMatch; 727cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor } 728cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor } 7291f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor} 7301f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 7316f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregorvoid ResultBuilder::MaybeAddConstructorResults(Result R) { 7326f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor if (!SemaRef.getLangOptions().CPlusPlus || !R.Declaration || 7336f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor !CompletionContext.wantConstructorResults()) 7346f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor return; 7356f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 7366f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor ASTContext &Context = SemaRef.Context; 7376f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor NamedDecl *D = R.Declaration; 7386f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor CXXRecordDecl *Record = 0; 7396f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor if (ClassTemplateDecl *ClassTemplate = dyn_cast<ClassTemplateDecl>(D)) 7406f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor Record = ClassTemplate->getTemplatedDecl(); 7416f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor else if ((Record = dyn_cast<CXXRecordDecl>(D))) { 7426f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor // Skip specializations and partial specializations. 7436f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor if (isa<ClassTemplateSpecializationDecl>(Record)) 7446f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor return; 7456f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor } else { 7466f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor // There are no constructors here. 7476f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor return; 7486f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor } 7496f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 7506f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor Record = Record->getDefinition(); 7516f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor if (!Record) 7526f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor return; 7536f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 7546f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 7556f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor QualType RecordTy = Context.getTypeDeclType(Record); 7566f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor DeclarationName ConstructorName 7576f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor = Context.DeclarationNames.getCXXConstructorName( 7586f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor Context.getCanonicalType(RecordTy)); 7596f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor for (DeclContext::lookup_result Ctors = Record->lookup(ConstructorName); 7606f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor Ctors.first != Ctors.second; ++Ctors.first) { 7616f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor R.Declaration = *Ctors.first; 7626f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor R.CursorKind = getCursorKindForDecl(R.Declaration); 7636f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor Results.push_back(R); 7646f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor } 7656f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor} 7666f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 767e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregorvoid ResultBuilder::MaybeAddResult(Result R, DeclContext *CurContext) { 768e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor assert(!ShadowMaps.empty() && "Must enter into a results scope"); 769e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 770e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor if (R.Kind != Result::RK_Declaration) { 771e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor // For non-declaration results, just add the result. 772e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor Results.push_back(R); 773e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return; 774e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor } 775e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 776e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor // Look through using declarations. 777e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor if (UsingShadowDecl *Using = dyn_cast<UsingShadowDecl>(R.Declaration)) { 778e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor MaybeAddResult(Result(Using->getTargetDecl(), R.Qualifier), CurContext); 77986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return; 780e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor } 78186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 782e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor Decl *CanonDecl = R.Declaration->getCanonicalDecl(); 783e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor unsigned IDNS = CanonDecl->getIdentifierNamespace(); 784e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 78545bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor bool AsNestedNameSpecifier = false; 78645bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor if (!isInterestingDecl(R.Declaration, AsNestedNameSpecifier)) 787e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return; 788e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 7896f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor // C++ constructors are never found by name lookup. 7906f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor if (isa<CXXConstructorDecl>(R.Declaration)) 7916f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor return; 7926f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 79386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ShadowMap &SMap = ShadowMaps.back(); 794fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ShadowMapEntry::iterator I, IEnd; 795fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ShadowMap::iterator NamePos = SMap.find(R.Declaration->getDeclName()); 796fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (NamePos != SMap.end()) { 797fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor I = NamePos->second.begin(); 798fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor IEnd = NamePos->second.end(); 799fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 800fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 801fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor for (; I != IEnd; ++I) { 802fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor NamedDecl *ND = I->first; 803fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor unsigned Index = I->second; 80486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (ND->getCanonicalDecl() == CanonDecl) { 80586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // This is a redeclaration. Always pick the newer declaration. 80686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Results[Index].Declaration = R.Declaration; 80786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 80886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // We're done. 80986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return; 81086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 81186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 81286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 81386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // This is a new declaration in this scope. However, check whether this 81486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // declaration name is hidden by a similarly-named declaration in an outer 81586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // scope. 81686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor std::list<ShadowMap>::iterator SM, SMEnd = ShadowMaps.end(); 81786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor --SMEnd; 81886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor for (SM = ShadowMaps.begin(); SM != SMEnd; ++SM) { 819fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ShadowMapEntry::iterator I, IEnd; 820fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ShadowMap::iterator NamePos = SM->find(R.Declaration->getDeclName()); 821fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (NamePos != SM->end()) { 822fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor I = NamePos->second.begin(); 823fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor IEnd = NamePos->second.end(); 824fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 825fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor for (; I != IEnd; ++I) { 82686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // A tag declaration does not hide a non-tag declaration. 8270d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCall if (I->first->hasTagIdentifierNamespace() && 82886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor (IDNS & (Decl::IDNS_Member | Decl::IDNS_Ordinary | 82986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Decl::IDNS_ObjCProtocol))) 83086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor continue; 83186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 83286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Protocols are in distinct namespaces from everything else. 833fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (((I->first->getIdentifierNamespace() & Decl::IDNS_ObjCProtocol) 83486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor || (IDNS & Decl::IDNS_ObjCProtocol)) && 835fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor I->first->getIdentifierNamespace() != IDNS) 83686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor continue; 83786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 83886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // The newly-added result is hidden by an entry in the shadow map. 8396660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor if (CheckHiddenResult(R, CurContext, I->first)) 84086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return; 84186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 84286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor break; 84386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 84486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 84586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 84686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Make sure that any given declaration only shows up in the result set once. 84786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!AllDeclsFound.insert(CanonDecl)) 84886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return; 849265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor 850eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor // If the filter is for nested-name-specifiers, then this result starts a 851eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor // nested-name-specifier. 85212e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor if (AsNestedNameSpecifier) { 853eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor R.StartsNestedNameSpecifier = true; 85412e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor R.Priority = CCP_NestedNameSpecifier; 855cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor } else 856cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor AdjustResultPriorityForDecl(R); 857265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor 8580563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor // If this result is supposed to have an informative qualifier, add one. 859eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor if (R.QualifierIsInformative && !R.Qualifier && 860eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor !R.StartsNestedNameSpecifier) { 8610563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor DeclContext *Ctx = R.Declaration->getDeclContext(); 8620563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor if (NamespaceDecl *Namespace = dyn_cast<NamespaceDecl>(Ctx)) 8630563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor R.Qualifier = NestedNameSpecifier::Create(SemaRef.Context, 0, Namespace); 8640563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor else if (TagDecl *Tag = dyn_cast<TagDecl>(Ctx)) 8650563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor R.Qualifier = NestedNameSpecifier::Create(SemaRef.Context, 0, false, 8660563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor SemaRef.Context.getTypeDeclType(Tag).getTypePtr()); 8670563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor else 8680563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor R.QualifierIsInformative = false; 8690563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor } 870eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor 87186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Insert this result into the set of results and into the current shadow 87286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // map. 873fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor SMap[R.Declaration->getDeclName()].Add(R.Declaration, Results.size()); 87486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Results.push_back(R); 8756f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 8766f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor if (!AsNestedNameSpecifier) 8776f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor MaybeAddConstructorResults(R); 87886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 87986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 8801ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregorvoid ResultBuilder::AddResult(Result R, DeclContext *CurContext, 8810cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor NamedDecl *Hiding, bool InBaseClass = false) { 882a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor if (R.Kind != Result::RK_Declaration) { 883a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor // For non-declaration results, just add the result. 884a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.push_back(R); 885a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor return; 886a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor } 887a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor 8881ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor // Look through using declarations. 8891ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor if (UsingShadowDecl *Using = dyn_cast<UsingShadowDecl>(R.Declaration)) { 8901ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor AddResult(Result(Using->getTargetDecl(), R.Qualifier), CurContext, Hiding); 8911ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor return; 8921ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor } 8931ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 89445bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor bool AsNestedNameSpecifier = false; 89545bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor if (!isInterestingDecl(R.Declaration, AsNestedNameSpecifier)) 8961ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor return; 8971ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 8986f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor // C++ constructors are never found by name lookup. 8996f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor if (isa<CXXConstructorDecl>(R.Declaration)) 9006f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor return; 9016f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 9021ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor if (Hiding && CheckHiddenResult(R, CurContext, Hiding)) 9031ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor return; 9041ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 9051ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor // Make sure that any given declaration only shows up in the result set once. 9061ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor if (!AllDeclsFound.insert(R.Declaration->getCanonicalDecl())) 9071ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor return; 9081ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 9091ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor // If the filter is for nested-name-specifiers, then this result starts a 9101ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor // nested-name-specifier. 91112e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor if (AsNestedNameSpecifier) { 9121ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor R.StartsNestedNameSpecifier = true; 91312e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor R.Priority = CCP_NestedNameSpecifier; 91412e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor } 9150cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor else if (Filter == &ResultBuilder::IsMember && !R.Qualifier && InBaseClass && 9160cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor isa<CXXRecordDecl>(R.Declaration->getDeclContext() 9177a126a474fdde06382b315b4e3d8ef0a21d4dc31Sebastian Redl ->getRedeclContext())) 9180cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor R.QualifierIsInformative = true; 9190cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor 9201ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor // If this result is supposed to have an informative qualifier, add one. 9211ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor if (R.QualifierIsInformative && !R.Qualifier && 9221ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor !R.StartsNestedNameSpecifier) { 9231ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor DeclContext *Ctx = R.Declaration->getDeclContext(); 9241ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor if (NamespaceDecl *Namespace = dyn_cast<NamespaceDecl>(Ctx)) 9251ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor R.Qualifier = NestedNameSpecifier::Create(SemaRef.Context, 0, Namespace); 9261ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor else if (TagDecl *Tag = dyn_cast<TagDecl>(Ctx)) 9271ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor R.Qualifier = NestedNameSpecifier::Create(SemaRef.Context, 0, false, 92845bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor SemaRef.Context.getTypeDeclType(Tag).getTypePtr()); 9291ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor else 9301ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor R.QualifierIsInformative = false; 9311ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor } 9321ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 93312e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor // Adjust the priority if this result comes from a base class. 93412e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor if (InBaseClass) 93512e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor R.Priority += CCD_InBaseClass; 93612e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor 937cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor AdjustResultPriorityForDecl(R); 9385ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 9393cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor if (HasObjectTypeQualifiers) 9403cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(R.Declaration)) 9413cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor if (Method->isInstance()) { 9423cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor Qualifiers MethodQuals 9433cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor = Qualifiers::fromCVRMask(Method->getTypeQualifiers()); 9443cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor if (ObjectTypeQualifiers == MethodQuals) 9453cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor R.Priority += CCD_ObjectQualifierMatch; 9463cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor else if (ObjectTypeQualifiers - MethodQuals) { 9473cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor // The method cannot be invoked, because doing so would drop 9483cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor // qualifiers. 9493cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor return; 9503cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor } 9513cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor } 9523cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor 9531ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor // Insert this result into the set of results. 9541ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor Results.push_back(R); 9556f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 9566f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor if (!AsNestedNameSpecifier) 9576f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor MaybeAddConstructorResults(R); 9581ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor} 9591ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 960a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregorvoid ResultBuilder::AddResult(Result R) { 961a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor assert(R.Kind != Result::RK_Declaration && 962a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor "Declaration results need more context"); 963a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.push_back(R); 964a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor} 965a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor 96686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Enter into a new scope. 96786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorvoid ResultBuilder::EnterNewScope() { 96886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ShadowMaps.push_back(ShadowMap()); 96986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 97086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 97186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Exit from the current scope. 97286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorvoid ResultBuilder::ExitScope() { 973fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor for (ShadowMap::iterator E = ShadowMaps.back().begin(), 974fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor EEnd = ShadowMaps.back().end(); 975fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor E != EEnd; 976fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ++E) 977fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor E->second.Destroy(); 978fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 97986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ShadowMaps.pop_back(); 98086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 98186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 982791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor/// \brief Determines whether this given declaration will be found by 983791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor/// ordinary name lookup. 984791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregorbool ResultBuilder::IsOrdinaryName(NamedDecl *ND) const { 9854710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor ND = cast<NamedDecl>(ND->getUnderlyingDecl()); 9864710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor 987791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor unsigned IDNS = Decl::IDNS_Ordinary; 988791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus) 9899b30b267e77d1778e1e9b7c44b6852489c2c5096Douglas Gregor IDNS |= Decl::IDNS_Tag | Decl::IDNS_Namespace | Decl::IDNS_Member; 990ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor else if (SemaRef.getLangOptions().ObjC1) { 991ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor if (isa<ObjCIvarDecl>(ND)) 992ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor return true; 993ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor } 994ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor 995791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor return ND->getIdentifierNamespace() & IDNS; 996791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor} 997791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor 99801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor/// \brief Determines whether this given declaration will be found by 9994710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor/// ordinary name lookup but is not a type name. 10004710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregorbool ResultBuilder::IsOrdinaryNonTypeName(NamedDecl *ND) const { 10014710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor ND = cast<NamedDecl>(ND->getUnderlyingDecl()); 10024710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor if (isa<TypeDecl>(ND) || isa<ObjCInterfaceDecl>(ND)) 10034710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor return false; 10044710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor 10054710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor unsigned IDNS = Decl::IDNS_Ordinary; 10064710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus) 10079b30b267e77d1778e1e9b7c44b6852489c2c5096Douglas Gregor IDNS |= Decl::IDNS_Tag | Decl::IDNS_Namespace | Decl::IDNS_Member; 1008ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor else if (SemaRef.getLangOptions().ObjC1) { 1009ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor if (isa<ObjCIvarDecl>(ND)) 1010ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor return true; 1011ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor } 1012ca45da0c6da20d9c0c903370f99af5e9a186e0daDouglas Gregor 10134710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor return ND->getIdentifierNamespace() & IDNS; 10144710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor} 10154710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor 1016f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregorbool ResultBuilder::IsIntegralConstantValue(NamedDecl *ND) const { 1017f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor if (!IsOrdinaryNonTypeName(ND)) 1018f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor return 0; 1019f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor 1020f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor if (ValueDecl *VD = dyn_cast<ValueDecl>(ND->getUnderlyingDecl())) 1021f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor if (VD->getType()->isIntegralOrEnumerationType()) 1022f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor return true; 1023f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor 1024f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor return false; 1025f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor} 1026f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor 10274710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor/// \brief Determines whether this given declaration will be found by 102801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor/// ordinary name lookup. 102901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregorbool ResultBuilder::IsOrdinaryNonValueName(NamedDecl *ND) const { 10304710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor ND = cast<NamedDecl>(ND->getUnderlyingDecl()); 10314710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor 103201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor unsigned IDNS = Decl::IDNS_Ordinary; 103301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus) 10340d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCall IDNS |= Decl::IDNS_Tag | Decl::IDNS_Namespace; 103501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 103601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor return (ND->getIdentifierNamespace() & IDNS) && 10374710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor !isa<ValueDecl>(ND) && !isa<FunctionTemplateDecl>(ND) && 10384710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor !isa<ObjCPropertyDecl>(ND); 103901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor} 104001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 104186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Determines whether the given declaration is suitable as the 104286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// start of a C++ nested-name-specifier, e.g., a class or namespace. 104386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsNestedNameSpecifier(NamedDecl *ND) const { 104486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Allow us to find class templates, too. 104586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (ClassTemplateDecl *ClassTemplate = dyn_cast<ClassTemplateDecl>(ND)) 104686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ND = ClassTemplate->getTemplatedDecl(); 104786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 104886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return SemaRef.isAcceptableNestedNameSpecifier(ND); 104986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 105086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 105186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Determines whether the given declaration is an enumeration. 105286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsEnum(NamedDecl *ND) const { 105386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return isa<EnumDecl>(ND); 105486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 105586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 105686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Determines whether the given declaration is a class or struct. 105786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsClassOrStruct(NamedDecl *ND) const { 105886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Allow us to find class templates, too. 105986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (ClassTemplateDecl *ClassTemplate = dyn_cast<ClassTemplateDecl>(ND)) 106086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ND = ClassTemplate->getTemplatedDecl(); 106186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 106286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (RecordDecl *RD = dyn_cast<RecordDecl>(ND)) 1063465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara return RD->getTagKind() == TTK_Class || 1064465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara RD->getTagKind() == TTK_Struct; 106586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 106686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return false; 106786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 106886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 106986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Determines whether the given declaration is a union. 107086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsUnion(NamedDecl *ND) const { 107186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Allow us to find class templates, too. 107286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (ClassTemplateDecl *ClassTemplate = dyn_cast<ClassTemplateDecl>(ND)) 107386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ND = ClassTemplate->getTemplatedDecl(); 107486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 107586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (RecordDecl *RD = dyn_cast<RecordDecl>(ND)) 1076465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara return RD->getTagKind() == TTK_Union; 107786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 107886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return false; 107986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 108086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 108186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Determines whether the given declaration is a namespace. 108286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsNamespace(NamedDecl *ND) const { 108386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return isa<NamespaceDecl>(ND); 108486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 108586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 108686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Determines whether the given declaration is a namespace or 108786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// namespace alias. 108886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsNamespaceOrAlias(NamedDecl *ND) const { 108986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return isa<NamespaceDecl>(ND) || isa<NamespaceAliasDecl>(ND); 109086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 109186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 10927628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor/// \brief Determines whether the given declaration is a type. 109386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsType(NamedDecl *ND) const { 1094d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor if (UsingShadowDecl *Using = dyn_cast<UsingShadowDecl>(ND)) 1095d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor ND = Using->getTargetDecl(); 1096d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor 1097d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor return isa<TypeDecl>(ND) || isa<ObjCInterfaceDecl>(ND); 109886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 109986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 11007628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor/// \brief Determines which members of a class should be visible via 11017628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor/// "." or "->". Only value declarations, nested name specifiers, and 11027628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor/// using declarations thereof should show up. 1103eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregorbool ResultBuilder::IsMember(NamedDecl *ND) const { 11047628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor if (UsingShadowDecl *Using = dyn_cast<UsingShadowDecl>(ND)) 11057628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor ND = Using->getTargetDecl(); 11067628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor 1107ce82196076cd15f5ecfa029fcda8b58dc0146cf1Douglas Gregor return isa<ValueDecl>(ND) || isa<FunctionTemplateDecl>(ND) || 1108ce82196076cd15f5ecfa029fcda8b58dc0146cf1Douglas Gregor isa<ObjCPropertyDecl>(ND); 1109eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor} 1110eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor 11118e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregorstatic bool isObjCReceiverType(ASTContext &C, QualType T) { 11128e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor T = C.getCanonicalType(T); 11138e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor switch (T->getTypeClass()) { 11148e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor case Type::ObjCObject: 11158e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor case Type::ObjCInterface: 11168e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor case Type::ObjCObjectPointer: 11178e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor return true; 11188e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 11198e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor case Type::Builtin: 11208e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor switch (cast<BuiltinType>(T)->getKind()) { 11218e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor case BuiltinType::ObjCId: 11228e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor case BuiltinType::ObjCClass: 11238e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor case BuiltinType::ObjCSel: 11248e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor return true; 11258e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 11268e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor default: 11278e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor break; 11288e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor } 11298e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor return false; 11308e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 11318e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor default: 11328e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor break; 11338e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor } 11348e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 11358e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor if (!C.getLangOptions().CPlusPlus) 11368e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor return false; 11378e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 11388e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor // FIXME: We could perform more analysis here to determine whether a 11398e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor // particular class type has any conversions to Objective-C types. For now, 11408e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor // just accept all class types. 11418e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor return T->isDependentType() || T->isRecordType(); 11428e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor} 11438e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 11448e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregorbool ResultBuilder::IsObjCMessageReceiver(NamedDecl *ND) const { 11458e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor QualType T = getDeclUsageType(SemaRef.Context, ND); 11468e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor if (T.isNull()) 11478e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor return false; 11488e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 11498e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor T = SemaRef.Context.getBaseElementType(T); 11508e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor return isObjCReceiverType(SemaRef.Context, T); 11518e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor} 11528e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 1153fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregorbool ResultBuilder::IsObjCCollection(NamedDecl *ND) const { 1154fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor if ((SemaRef.getLangOptions().CPlusPlus && !IsOrdinaryName(ND)) || 1155fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor (!SemaRef.getLangOptions().CPlusPlus && !IsOrdinaryNonTypeName(ND))) 1156fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor return false; 1157fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor 1158fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor QualType T = getDeclUsageType(SemaRef.Context, ND); 1159fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor if (T.isNull()) 1160fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor return false; 1161fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor 1162fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor T = SemaRef.Context.getBaseElementType(T); 1163fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor return T->isObjCObjectType() || T->isObjCObjectPointerType() || 1164fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor T->isObjCIdType() || 1165fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor (SemaRef.getLangOptions().CPlusPlus && T->isRecordType()); 1166fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor} 11678e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 116852779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregorbool ResultBuilder::IsImpossibleToSatisfy(NamedDecl *ND) const { 116952779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor return false; 117052779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor} 117152779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor 117280f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor/// \rief Determines whether the given declaration is an Objective-C 117380f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor/// instance variable. 117480f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregorbool ResultBuilder::IsObjCIvar(NamedDecl *ND) const { 117580f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor return isa<ObjCIvarDecl>(ND); 117680f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor} 117780f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor 11781ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregornamespace { 11791ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// \brief Visible declaration consumer that adds a code-completion result 11801ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// for each visible declaration. 11811ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor class CodeCompletionDeclConsumer : public VisibleDeclConsumer { 11821ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor ResultBuilder &Results; 11831ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor DeclContext *CurContext; 11841ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 11851ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor public: 11861ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor CodeCompletionDeclConsumer(ResultBuilder &Results, DeclContext *CurContext) 11871ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor : Results(Results), CurContext(CurContext) { } 11881ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 1189d12059673dcef32bc2b6bae5321654d33863afe6Erik Verbruggen virtual void FoundDecl(NamedDecl *ND, NamedDecl *Hiding, DeclContext *Ctx, 1190d12059673dcef32bc2b6bae5321654d33863afe6Erik Verbruggen bool InBaseClass) { 1191d12059673dcef32bc2b6bae5321654d33863afe6Erik Verbruggen bool Accessible = true; 1192d12059673dcef32bc2b6bae5321654d33863afe6Erik Verbruggen if (Ctx) { 1193d12059673dcef32bc2b6bae5321654d33863afe6Erik Verbruggen if (CXXRecordDecl *Class = dyn_cast<CXXRecordDecl>(Ctx)) 1194d12059673dcef32bc2b6bae5321654d33863afe6Erik Verbruggen Accessible = Results.getSema().IsSimplyAccessible(ND, Class); 1195d12059673dcef32bc2b6bae5321654d33863afe6Erik Verbruggen // FIXME: ObjC access checks are missing. 1196d12059673dcef32bc2b6bae5321654d33863afe6Erik Verbruggen } 1197d12059673dcef32bc2b6bae5321654d33863afe6Erik Verbruggen ResultBuilder::Result Result(ND, 0, false, Accessible); 1198d12059673dcef32bc2b6bae5321654d33863afe6Erik Verbruggen Results.AddResult(Result, CurContext, Hiding, InBaseClass); 11991ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor } 12001ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor }; 12011ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor} 12021ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 120386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Add type specifiers for the current language as keyword results. 1204bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddTypeSpecifierResults(const LangOptions &LangOpts, 120586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ResultBuilder &Results) { 12060a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 120712e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("short", CCP_Type)); 120812e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("long", CCP_Type)); 120912e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("signed", CCP_Type)); 121012e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("unsigned", CCP_Type)); 121112e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("void", CCP_Type)); 121212e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("char", CCP_Type)); 121312e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("int", CCP_Type)); 121412e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("float", CCP_Type)); 121512e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("double", CCP_Type)); 121612e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("enum", CCP_Type)); 121712e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("struct", CCP_Type)); 121812e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("union", CCP_Type)); 121912e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("const", CCP_Type)); 122012e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("volatile", CCP_Type)); 122101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 122286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (LangOpts.C99) { 122386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // C99-specific 122412e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("_Complex", CCP_Type)); 122512e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("_Imaginary", CCP_Type)); 122612e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("_Bool", CCP_Type)); 122712e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("restrict", CCP_Type)); 122886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 122986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 1230218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder Builder(Results.getAllocator()); 123186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (LangOpts.CPlusPlus) { 123286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // C++-specific 1233b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor Results.AddResult(Result("bool", CCP_Type + 1234b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor (LangOpts.ObjC1? CCD_bool_in_ObjC : 0))); 123512e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("class", CCP_Type)); 123612e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("wchar_t", CCP_Type)); 123786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 1238c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // typename qualified-id 1239218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("typename"); 1240218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1241218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("qualifier"); 1242218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("::"); 1243218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("name"); 1244218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1245d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor 124686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (LangOpts.CPlusPlus0x) { 124712e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("auto", CCP_Type)); 124812e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("char16_t", CCP_Type)); 124912e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("char32_t", CCP_Type)); 1250c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor 1251218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("decltype"); 1252218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1253218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1254218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1255218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 125686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 125786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 125886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 125986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // GNU extensions 126086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (LangOpts.GNUMode) { 126186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // FIXME: Enable when we actually support decimal floating point. 1262a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor // Results.AddResult(Result("_Decimal32")); 1263a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor // Results.AddResult(Result("_Decimal64")); 1264a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor // Results.AddResult(Result("_Decimal128")); 126501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1266218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("typeof"); 1267218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1268218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1269218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1270c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor 1271218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("typeof"); 1272218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1273218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("type"); 1274218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1275218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 127601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 127701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor} 127801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1279f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCallstatic void AddStorageSpecifiers(Sema::ParserCompletionContext CCC, 128001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor const LangOptions &LangOpts, 128101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor ResultBuilder &Results) { 12820a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 128301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Note: we don't suggest either "auto" or "register", because both 128401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // are pointless as storage specifiers. Elsewhere, we suggest "auto" 128501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // in C++0x as a type specifier. 1286a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("extern")); 1287a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("static")); 128801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor} 128901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1290f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCallstatic void AddFunctionSpecifiers(Sema::ParserCompletionContext CCC, 129101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor const LangOptions &LangOpts, 129201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor ResultBuilder &Results) { 12930a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 129401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor switch (CCC) { 1295f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Class: 1296f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_MemberTemplate: 129701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (LangOpts.CPlusPlus) { 1298a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("explicit")); 1299a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("friend")); 1300a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("mutable")); 1301a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("virtual")); 130201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 130301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Fall through 130401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1305f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ObjCInterface: 1306f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ObjCImplementation: 1307f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Namespace: 1308f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Template: 130901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (LangOpts.CPlusPlus || LangOpts.C99) 1310a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("inline")); 131101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 131201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1313f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ObjCInstanceVariableList: 1314f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Expression: 1315f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Statement: 1316f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ForInit: 1317f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Condition: 1318f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_RecoveryInFunction: 1319f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Type: 13200268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor case Sema::PCC_ParenthesizedExpression: 132168e3c2eef52701a178fbcc2bb424f31dd4b36931Douglas Gregor case Sema::PCC_LocalDeclarationSpecifiers: 132201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 132301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 132401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor} 132501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1326bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCExpressionResults(ResultBuilder &Results, bool NeedAt); 1327bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCStatementResults(ResultBuilder &Results, bool NeedAt); 1328bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCVisibilityResults(const LangOptions &LangOpts, 1329c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor ResultBuilder &Results, 1330c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor bool NeedAt); 1331bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCImplementationResults(const LangOptions &LangOpts, 1332b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor ResultBuilder &Results, 1333b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor bool NeedAt); 1334bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCInterfaceResults(const LangOptions &LangOpts, 1335b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor ResultBuilder &Results, 1336b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor bool NeedAt); 1337bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCTopLevelResults(ResultBuilder &Results, bool NeedAt); 1338b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 1339c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregorstatic void AddTypedefResult(ResultBuilder &Results) { 1340218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder Builder(Results.getAllocator()); 1341218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("typedef"); 1342218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1343218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("type"); 1344218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1345218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("name"); 1346218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(CodeCompletionResult(Builder.TakeString())); 1347c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor} 1348c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor 1349f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCallstatic bool WantTypesInContext(Sema::ParserCompletionContext CCC, 13504710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor const LangOptions &LangOpts) { 13514710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor switch (CCC) { 1352f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Namespace: 1353f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Class: 1354f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ObjCInstanceVariableList: 1355f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Template: 1356f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_MemberTemplate: 1357f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Statement: 1358f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_RecoveryInFunction: 1359f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Type: 13600268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor case Sema::PCC_ParenthesizedExpression: 136168e3c2eef52701a178fbcc2bb424f31dd4b36931Douglas Gregor case Sema::PCC_LocalDeclarationSpecifiers: 13624710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor return true; 13634710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor 1364f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Expression: 1365f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Condition: 13660268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor return LangOpts.CPlusPlus; 13670268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor 13680268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor case Sema::PCC_ObjCInterface: 13690268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor case Sema::PCC_ObjCImplementation: 13704710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor return false; 13714710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor 1372f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ForInit: 13730268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor return LangOpts.CPlusPlus || LangOpts.ObjC1 || LangOpts.C99; 13744710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor } 13754710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor 13764710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor return false; 13774710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor} 13784710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor 13798ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor/// \brief Retrieve a printing policy suitable for code completion. 13808ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregorstatic PrintingPolicy getCompletionPrintingPolicy(Sema &S) { 13818ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor PrintingPolicy Policy = S.getPrintingPolicy(); 13828ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Policy.AnonymousTagLocations = false; 13838ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Policy.SuppressStrongLifetime = true; 13848ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor return Policy; 13858ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor} 13868ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor 13878ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor/// \brief Retrieve the string representation of the given type as a string 13888ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor/// that has the appropriate lifetime for code completion. 13898ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor/// 13908ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor/// This routine provides a fast path where we provide constant strings for 13918ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor/// common type names. 13928ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregorstatic const char *GetCompletionTypeString(QualType T, 13938ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor ASTContext &Context, 13948ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor const PrintingPolicy &Policy, 13958ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor CodeCompletionAllocator &Allocator) { 13968ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor if (!T.getLocalQualifiers()) { 13978ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor // Built-in type names are constant strings. 13988ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor if (const BuiltinType *BT = dyn_cast<BuiltinType>(T)) 13998ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor return BT->getName(Policy); 14008ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor 14018ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor // Anonymous tag types are constant strings. 14028ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor if (const TagType *TagT = dyn_cast<TagType>(T)) 14038ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor if (TagDecl *Tag = TagT->getDecl()) 14048ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor if (!Tag->getIdentifier() && !Tag->getTypedefNameForAnonDecl()) { 14058ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor switch (Tag->getTagKind()) { 14068ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor case TTK_Struct: return "struct <anonymous>"; 14078ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor case TTK_Class: return "class <anonymous>"; 14088ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor case TTK_Union: return "union <anonymous>"; 14098ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor case TTK_Enum: return "enum <anonymous>"; 14108ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor } 14118ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor } 14128ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor } 14138ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor 14148ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor // Slow path: format the type as a string. 14158ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor std::string Result; 14168ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor T.getAsStringInternal(Result, Policy); 14178ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor return Allocator.CopyString(Result); 14188ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor} 14198ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor 142001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor/// \brief Add language constructs that show up for "ordinary" names. 1421f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCallstatic void AddOrdinaryNameResults(Sema::ParserCompletionContext CCC, 142201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Scope *S, 142301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Sema &SemaRef, 142401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor ResultBuilder &Results) { 14258ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor CodeCompletionAllocator &Allocator = Results.getAllocator(); 14268ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor CodeCompletionBuilder Builder(Allocator); 14278ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor PrintingPolicy Policy = getCompletionPrintingPolicy(SemaRef); 1428218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor 14290a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 143001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor switch (CCC) { 1431f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Namespace: 1432c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor if (SemaRef.getLangOptions().CPlusPlus) { 1433c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor if (Results.includeCodePatterns()) { 1434c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // namespace <identifier> { declarations } 1435218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("namespace"); 1436218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1437218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("identifier"); 1438218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 1439218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("declarations"); 1440218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 1441218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 1442218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1443c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor } 1444c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor 144501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // namespace identifier = identifier ; 1446218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("namespace"); 1447218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1448218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("name"); 1449218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_Equal); 1450218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("namespace"); 1451218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 145201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 145301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Using directives 1454218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("using"); 1455218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1456218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("namespace"); 1457218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1458218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("identifier"); 1459218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 146001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 146101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // asm(string-literal) 1462218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("asm"); 1463218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1464218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("string-literal"); 1465218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1466218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 146701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1468c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor if (Results.includeCodePatterns()) { 1469c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // Explicit template instantiation 1470218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("template"); 1471218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1472218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("declaration"); 1473218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1474c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor } 147501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 1476b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 1477b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor if (SemaRef.getLangOptions().ObjC1) 1478bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCTopLevelResults(Results, true); 1479b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 1480c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor AddTypedefResult(Results); 148101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Fall through 148201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1483f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Class: 1484c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor if (SemaRef.getLangOptions().CPlusPlus) { 148501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Using declaration 1486218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("using"); 1487218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1488218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("qualifier"); 1489218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("::"); 1490218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("name"); 1491218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 149201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1493c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // using typename qualifier::name (only in a dependent context) 149401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (SemaRef.CurContext->isDependentContext()) { 1495218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("using"); 1496218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1497218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("typename"); 1498218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1499218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("qualifier"); 1500218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("::"); 1501218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("name"); 1502218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 150301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 150401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1505f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall if (CCC == Sema::PCC_Class) { 1506c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor AddTypedefResult(Results); 1507c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor 150801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // public: 1509218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("public"); 1510218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_Colon); 1511218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 151201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 151301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // protected: 1514218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("protected"); 1515218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_Colon); 1516218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 151701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 151801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // private: 1519218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("private"); 1520218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_Colon); 1521218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 152201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 152301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 152401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Fall through 152501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1526f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Template: 1527f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_MemberTemplate: 1528d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus && Results.includeCodePatterns()) { 152901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // template < parameters > 1530218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("template"); 1531218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftAngle); 1532218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("parameters"); 1533218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightAngle); 1534218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 153501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 153601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1537bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddStorageSpecifiers(CCC, SemaRef.getLangOptions(), Results); 1538bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddFunctionSpecifiers(CCC, SemaRef.getLangOptions(), Results); 153901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 154001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1541f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ObjCInterface: 1542bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCInterfaceResults(SemaRef.getLangOptions(), Results, true); 1543bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddStorageSpecifiers(CCC, SemaRef.getLangOptions(), Results); 1544bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddFunctionSpecifiers(CCC, SemaRef.getLangOptions(), Results); 1545b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor break; 1546b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 1547f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ObjCImplementation: 1548bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCImplementationResults(SemaRef.getLangOptions(), Results, true); 1549bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddStorageSpecifiers(CCC, SemaRef.getLangOptions(), Results); 1550bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddFunctionSpecifiers(CCC, SemaRef.getLangOptions(), Results); 1551b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor break; 1552b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 1553f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ObjCInstanceVariableList: 1554bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCVisibilityResults(SemaRef.getLangOptions(), Results, true); 1555c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor break; 1556c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor 1557f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_RecoveryInFunction: 1558f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Statement: { 1559c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor AddTypedefResult(Results); 156001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1561ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor if (SemaRef.getLangOptions().CPlusPlus && Results.includeCodePatterns() && 1562ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor SemaRef.getLangOptions().CXXExceptions) { 1563218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("try"); 1564218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 1565218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("statements"); 1566218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 1567218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 1568218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("catch"); 1569218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1570218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("declaration"); 1571218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1572218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 1573218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("statements"); 1574218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 1575218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 1576218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 157701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 1578b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor if (SemaRef.getLangOptions().ObjC1) 1579bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCStatementResults(Results, true); 1580b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 1581d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor if (Results.includeCodePatterns()) { 1582d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor // if (condition) { statements } 1583218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("if"); 1584218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1585d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus) 1586218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("condition"); 1587d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor else 1588218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1589218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1590218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 1591218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("statements"); 1592218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 1593218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 1594218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 159501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1596d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor // switch (condition) { } 1597218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("switch"); 1598218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1599d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus) 1600218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("condition"); 1601d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor else 1602218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1603218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1604218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 1605218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 1606218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 1607218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1608d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor } 1609d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor 161001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Switch-specific statements. 1611781472fe99a120098c631b0cbe33c89f8cef5e70John McCall if (!SemaRef.getCurFunction()->SwitchStack.empty()) { 161201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // case expression: 1613218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("case"); 1614218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1615218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1616218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_Colon); 1617218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 161801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 161901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // default: 1620218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("default"); 1621218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_Colon); 1622218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 162301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 162401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1625d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor if (Results.includeCodePatterns()) { 1626d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor /// while (condition) { statements } 1627218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("while"); 1628218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1629d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus) 1630218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("condition"); 1631d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor else 1632218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1633218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1634218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 1635218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("statements"); 1636218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 1637218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 1638218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 163901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1640d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor // do { statements } while ( expression ); 1641218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("do"); 1642218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 1643218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("statements"); 1644218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 1645218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 1646218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("while"); 1647218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1648218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1649218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1650218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 165101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1652d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor // for ( for-init-statement ; condition ; expression ) { statements } 1653218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("for"); 1654218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1655d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus || SemaRef.getLangOptions().C99) 1656218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("init-statement"); 1657d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor else 1658218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("init-expression"); 1659218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_SemiColon); 1660218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("condition"); 1661218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_SemiColon); 1662218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("inc-expression"); 1663218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1664218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 1665218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 1666218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("statements"); 1667218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 1668218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 1669218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1670d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor } 167101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 167201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (S->getContinueParent()) { 167301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // continue ; 1674218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("continue"); 1675218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 167601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 167701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 167801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (S->getBreakParent()) { 167901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // break ; 1680218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("break"); 1681218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 168201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 168301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 168401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // "return expression ;" or "return ;", depending on whether we 168501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // know the function is void or not. 168601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor bool isVoid = false; 168701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (FunctionDecl *Function = dyn_cast<FunctionDecl>(SemaRef.CurContext)) 168801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor isVoid = Function->getResultType()->isVoidType(); 168901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor else if (ObjCMethodDecl *Method 169001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor = dyn_cast<ObjCMethodDecl>(SemaRef.CurContext)) 169101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor isVoid = Method->getResultType()->isVoidType(); 16929ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor else if (SemaRef.getCurBlock() && 16939ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor !SemaRef.getCurBlock()->ReturnType.isNull()) 16949ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor isVoid = SemaRef.getCurBlock()->ReturnType->isVoidType(); 1695218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("return"); 16969329800d6f4c4ea8778aabd64cde1b712b290b00Douglas Gregor if (!isVoid) { 1697218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1698218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 16999329800d6f4c4ea8778aabd64cde1b712b290b00Douglas Gregor } 1700218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 170101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1702c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // goto identifier ; 1703218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("goto"); 1704218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1705218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("label"); 1706218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 170701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1708c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // Using directives 1709218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("using"); 1710218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1711218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("namespace"); 1712218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1713218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("identifier"); 1714218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 171501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 171601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 171701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Fall through (for statement expressions). 1718f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ForInit: 1719f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Condition: 1720bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddStorageSpecifiers(CCC, SemaRef.getLangOptions(), Results); 172101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Fall through: conditions and statements can have expressions. 172201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 17230268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor case Sema::PCC_ParenthesizedExpression: 1724f85e193739c953358c865005855253af4f68a497John McCall if (SemaRef.getLangOptions().ObjCAutoRefCount && 1725f85e193739c953358c865005855253af4f68a497John McCall CCC == Sema::PCC_ParenthesizedExpression) { 1726f85e193739c953358c865005855253af4f68a497John McCall // (__bridge <type>)<expression> 1727f85e193739c953358c865005855253af4f68a497John McCall Builder.AddTypedTextChunk("__bridge"); 1728f85e193739c953358c865005855253af4f68a497John McCall Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1729f85e193739c953358c865005855253af4f68a497John McCall Builder.AddPlaceholderChunk("type"); 1730f85e193739c953358c865005855253af4f68a497John McCall Builder.AddChunk(CodeCompletionString::CK_RightParen); 1731f85e193739c953358c865005855253af4f68a497John McCall Builder.AddPlaceholderChunk("expression"); 1732f85e193739c953358c865005855253af4f68a497John McCall Results.AddResult(Result(Builder.TakeString())); 1733f85e193739c953358c865005855253af4f68a497John McCall 1734f85e193739c953358c865005855253af4f68a497John McCall // (__bridge_transfer <Objective-C type>)<expression> 1735f85e193739c953358c865005855253af4f68a497John McCall Builder.AddTypedTextChunk("__bridge_transfer"); 1736f85e193739c953358c865005855253af4f68a497John McCall Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1737f85e193739c953358c865005855253af4f68a497John McCall Builder.AddPlaceholderChunk("Objective-C type"); 1738f85e193739c953358c865005855253af4f68a497John McCall Builder.AddChunk(CodeCompletionString::CK_RightParen); 1739f85e193739c953358c865005855253af4f68a497John McCall Builder.AddPlaceholderChunk("expression"); 1740f85e193739c953358c865005855253af4f68a497John McCall Results.AddResult(Result(Builder.TakeString())); 1741f85e193739c953358c865005855253af4f68a497John McCall 1742f85e193739c953358c865005855253af4f68a497John McCall // (__bridge_retained <CF type>)<expression> 1743f85e193739c953358c865005855253af4f68a497John McCall Builder.AddTypedTextChunk("__bridge_retained"); 1744f85e193739c953358c865005855253af4f68a497John McCall Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1745f85e193739c953358c865005855253af4f68a497John McCall Builder.AddPlaceholderChunk("CF type"); 1746f85e193739c953358c865005855253af4f68a497John McCall Builder.AddChunk(CodeCompletionString::CK_RightParen); 1747f85e193739c953358c865005855253af4f68a497John McCall Builder.AddPlaceholderChunk("expression"); 1748f85e193739c953358c865005855253af4f68a497John McCall Results.AddResult(Result(Builder.TakeString())); 1749f85e193739c953358c865005855253af4f68a497John McCall } 1750f85e193739c953358c865005855253af4f68a497John McCall // Fall through 1751f85e193739c953358c865005855253af4f68a497John McCall 1752f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Expression: { 175301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus) { 175401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // 'this', if we're in a non-static member function. 17558ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor QualType ThisTy = SemaRef.getCurrentThisType(false); 17568ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor if (!ThisTy.isNull()) { 17578ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk(GetCompletionTypeString(ThisTy, 17588ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor SemaRef.Context, 17598ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Policy, 17608ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Allocator)); 17618ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddTypedTextChunk("this"); 17628ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 17638ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor } 17648ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor 17658ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor // true 17668ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("bool"); 17678ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddTypedTextChunk("true"); 17688ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 176901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 17708ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor // false 17718ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("bool"); 17728ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddTypedTextChunk("false"); 17738ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 177401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1775ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor if (SemaRef.getLangOptions().RTTI) { 1776ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor // dynamic_cast < type-id > ( expression ) 1777ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddTypedTextChunk("dynamic_cast"); 1778ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftAngle); 1779ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddPlaceholderChunk("type"); 1780ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightAngle); 1781ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1782ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1783ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1784ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1785ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor } 1786c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor 1787c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // static_cast < type-id > ( expression ) 1788218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("static_cast"); 1789218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftAngle); 1790218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("type"); 1791218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightAngle); 1792218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1793218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1794218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1795218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1796d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor 1797c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // reinterpret_cast < type-id > ( expression ) 1798218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("reinterpret_cast"); 1799218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftAngle); 1800218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("type"); 1801218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightAngle); 1802218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1803218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1804218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1805218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1806d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor 1807c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // const_cast < type-id > ( expression ) 1808218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("const_cast"); 1809218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftAngle); 1810218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("type"); 1811218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightAngle); 1812218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1813218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1814218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1815218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1816d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor 1817ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor if (SemaRef.getLangOptions().RTTI) { 1818ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor // typeid ( expression-or-type ) 18198ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("std::type_info"); 1820ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddTypedTextChunk("typeid"); 1821ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1822ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddPlaceholderChunk("expression-or-type"); 1823ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1824ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1825ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor } 1826ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor 1827c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // new T ( ... ) 1828218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("new"); 1829218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1830218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("type"); 1831218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1832218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expressions"); 1833218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1834218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 183501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1836c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // new T [ ] ( ... ) 1837218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("new"); 1838218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1839218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("type"); 1840218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBracket); 1841218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("size"); 1842218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBracket); 1843218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1844218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expressions"); 1845218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1846218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 184701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1848c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // delete expression 18498ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("void"); 1850218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("delete"); 1851218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1852218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1853218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 185401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1855c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // delete [] expression 18568ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("void"); 1857218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("delete"); 1858218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1859218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBracket); 1860218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBracket); 1861218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1862218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1863218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1864c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor 1865ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor if (SemaRef.getLangOptions().CXXExceptions) { 1866ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor // throw expression 18678ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("void"); 1868ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddTypedTextChunk("throw"); 1869ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1870ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1871ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1872ec3310a1e371cc3bfc0f2c355767d1b6653357f2Douglas Gregor } 1873a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor 187412e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor // FIXME: Rethrow? 1875a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor 1876a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor if (SemaRef.getLangOptions().CPlusPlus0x) { 1877a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor // nullptr 18788ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("std::nullptr_t"); 1879a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddTypedTextChunk("nullptr"); 1880a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1881a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor 1882a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor // alignof 18838ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("size_t"); 1884a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddTypedTextChunk("alignof"); 1885a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1886a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddPlaceholderChunk("type"); 1887a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1888a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1889a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor 1890a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor // noexcept 18918ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("bool"); 1892a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddTypedTextChunk("noexcept"); 1893a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1894a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddPlaceholderChunk("expression"); 1895a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1896a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1897a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor 1898a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor // sizeof... expression 18998ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("size_t"); 1900a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddTypedTextChunk("sizeof..."); 1901a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1902a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddPlaceholderChunk("parameter-pack"); 1903a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1904a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 1905a50216cdd5c4102b051d5837c239ec0bb5bde6e5Douglas Gregor } 190601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 190701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 190801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (SemaRef.getLangOptions().ObjC1) { 190901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Add "super", if we're in an Objective-C class with a superclass. 1910681e256048cf9d3d226b9d0699f3df22c2500ef4Ted Kremenek if (ObjCMethodDecl *Method = SemaRef.getCurMethodDecl()) { 1911681e256048cf9d3d226b9d0699f3df22c2500ef4Ted Kremenek // The interface can be NULL. 1912681e256048cf9d3d226b9d0699f3df22c2500ef4Ted Kremenek if (ObjCInterfaceDecl *ID = Method->getClassInterface()) 19138ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor if (ID->getSuperClass()) { 19148ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor std::string SuperType; 19158ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor SuperType = ID->getSuperClass()->getNameAsString(); 19168ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor if (Method->isInstanceMethod()) 19178ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor SuperType += " *"; 19188ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor 19198ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk(Allocator.CopyString(SuperType)); 19208ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddTypedTextChunk("super"); 19218ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 19228ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor } 1923681e256048cf9d3d226b9d0699f3df22c2500ef4Ted Kremenek } 1924681e256048cf9d3d226b9d0699f3df22c2500ef4Ted Kremenek 1925bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCExpressionResults(Results, true); 192601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 192701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1928c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // sizeof expression 19298ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("size_t"); 1930218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("sizeof"); 1931218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1932218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression-or-type"); 1933218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 1934218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 193501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 193686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 1937d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor 1938f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Type: 193968e3c2eef52701a178fbcc2bb424f31dd4b36931Douglas Gregor case Sema::PCC_LocalDeclarationSpecifiers: 1940d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor break; 194101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 194201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 19434710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor if (WantTypesInContext(CCC, SemaRef.getLangOptions())) 19444710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor AddTypeSpecifierResults(SemaRef.getLangOptions(), Results); 194501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1946f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall if (SemaRef.getLangOptions().CPlusPlus && CCC != Sema::PCC_Type) 1947a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("operator")); 194886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 194986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 1950ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor/// \brief If the given declaration has an associated type, add it as a result 1951ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor/// type chunk. 1952ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregorstatic void AddResultTypeChunk(ASTContext &Context, 19538987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor const PrintingPolicy &Policy, 1954ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor NamedDecl *ND, 1955218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder &Result) { 1956ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor if (!ND) 1957ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor return; 19586f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 19596f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor // Skip constructors and conversion functions, which have their return types 19606f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor // built into their names. 19616f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor if (isa<CXXConstructorDecl>(ND) || isa<CXXConversionDecl>(ND)) 19626f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor return; 19636f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 1964ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor // Determine the type of the declaration (if it has a type). 19656f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor QualType T; 1966ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor if (FunctionDecl *Function = dyn_cast<FunctionDecl>(ND)) 1967ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor T = Function->getResultType(); 1968ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor else if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(ND)) 1969ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor T = Method->getResultType(); 1970ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor else if (FunctionTemplateDecl *FunTmpl = dyn_cast<FunctionTemplateDecl>(ND)) 1971ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor T = FunTmpl->getTemplatedDecl()->getResultType(); 1972ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor else if (EnumConstantDecl *Enumerator = dyn_cast<EnumConstantDecl>(ND)) 1973ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor T = Context.getTypeDeclType(cast<TypeDecl>(Enumerator->getDeclContext())); 1974ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor else if (isa<UnresolvedUsingValueDecl>(ND)) { 1975ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor /* Do nothing: ignore unresolved using declarations*/ 1976f85e193739c953358c865005855253af4f68a497John McCall } else if (ValueDecl *Value = dyn_cast<ValueDecl>(ND)) { 1977ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor T = Value->getType(); 1978f85e193739c953358c865005855253af4f68a497John McCall } else if (ObjCPropertyDecl *Property = dyn_cast<ObjCPropertyDecl>(ND)) 1979ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor T = Property->getType(); 1980ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor 1981ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor if (T.isNull() || Context.hasSameType(T, Context.DependentTy)) 1982ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor return; 1983ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor 19848987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor Result.AddResultTypeChunk(GetCompletionTypeString(T, Context, Policy, 1985a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor Result.getAllocator())); 1986ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor} 1987ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor 1988aaa107acc8f906203101af259e8d764b5027700aDouglas Gregorstatic void MaybeAddSentinel(ASTContext &Context, NamedDecl *FunctionOrMethod, 1989218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder &Result) { 1990aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor if (SentinelAttr *Sentinel = FunctionOrMethod->getAttr<SentinelAttr>()) 1991aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor if (Sentinel->getSentinel() == 0) { 1992aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor if (Context.getLangOptions().ObjC1 && 1993aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor Context.Idents.get("nil").hasMacroDefinition()) 1994218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddTextChunk(", nil"); 1995aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor else if (Context.Idents.get("NULL").hasMacroDefinition()) 1996218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddTextChunk(", NULL"); 1997aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor else 1998218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddTextChunk(", (void*)0"); 1999aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor } 2000aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor} 2001aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor 20026fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregorstatic void appendWithSpace(std::string &Result, StringRef Text) { 20036fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor if (!Result.empty()) 20046fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor Result += ' '; 20056fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor Result += Text.str(); 20066fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor} 20076fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregorstatic std::string formatObjCParamQualifiers(unsigned ObjCQuals) { 20086fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor std::string Result; 20096fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor if (ObjCQuals & Decl::OBJC_TQ_In) 20106fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor appendWithSpace(Result, "in"); 20116fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor else if (ObjCQuals & Decl::OBJC_TQ_Inout) 20126fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor appendWithSpace(Result, "inout"); 20136fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor else if (ObjCQuals & Decl::OBJC_TQ_Out) 20146fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor appendWithSpace(Result, "out"); 20156fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor if (ObjCQuals & Decl::OBJC_TQ_Bycopy) 20166fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor appendWithSpace(Result, "bycopy"); 20176fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor else if (ObjCQuals & Decl::OBJC_TQ_Byref) 20186fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor appendWithSpace(Result, "byref"); 20196fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor if (ObjCQuals & Decl::OBJC_TQ_Oneway) 20206fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor appendWithSpace(Result, "oneway"); 20216fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor return Result; 20226fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor} 20236fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor 202483482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregorstatic std::string FormatFunctionParameter(ASTContext &Context, 20258987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor const PrintingPolicy &Policy, 2026aba480862485ea1140a81f25c23f43bb080edc90Douglas Gregor ParmVarDecl *Param, 2027ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor bool SuppressName = false, 2028ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor bool SuppressBlock = false) { 202983482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor bool ObjCMethodParam = isa<ObjCMethodDecl>(Param->getDeclContext()); 203083482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor if (Param->getType()->isDependentType() || 203183482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor !Param->getType()->isBlockPointerType()) { 203283482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor // The argument for a dependent or non-block parameter is a placeholder 203383482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor // containing that parameter's type. 203483482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor std::string Result; 203583482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor 2036aba480862485ea1140a81f25c23f43bb080edc90Douglas Gregor if (Param->getIdentifier() && !ObjCMethodParam && !SuppressName) 203783482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor Result = Param->getIdentifier()->getName(); 203883482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor 2039f85e193739c953358c865005855253af4f68a497John McCall Param->getType().getAsStringInternal(Result, Policy); 204083482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor 204183482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor if (ObjCMethodParam) { 20426fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor Result = "(" + formatObjCParamQualifiers(Param->getObjCDeclQualifier()) 20436fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor + Result + ")"; 2044aba480862485ea1140a81f25c23f43bb080edc90Douglas Gregor if (Param->getIdentifier() && !SuppressName) 204583482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor Result += Param->getIdentifier()->getName(); 204683482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor } 204783482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor return Result; 204883482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor } 204983482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor 205083482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor // The argument for a block pointer parameter is a block literal with 205183482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor // the appropriate type. 2052830072c2de881aadfe0f6efd3baccc9129a77e37Douglas Gregor FunctionTypeLoc *Block = 0; 2053830072c2de881aadfe0f6efd3baccc9129a77e37Douglas Gregor FunctionProtoTypeLoc *BlockProto = 0; 205483482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor TypeLoc TL; 205583482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor if (TypeSourceInfo *TSInfo = Param->getTypeSourceInfo()) { 205683482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor TL = TSInfo->getTypeLoc().getUnqualifiedLoc(); 205783482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor while (true) { 205883482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor // Look through typedefs. 2059ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor if (!SuppressBlock) { 2060ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor if (TypedefTypeLoc *TypedefTL = dyn_cast<TypedefTypeLoc>(&TL)) { 2061ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor if (TypeSourceInfo *InnerTSInfo 2062ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor = TypedefTL->getTypedefNameDecl()->getTypeSourceInfo()) { 2063ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor TL = InnerTSInfo->getTypeLoc().getUnqualifiedLoc(); 2064ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor continue; 2065ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor } 2066ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor } 2067ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor 2068ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor // Look through qualified types 2069ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor if (QualifiedTypeLoc *QualifiedTL = dyn_cast<QualifiedTypeLoc>(&TL)) { 2070ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor TL = QualifiedTL->getUnqualifiedLoc(); 207183482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor continue; 207283482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor } 207383482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor } 207483482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor 207583482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor // Try to get the function prototype behind the block pointer type, 207683482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor // then we're done. 207783482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor if (BlockPointerTypeLoc *BlockPtr 207883482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor = dyn_cast<BlockPointerTypeLoc>(&TL)) { 2079723df245307a530da5433dfb43accf187dc3e243Abramo Bagnara TL = BlockPtr->getPointeeLoc().IgnoreParens(); 2080830072c2de881aadfe0f6efd3baccc9129a77e37Douglas Gregor Block = dyn_cast<FunctionTypeLoc>(&TL); 2081830072c2de881aadfe0f6efd3baccc9129a77e37Douglas Gregor BlockProto = dyn_cast<FunctionProtoTypeLoc>(&TL); 208283482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor } 208383482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor break; 208483482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor } 208583482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor } 208683482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor 208783482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor if (!Block) { 208883482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor // We were unable to find a FunctionProtoTypeLoc with parameter names 208983482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor // for the block; just use the parameter type as a placeholder. 209083482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor std::string Result; 2091ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor if (!ObjCMethodParam && Param->getIdentifier()) 2092ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Result = Param->getIdentifier()->getName(); 2093ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor 2094f85e193739c953358c865005855253af4f68a497John McCall Param->getType().getUnqualifiedType().getAsStringInternal(Result, Policy); 209583482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor 209683482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor if (ObjCMethodParam) { 20976fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor Result = "(" + formatObjCParamQualifiers(Param->getObjCDeclQualifier()) 20986fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor + Result + ")"; 209983482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor if (Param->getIdentifier()) 210083482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor Result += Param->getIdentifier()->getName(); 210183482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor } 210283482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor 210383482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor return Result; 210483482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor } 2105ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor 210683482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor // We have the function prototype behind the block pointer type, as it was 210783482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor // written in the source. 2108382762582c8fcbc06b395a806fd57879381897a8Douglas Gregor std::string Result; 2109382762582c8fcbc06b395a806fd57879381897a8Douglas Gregor QualType ResultType = Block->getTypePtr()->getResultType(); 2110ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor if (!ResultType->isVoidType() || SuppressBlock) 2111f85e193739c953358c865005855253af4f68a497John McCall ResultType.getAsStringInternal(Result, Policy); 2112ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor 2113ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor // Format the parameter list. 2114ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor std::string Params; 2115830072c2de881aadfe0f6efd3baccc9129a77e37Douglas Gregor if (!BlockProto || Block->getNumArgs() == 0) { 2116830072c2de881aadfe0f6efd3baccc9129a77e37Douglas Gregor if (BlockProto && BlockProto->getTypePtr()->isVariadic()) 2117ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Params = "(...)"; 2118c2760bc8e99510c4b3848fcd21323afd711ee269Douglas Gregor else 2119ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Params = "(void)"; 2120382762582c8fcbc06b395a806fd57879381897a8Douglas Gregor } else { 2121ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Params += "("; 2122382762582c8fcbc06b395a806fd57879381897a8Douglas Gregor for (unsigned I = 0, N = Block->getNumArgs(); I != N; ++I) { 2123382762582c8fcbc06b395a806fd57879381897a8Douglas Gregor if (I) 2124ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Params += ", "; 2125ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Params += FormatFunctionParameter(Context, Policy, Block->getArg(I), 2126ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor /*SuppressName=*/false, 2127ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor /*SuppressBlock=*/true); 2128382762582c8fcbc06b395a806fd57879381897a8Douglas Gregor 2129830072c2de881aadfe0f6efd3baccc9129a77e37Douglas Gregor if (I == N - 1 && BlockProto->getTypePtr()->isVariadic()) 2130ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Params += ", ..."; 2131382762582c8fcbc06b395a806fd57879381897a8Douglas Gregor } 2132ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Params += ")"; 2133ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor } 2134ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor 2135ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor if (SuppressBlock) { 2136ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor // Format as a parameter. 2137ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Result = Result + " (^"; 2138ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor if (Param->getIdentifier()) 2139ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Result += Param->getIdentifier()->getName(); 2140382762582c8fcbc06b395a806fd57879381897a8Douglas Gregor Result += ")"; 2141ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Result += Params; 2142ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor } else { 2143ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor // Format as a block literal argument. 2144ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Result = '^' + Result; 2145ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Result += Params; 2146ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor 2147ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor if (Param->getIdentifier()) 2148ee1c68a0d9de322424b368b9e6dc58fa3daefcebDouglas Gregor Result += Param->getIdentifier()->getName(); 2149e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor } 2150382762582c8fcbc06b395a806fd57879381897a8Douglas Gregor 215183482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor return Result; 215283482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor} 215383482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor 215486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Add function parameter chunks to the given code completion string. 215586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorstatic void AddFunctionParameterChunks(ASTContext &Context, 21568987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor const PrintingPolicy &Policy, 215786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor FunctionDecl *Function, 2158218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder &Result, 2159218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor unsigned Start = 0, 2160218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor bool InOptional = false) { 21610c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor typedef CodeCompletionString::Chunk Chunk; 2162218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor bool FirstParameter = true; 21630c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 2164218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor for (unsigned P = Start, N = Function->getNumParams(); P != N; ++P) { 216586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ParmVarDecl *Param = Function->getParamDecl(P); 216686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 2167218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor if (Param->hasDefaultArg() && !InOptional) { 216886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // When we see an optional default argument, put that argument and 216986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // the remaining default arguments into a new, optional string. 2170218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder Opt(Result.getAllocator()); 2171218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor if (!FirstParameter) 2172218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Opt.AddChunk(Chunk(CodeCompletionString::CK_Comma)); 21738987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor AddFunctionParameterChunks(Context, Policy, Function, Opt, P, true); 2174218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddOptionalChunk(Opt.TakeString()); 2175218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor break; 217686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 217786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 2178218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor if (FirstParameter) 2179218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor FirstParameter = false; 2180218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor else 2181218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(Chunk(CodeCompletionString::CK_Comma)); 2182218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor 2183218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor InOptional = false; 218486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 218586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Format the placeholder string. 21868987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor std::string PlaceholderStr = FormatFunctionParameter(Context, Policy, 21878987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor Param); 218883482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor 2189e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor if (Function->isVariadic() && P == N - 1) 2190e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor PlaceholderStr += ", ..."; 2191e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor 219286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add the placeholder string. 2193dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddPlaceholderChunk( 2194dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.getAllocator().CopyString(PlaceholderStr)); 219586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 2196b3d4525c65cf456d3f1f4338afdcac83afc7be02Douglas Gregor 2197b3d4525c65cf456d3f1f4338afdcac83afc7be02Douglas Gregor if (const FunctionProtoType *Proto 2198b3d4525c65cf456d3f1f4338afdcac83afc7be02Douglas Gregor = Function->getType()->getAs<FunctionProtoType>()) 2199aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor if (Proto->isVariadic()) { 2200e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor if (Proto->getNumArgs() == 0) 2201218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddPlaceholderChunk("..."); 2202aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor 2203218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor MaybeAddSentinel(Context, Function, Result); 2204aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor } 220586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 220686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 220786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Add template parameter chunks to the given code completion string. 220886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorstatic void AddTemplateParameterChunks(ASTContext &Context, 22098987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor const PrintingPolicy &Policy, 221086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor TemplateDecl *Template, 2211218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder &Result, 2212218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor unsigned MaxParameters = 0, 2213218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor unsigned Start = 0, 2214218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor bool InDefaultArg = false) { 22150c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor typedef CodeCompletionString::Chunk Chunk; 221686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool FirstParameter = true; 221786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 221886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor TemplateParameterList *Params = Template->getTemplateParameters(); 221986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor TemplateParameterList::iterator PEnd = Params->end(); 222086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (MaxParameters) 222186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PEnd = Params->begin() + MaxParameters; 2222218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor for (TemplateParameterList::iterator P = Params->begin() + Start; 2223218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor P != PEnd; ++P) { 222486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool HasDefaultArg = false; 222586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor std::string PlaceholderStr; 222686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(*P)) { 222786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (TTP->wasDeclaredWithTypename()) 222886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr = "typename"; 222986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor else 223086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr = "class"; 223186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 223286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (TTP->getIdentifier()) { 223386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr += ' '; 223486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr += TTP->getIdentifier()->getName(); 223586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 223686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 223786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor HasDefaultArg = TTP->hasDefaultArgument(); 223886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } else if (NonTypeTemplateParmDecl *NTTP 2239218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor = dyn_cast<NonTypeTemplateParmDecl>(*P)) { 224086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (NTTP->getIdentifier()) 224186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr = NTTP->getIdentifier()->getName(); 2242f85e193739c953358c865005855253af4f68a497John McCall NTTP->getType().getAsStringInternal(PlaceholderStr, Policy); 224386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor HasDefaultArg = NTTP->hasDefaultArgument(); 224486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } else { 224586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor assert(isa<TemplateTemplateParmDecl>(*P)); 224686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor TemplateTemplateParmDecl *TTP = cast<TemplateTemplateParmDecl>(*P); 224786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 224886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Since putting the template argument list into the placeholder would 224986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // be very, very long, we just use an abbreviation. 225086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr = "template<...> class"; 225186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (TTP->getIdentifier()) { 225286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr += ' '; 225386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr += TTP->getIdentifier()->getName(); 225486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 225586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 225686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor HasDefaultArg = TTP->hasDefaultArgument(); 225786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 225886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 2259218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor if (HasDefaultArg && !InDefaultArg) { 226086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // When we see an optional default argument, put that argument and 226186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // the remaining default arguments into a new, optional string. 2262218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder Opt(Result.getAllocator()); 2263218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor if (!FirstParameter) 2264218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Opt.AddChunk(Chunk(CodeCompletionString::CK_Comma)); 22658987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor AddTemplateParameterChunks(Context, Policy, Template, Opt, MaxParameters, 2266218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor P - Params->begin(), true); 2267218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddOptionalChunk(Opt.TakeString()); 2268218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor break; 226986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 227086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 2271218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor InDefaultArg = false; 2272218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor 227386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (FirstParameter) 227486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor FirstParameter = false; 227586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor else 2276218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(Chunk(CodeCompletionString::CK_Comma)); 227786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 227886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add the placeholder string. 2279dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddPlaceholderChunk( 2280dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.getAllocator().CopyString(PlaceholderStr)); 228186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 228286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 228386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 2284b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor/// \brief Add a qualifier to the given code-completion string, if the 2285b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor/// provided nested-name-specifier is non-NULL. 2286a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregorstatic void 2287218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas GregorAddQualifierToCompletionString(CodeCompletionBuilder &Result, 2288a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor NestedNameSpecifier *Qualifier, 2289a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor bool QualifierIsInformative, 22908987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor ASTContext &Context, 22918987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor const PrintingPolicy &Policy) { 2292b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor if (!Qualifier) 2293b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor return; 2294b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor 2295b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor std::string PrintedNNS; 2296b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor { 2297b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor llvm::raw_string_ostream OS(PrintedNNS); 22988987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor Qualifier->print(OS, Policy); 2299b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor } 23000563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor if (QualifierIsInformative) 2301dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddInformativeChunk(Result.getAllocator().CopyString(PrintedNNS)); 23020563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor else 2303dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTextChunk(Result.getAllocator().CopyString(PrintedNNS)); 2304b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor} 2305b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor 2306218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregorstatic void 2307218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas GregorAddFunctionTypeQualsToCompletionString(CodeCompletionBuilder &Result, 2308218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor FunctionDecl *Function) { 2309a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor const FunctionProtoType *Proto 2310a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor = Function->getType()->getAs<FunctionProtoType>(); 2311a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor if (!Proto || !Proto->getTypeQuals()) 2312a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor return; 2313a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor 2314a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor // FIXME: Add ref-qualifier! 2315a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor 2316a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor // Handle single qualifiers without copying 2317a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor if (Proto->getTypeQuals() == Qualifiers::Const) { 2318a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor Result.AddInformativeChunk(" const"); 2319a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor return; 2320a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor } 2321a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor 2322a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor if (Proto->getTypeQuals() == Qualifiers::Volatile) { 2323a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor Result.AddInformativeChunk(" volatile"); 2324a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor return; 2325a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor } 2326a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor 2327a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor if (Proto->getTypeQuals() == Qualifiers::Restrict) { 2328a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor Result.AddInformativeChunk(" restrict"); 2329a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor return; 2330a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor } 2331a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor 2332a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor // Handle multiple qualifiers. 2333a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor std::string QualsStr; 2334a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor if (Proto->getTypeQuals() & Qualifiers::Const) 2335a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor QualsStr += " const"; 2336a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor if (Proto->getTypeQuals() & Qualifiers::Volatile) 2337a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor QualsStr += " volatile"; 2338a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor if (Proto->getTypeQuals() & Qualifiers::Restrict) 2339a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor QualsStr += " restrict"; 2340dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddInformativeChunk(Result.getAllocator().CopyString(QualsStr)); 2341a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor} 2342a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor 23436f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor/// \brief Add the name of the given declaration 23448987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregorstatic void AddTypedNameChunk(ASTContext &Context, const PrintingPolicy &Policy, 23458987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor NamedDecl *ND, CodeCompletionBuilder &Result) { 23466f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor typedef CodeCompletionString::Chunk Chunk; 23476f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 23486f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor DeclarationName Name = ND->getDeclName(); 23496f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor if (!Name) 23506f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor return; 23516f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 23526f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor switch (Name.getNameKind()) { 2353a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor case DeclarationName::CXXOperatorName: { 2354a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor const char *OperatorName = 0; 2355a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor switch (Name.getCXXOverloadedOperator()) { 2356a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor case OO_None: 2357a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor case OO_Conditional: 2358a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor case NUM_OVERLOADED_OPERATORS: 2359a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor OperatorName = "operator"; 2360a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor break; 2361a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor 2362a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 2363a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor case OO_##Name: OperatorName = "operator" Spelling; break; 2364a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor#define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly) 2365a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor#include "clang/Basic/OperatorKinds.def" 2366a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor 2367a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor case OO_New: OperatorName = "operator new"; break; 2368a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor case OO_Delete: OperatorName = "operator delete"; break; 2369a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor case OO_Array_New: OperatorName = "operator new[]"; break; 2370a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor case OO_Array_Delete: OperatorName = "operator delete[]"; break; 2371a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor case OO_Call: OperatorName = "operator()"; break; 2372a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor case OO_Subscript: OperatorName = "operator[]"; break; 2373a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor } 2374a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor Result.AddTypedTextChunk(OperatorName); 2375a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor break; 2376a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor } 2377a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor 23786f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case DeclarationName::Identifier: 23796f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case DeclarationName::CXXConversionFunctionName: 23806f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case DeclarationName::CXXDestructorName: 23816f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case DeclarationName::CXXLiteralOperatorName: 2382dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTypedTextChunk( 2383dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.getAllocator().CopyString(ND->getNameAsString())); 23846f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor break; 23856f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 23866f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case DeclarationName::CXXUsingDirective: 23876f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case DeclarationName::ObjCZeroArgSelector: 23886f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case DeclarationName::ObjCOneArgSelector: 23896f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case DeclarationName::ObjCMultiArgSelector: 23906f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor break; 23916f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 23926f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case DeclarationName::CXXConstructorName: { 23936f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor CXXRecordDecl *Record = 0; 23946f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor QualType Ty = Name.getCXXNameType(); 23956f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor if (const RecordType *RecordTy = Ty->getAs<RecordType>()) 23966f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor Record = cast<CXXRecordDecl>(RecordTy->getDecl()); 23976f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor else if (const InjectedClassNameType *InjectedTy 23986f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor = Ty->getAs<InjectedClassNameType>()) 23996f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor Record = InjectedTy->getDecl(); 24006f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor else { 2401dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTypedTextChunk( 2402dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.getAllocator().CopyString(ND->getNameAsString())); 24036f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor break; 24046f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor } 24056f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 2406dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTypedTextChunk( 2407dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.getAllocator().CopyString(Record->getNameAsString())); 24086f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor if (ClassTemplateDecl *Template = Record->getDescribedClassTemplate()) { 2409218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(Chunk(CodeCompletionString::CK_LeftAngle)); 24108987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor AddTemplateParameterChunks(Context, Policy, Template, Result); 2411218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(Chunk(CodeCompletionString::CK_RightAngle)); 24126f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor } 24136f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor break; 24146f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor } 24156f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor } 24166f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor} 24176f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 241886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief If possible, create a new code completion string for the given 241986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// result. 242086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// 242186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \returns Either a new, heap-allocated code completion string describing 242286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// how to use this result, or NULL to indicate that the string or name of the 242386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// result is all that is needed. 242486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas GregorCodeCompletionString * 24250a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCallCodeCompletionResult::CreateCodeCompletionString(Sema &S, 2426dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor CodeCompletionAllocator &Allocator) { 24270c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor typedef CodeCompletionString::Chunk Chunk; 2428218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder Result(Allocator, Priority, Availability); 24290c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 24308987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor PrintingPolicy Policy = getCompletionPrintingPolicy(S); 2431218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor if (Kind == RK_Pattern) { 2432218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Pattern->Priority = Priority; 2433218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Pattern->Availability = Availability; 2434218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Pattern; 2435218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor } 24362b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 24372b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor if (Kind == RK_Keyword) { 2438218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddTypedTextChunk(Keyword); 2439218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Result.TakeString(); 24402b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor } 244186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 24423f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor if (Kind == RK_Macro) { 24433f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor MacroInfo *MI = S.PP.getMacroInfo(Macro); 24442b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor assert(MI && "Not a macro?"); 24452b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 2446dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTypedTextChunk( 2447dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.getAllocator().CopyString(Macro->getName())); 24482b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 24492b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor if (!MI->isFunctionLike()) 2450218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Result.TakeString(); 24513f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor 24523f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor // Format a function-like macro with placeholders for the arguments. 2453218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(Chunk(CodeCompletionString::CK_LeftParen)); 2454e42447021239015db97202fb04c304d82e84135fDouglas Gregor bool CombineVariadicArgument = false; 2455e42447021239015db97202fb04c304d82e84135fDouglas Gregor MacroInfo::arg_iterator A = MI->arg_begin(), AEnd = MI->arg_end(); 2456e42447021239015db97202fb04c304d82e84135fDouglas Gregor if (MI->isVariadic() && AEnd - A > 1) { 2457e42447021239015db97202fb04c304d82e84135fDouglas Gregor AEnd -= 2; 2458e42447021239015db97202fb04c304d82e84135fDouglas Gregor CombineVariadicArgument = true; 2459e42447021239015db97202fb04c304d82e84135fDouglas Gregor } 2460e42447021239015db97202fb04c304d82e84135fDouglas Gregor for (MacroInfo::arg_iterator A = MI->arg_begin(); A != AEnd; ++A) { 24613f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor if (A != MI->arg_begin()) 2462218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(Chunk(CodeCompletionString::CK_Comma)); 24633f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor 2464e42447021239015db97202fb04c304d82e84135fDouglas Gregor if (!MI->isVariadic() || A + 1 != AEnd) { 24653f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor // Non-variadic argument. 2466dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddPlaceholderChunk( 2467dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.getAllocator().CopyString((*A)->getName())); 24683f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor continue; 24693f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor } 24703f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor 2471e42447021239015db97202fb04c304d82e84135fDouglas Gregor // Variadic argument; cope with the difference between GNU and C99 24723f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor // variadic macros, providing a single placeholder for the rest of the 24733f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor // arguments. 24743f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor if ((*A)->isStr("__VA_ARGS__")) 2475218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddPlaceholderChunk("..."); 24763f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor else { 24773f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor std::string Arg = (*A)->getName(); 24783f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor Arg += "..."; 2479dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddPlaceholderChunk(Result.getAllocator().CopyString(Arg)); 24803f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor } 24813f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor } 2482e42447021239015db97202fb04c304d82e84135fDouglas Gregor 2483e42447021239015db97202fb04c304d82e84135fDouglas Gregor if (CombineVariadicArgument) { 2484e42447021239015db97202fb04c304d82e84135fDouglas Gregor // Handle the next-to-last argument, combining it with the variadic 2485e42447021239015db97202fb04c304d82e84135fDouglas Gregor // argument. 2486e42447021239015db97202fb04c304d82e84135fDouglas Gregor std::string LastArg = (*A)->getName(); 2487e42447021239015db97202fb04c304d82e84135fDouglas Gregor ++A; 2488e42447021239015db97202fb04c304d82e84135fDouglas Gregor if ((*A)->isStr("__VA_ARGS__")) 2489e42447021239015db97202fb04c304d82e84135fDouglas Gregor LastArg += ", ..."; 2490e42447021239015db97202fb04c304d82e84135fDouglas Gregor else 2491e42447021239015db97202fb04c304d82e84135fDouglas Gregor LastArg += ", " + (*A)->getName().str() + "..."; 2492e42447021239015db97202fb04c304d82e84135fDouglas Gregor Result.AddPlaceholderChunk(Result.getAllocator().CopyString(LastArg)); 2493e42447021239015db97202fb04c304d82e84135fDouglas Gregor } 2494218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(Chunk(CodeCompletionString::CK_RightParen)); 2495218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Result.TakeString(); 24963f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor } 24973f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor 2498d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor assert(Kind == RK_Declaration && "Missed a result kind?"); 249986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NamedDecl *ND = Declaration; 250086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 25010c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor if (StartsNestedNameSpecifier) { 2502dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTypedTextChunk( 2503dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.getAllocator().CopyString(ND->getNameAsString())); 2504218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddTextChunk("::"); 2505218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Result.TakeString(); 25060c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor } 25076164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen 25086164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen for (Decl::attr_iterator i = ND->attr_begin(); i != ND->attr_end(); ++i) { 25096164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen if (AnnotateAttr *Attr = dyn_cast_or_null<AnnotateAttr>(*i)) { 25106164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen Result.AddAnnotation(Result.getAllocator().CopyString(Attr->getAnnotation())); 25116164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen } 25126164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen } 25130c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 25148987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor AddResultTypeChunk(S.Context, Policy, ND, Result); 2515ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor 251686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (FunctionDecl *Function = dyn_cast<FunctionDecl>(ND)) { 25170563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative, 25188987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor S.Context, Policy); 25198987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor AddTypedNameChunk(S.Context, Policy, ND, Result); 2520218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(Chunk(CodeCompletionString::CK_LeftParen)); 25218987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor AddFunctionParameterChunks(S.Context, Policy, Function, Result); 2522218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(Chunk(CodeCompletionString::CK_RightParen)); 2523a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor AddFunctionTypeQualsToCompletionString(Result, Function); 2524218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Result.TakeString(); 252586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 252686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 252786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (FunctionTemplateDecl *FunTmpl = dyn_cast<FunctionTemplateDecl>(ND)) { 25280563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative, 25298987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor S.Context, Policy); 253086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor FunctionDecl *Function = FunTmpl->getTemplatedDecl(); 25318987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor AddTypedNameChunk(S.Context, Policy, Function, Result); 25326f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 253386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Figure out which template parameters are deduced (or have default 253486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // arguments). 25355f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<bool, 16> Deduced; 253686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor S.MarkDeducedTemplateParameters(FunTmpl, Deduced); 253786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor unsigned LastDeducibleArgument; 253886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor for (LastDeducibleArgument = Deduced.size(); LastDeducibleArgument > 0; 253986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor --LastDeducibleArgument) { 254086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!Deduced[LastDeducibleArgument - 1]) { 254186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // C++0x: Figure out if the template argument has a default. If so, 254286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // the user doesn't need to type this argument. 254386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // FIXME: We need to abstract template parameters better! 254486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool HasDefaultArg = false; 254586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NamedDecl *Param = FunTmpl->getTemplateParameters()->getParam( 2546218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor LastDeducibleArgument - 1); 254786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(Param)) 254886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor HasDefaultArg = TTP->hasDefaultArgument(); 254986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor else if (NonTypeTemplateParmDecl *NTTP 255086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor = dyn_cast<NonTypeTemplateParmDecl>(Param)) 255186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor HasDefaultArg = NTTP->hasDefaultArgument(); 255286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor else { 255386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor assert(isa<TemplateTemplateParmDecl>(Param)); 255486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor HasDefaultArg 25550c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor = cast<TemplateTemplateParmDecl>(Param)->hasDefaultArgument(); 255686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 255786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 255886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!HasDefaultArg) 255986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor break; 256086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 256186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 256286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 256386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (LastDeducibleArgument) { 256486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Some of the function template arguments cannot be deduced from a 256586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // function call, so we introduce an explicit template argument list 256686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // containing all of the arguments up to the first deducible argument. 2567218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(Chunk(CodeCompletionString::CK_LeftAngle)); 25688987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor AddTemplateParameterChunks(S.Context, Policy, FunTmpl, Result, 256986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor LastDeducibleArgument); 2570218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(Chunk(CodeCompletionString::CK_RightAngle)); 257186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 257286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 257386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add the function parameters 2574218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(Chunk(CodeCompletionString::CK_LeftParen)); 25758987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor AddFunctionParameterChunks(S.Context, Policy, Function, Result); 2576218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(Chunk(CodeCompletionString::CK_RightParen)); 2577a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor AddFunctionTypeQualsToCompletionString(Result, Function); 2578218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Result.TakeString(); 257986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 258086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 258186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (TemplateDecl *Template = dyn_cast<TemplateDecl>(ND)) { 25820563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative, 25838987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor S.Context, Policy); 2584dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTypedTextChunk( 2585dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.getAllocator().CopyString(Template->getNameAsString())); 2586218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(Chunk(CodeCompletionString::CK_LeftAngle)); 25878987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor AddTemplateParameterChunks(S.Context, Policy, Template, Result); 2588218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(Chunk(CodeCompletionString::CK_RightAngle)); 2589218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Result.TakeString(); 259086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 259186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 25929630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(ND)) { 25939630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor Selector Sel = Method->getSelector(); 25949630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor if (Sel.isUnarySelector()) { 2595dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTypedTextChunk(Result.getAllocator().CopyString( 2596813d8346529bf094eb2b249648906ba7fd226688Douglas Gregor Sel.getNameForSlot(0))); 2597218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Result.TakeString(); 25989630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor } 25999630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor 2600813d8346529bf094eb2b249648906ba7fd226688Douglas Gregor std::string SelName = Sel.getNameForSlot(0).str(); 2601d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor SelName += ':'; 2602d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor if (StartParameter == 0) 2603dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTypedTextChunk(Result.getAllocator().CopyString(SelName)); 2604d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor else { 2605dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddInformativeChunk(Result.getAllocator().CopyString(SelName)); 2606d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor 2607d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor // If there is only one parameter, and we're past it, add an empty 2608d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor // typed-text chunk since there is nothing to type. 2609d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor if (Method->param_size() == 1) 2610218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddTypedTextChunk(""); 2611d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor } 26129630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor unsigned Idx = 0; 26139630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor for (ObjCMethodDecl::param_iterator P = Method->param_begin(), 26149630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor PEnd = Method->param_end(); 26159630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor P != PEnd; (void)++P, ++Idx) { 26169630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor if (Idx > 0) { 2617d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor std::string Keyword; 2618d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor if (Idx > StartParameter) 2619218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(CodeCompletionString::CK_HorizontalSpace); 26209630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor if (IdentifierInfo *II = Sel.getIdentifierInfoForSlot(Idx)) 2621a0651c5f5d1c8928d3ae062435ed9cf0aa0d04baBenjamin Kramer Keyword += II->getName(); 26229630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor Keyword += ":"; 26231f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor if (Idx < StartParameter || AllParametersAreInformative) 2624dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddInformativeChunk(Result.getAllocator().CopyString(Keyword)); 2625c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor else 2626dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTypedTextChunk(Result.getAllocator().CopyString(Keyword)); 26279630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor } 2628d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor 2629d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor // If we're before the starting parameter, skip the placeholder. 2630d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor if (Idx < StartParameter) 2631d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor continue; 26329630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor 26339630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor std::string Arg; 263483482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor 263583482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor if ((*P)->getType()->isBlockPointerType() && !DeclaringEntity) 26368987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor Arg = FormatFunctionParameter(S.Context, Policy, *P, true); 263783482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor else { 2638f85e193739c953358c865005855253af4f68a497John McCall (*P)->getType().getAsStringInternal(Arg, Policy); 26396fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor Arg = "(" + formatObjCParamQualifiers((*P)->getObjCDeclQualifier()) 26406fa14dde4ce536c4b09f9b52cad5471682ec6fd3Douglas Gregor + Arg + ")"; 264183482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor if (IdentifierInfo *II = (*P)->getIdentifier()) 2642aba480862485ea1140a81f25c23f43bb080edc90Douglas Gregor if (DeclaringEntity || AllParametersAreInformative) 2643a0651c5f5d1c8928d3ae062435ed9cf0aa0d04baBenjamin Kramer Arg += II->getName(); 264483482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor } 264583482d147a37c4d4f0562f73b0766279c500ffd1Douglas Gregor 2646e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor if (Method->isVariadic() && (P + 1) == PEnd) 2647e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor Arg += ", ..."; 2648e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor 26491f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor if (DeclaringEntity) 2650dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTextChunk(Result.getAllocator().CopyString(Arg)); 26511f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor else if (AllParametersAreInformative) 2652dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddInformativeChunk(Result.getAllocator().CopyString(Arg)); 26534ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor else 2654dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddPlaceholderChunk(Result.getAllocator().CopyString(Arg)); 26559630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor } 26569630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor 26572a17af0c7e05500e25d4cc71341f1f232085ebeaDouglas Gregor if (Method->isVariadic()) { 2658e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor if (Method->param_size() == 0) { 2659e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor if (DeclaringEntity) 2660218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddTextChunk(", ..."); 2661e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor else if (AllParametersAreInformative) 2662218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddInformativeChunk(", ..."); 2663e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor else 2664218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddPlaceholderChunk(", ..."); 2665e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor } 2666aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor 2667aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor MaybeAddSentinel(S.Context, Method, Result); 26682a17af0c7e05500e25d4cc71341f1f232085ebeaDouglas Gregor } 26692a17af0c7e05500e25d4cc71341f1f232085ebeaDouglas Gregor 2670218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Result.TakeString(); 26719630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor } 26729630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor 26732b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor if (Qualifier) 26740563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative, 26758987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor S.Context, Policy); 26762b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 2677dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTypedTextChunk( 2678dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.getAllocator().CopyString(ND->getNameAsString())); 2679218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Result.TakeString(); 268086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 268186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 268286d802e03a267af79663990c39865c67e0645238Douglas GregorCodeCompletionString * 268386d802e03a267af79663990c39865c67e0645238Douglas GregorCodeCompleteConsumer::OverloadCandidate::CreateSignatureString( 268486d802e03a267af79663990c39865c67e0645238Douglas Gregor unsigned CurrentArg, 268532be4a588fbb87d0d163ead49c42f5438bf0b2b7Douglas Gregor Sema &S, 2686dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor CodeCompletionAllocator &Allocator) const { 26870c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor typedef CodeCompletionString::Chunk Chunk; 26888987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor PrintingPolicy Policy = getCompletionPrintingPolicy(S); 2689f85e193739c953358c865005855253af4f68a497John McCall 2690218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor // FIXME: Set priority, availability appropriately. 2691218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder Result(Allocator, 1, CXAvailability_Available); 269286d802e03a267af79663990c39865c67e0645238Douglas Gregor FunctionDecl *FDecl = getFunction(); 26938987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor AddResultTypeChunk(S.Context, Policy, FDecl, Result); 269486d802e03a267af79663990c39865c67e0645238Douglas Gregor const FunctionProtoType *Proto 269586d802e03a267af79663990c39865c67e0645238Douglas Gregor = dyn_cast<FunctionProtoType>(getFunctionType()); 269686d802e03a267af79663990c39865c67e0645238Douglas Gregor if (!FDecl && !Proto) { 269786d802e03a267af79663990c39865c67e0645238Douglas Gregor // Function without a prototype. Just give the return type and a 269886d802e03a267af79663990c39865c67e0645238Douglas Gregor // highlighted ellipsis. 269986d802e03a267af79663990c39865c67e0645238Douglas Gregor const FunctionType *FT = getFunctionType(); 2700a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor Result.AddTextChunk(GetCompletionTypeString(FT->getResultType(), 27018987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor S.Context, Policy, 2702a63f6ded17176845615a7b4e3c3d390862b9a842Douglas Gregor Result.getAllocator())); 2703218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(Chunk(CodeCompletionString::CK_LeftParen)); 2704218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(Chunk(CodeCompletionString::CK_CurrentParameter, "...")); 2705218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(Chunk(CodeCompletionString::CK_RightParen)); 2706218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Result.TakeString(); 270786d802e03a267af79663990c39865c67e0645238Douglas Gregor } 270886d802e03a267af79663990c39865c67e0645238Douglas Gregor 270986d802e03a267af79663990c39865c67e0645238Douglas Gregor if (FDecl) 2710dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTextChunk( 2711dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.getAllocator().CopyString(FDecl->getNameAsString())); 271286d802e03a267af79663990c39865c67e0645238Douglas Gregor else 2713218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddTextChunk( 2714dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.getAllocator().CopyString( 2715f85e193739c953358c865005855253af4f68a497John McCall Proto->getResultType().getAsString(Policy))); 271686d802e03a267af79663990c39865c67e0645238Douglas Gregor 2717218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(Chunk(CodeCompletionString::CK_LeftParen)); 271886d802e03a267af79663990c39865c67e0645238Douglas Gregor unsigned NumParams = FDecl? FDecl->getNumParams() : Proto->getNumArgs(); 271986d802e03a267af79663990c39865c67e0645238Douglas Gregor for (unsigned I = 0; I != NumParams; ++I) { 272086d802e03a267af79663990c39865c67e0645238Douglas Gregor if (I) 2721218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(Chunk(CodeCompletionString::CK_Comma)); 272286d802e03a267af79663990c39865c67e0645238Douglas Gregor 272386d802e03a267af79663990c39865c67e0645238Douglas Gregor std::string ArgString; 272486d802e03a267af79663990c39865c67e0645238Douglas Gregor QualType ArgType; 272586d802e03a267af79663990c39865c67e0645238Douglas Gregor 272686d802e03a267af79663990c39865c67e0645238Douglas Gregor if (FDecl) { 272786d802e03a267af79663990c39865c67e0645238Douglas Gregor ArgString = FDecl->getParamDecl(I)->getNameAsString(); 272886d802e03a267af79663990c39865c67e0645238Douglas Gregor ArgType = FDecl->getParamDecl(I)->getOriginalType(); 272986d802e03a267af79663990c39865c67e0645238Douglas Gregor } else { 273086d802e03a267af79663990c39865c67e0645238Douglas Gregor ArgType = Proto->getArgType(I); 273186d802e03a267af79663990c39865c67e0645238Douglas Gregor } 273286d802e03a267af79663990c39865c67e0645238Douglas Gregor 2733f85e193739c953358c865005855253af4f68a497John McCall ArgType.getAsStringInternal(ArgString, Policy); 273486d802e03a267af79663990c39865c67e0645238Douglas Gregor 273586d802e03a267af79663990c39865c67e0645238Douglas Gregor if (I == CurrentArg) 2736218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(Chunk(CodeCompletionString::CK_CurrentParameter, 2737dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.getAllocator().CopyString(ArgString))); 273886d802e03a267af79663990c39865c67e0645238Douglas Gregor else 2739dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Result.AddTextChunk(Result.getAllocator().CopyString(ArgString)); 274086d802e03a267af79663990c39865c67e0645238Douglas Gregor } 274186d802e03a267af79663990c39865c67e0645238Douglas Gregor 274286d802e03a267af79663990c39865c67e0645238Douglas Gregor if (Proto && Proto->isVariadic()) { 2743218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(Chunk(CodeCompletionString::CK_Comma)); 274486d802e03a267af79663990c39865c67e0645238Douglas Gregor if (CurrentArg < NumParams) 2745218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddTextChunk("..."); 274686d802e03a267af79663990c39865c67e0645238Douglas Gregor else 2747218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(Chunk(CodeCompletionString::CK_CurrentParameter, "...")); 274886d802e03a267af79663990c39865c67e0645238Douglas Gregor } 2749218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Result.AddChunk(Chunk(CodeCompletionString::CK_RightParen)); 275086d802e03a267af79663990c39865c67e0645238Douglas Gregor 2751218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor return Result.TakeString(); 275286d802e03a267af79663990c39865c67e0645238Douglas Gregor} 275386d802e03a267af79663990c39865c67e0645238Douglas Gregor 27545f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerunsigned clang::getMacroUsagePriority(StringRef MacroName, 2755b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor const LangOptions &LangOpts, 27561827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor bool PreferredTypeIsPointer) { 27571827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor unsigned Priority = CCP_Macro; 27581827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor 2759b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor // Treat the "nil", "Nil" and "NULL" macros as null pointer constants. 2760b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor if (MacroName.equals("nil") || MacroName.equals("NULL") || 2761b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor MacroName.equals("Nil")) { 27621827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor Priority = CCP_Constant; 27631827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor if (PreferredTypeIsPointer) 27641827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor Priority = Priority / CCF_SimilarTypeMatch; 2765b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor } 2766b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor // Treat "YES", "NO", "true", and "false" as constants. 2767b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor else if (MacroName.equals("YES") || MacroName.equals("NO") || 2768b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor MacroName.equals("true") || MacroName.equals("false")) 2769b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor Priority = CCP_Constant; 2770b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor // Treat "bool" as a type. 2771b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor else if (MacroName.equals("bool")) 2772b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor Priority = CCP_Type + (LangOpts.ObjC1? CCD_bool_in_ObjC : 0); 2773b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor 27741827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor 27751827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor return Priority; 27761827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor} 27771827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor 2778e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas GregorCXCursorKind clang::getCursorKindForDecl(Decl *D) { 2779e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor if (!D) 2780e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor return CXCursor_UnexposedDecl; 2781e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor 2782e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor switch (D->getKind()) { 2783e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::Enum: return CXCursor_EnumDecl; 2784e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::EnumConstant: return CXCursor_EnumConstantDecl; 2785e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::Field: return CXCursor_FieldDecl; 2786e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::Function: 2787e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor return CXCursor_FunctionDecl; 2788e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::ObjCCategory: return CXCursor_ObjCCategoryDecl; 2789e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::ObjCCategoryImpl: return CXCursor_ObjCCategoryImplDecl; 2790e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::ObjCClass: 2791e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor // FIXME 2792e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor return CXCursor_UnexposedDecl; 2793e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::ObjCForwardProtocol: 2794e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor // FIXME 2795e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor return CXCursor_UnexposedDecl; 2796e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::ObjCImplementation: return CXCursor_ObjCImplementationDecl; 2797e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::ObjCInterface: return CXCursor_ObjCInterfaceDecl; 2798e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::ObjCIvar: return CXCursor_ObjCIvarDecl; 2799e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::ObjCMethod: 2800e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor return cast<ObjCMethodDecl>(D)->isInstanceMethod() 2801e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor ? CXCursor_ObjCInstanceMethodDecl : CXCursor_ObjCClassMethodDecl; 2802e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::CXXMethod: return CXCursor_CXXMethod; 2803e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::CXXConstructor: return CXCursor_Constructor; 2804e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::CXXDestructor: return CXCursor_Destructor; 2805e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::CXXConversion: return CXCursor_ConversionFunction; 2806e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::ObjCProperty: return CXCursor_ObjCPropertyDecl; 2807e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::ObjCProtocol: return CXCursor_ObjCProtocolDecl; 2808e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::ParmVar: return CXCursor_ParmDecl; 2809e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::Typedef: return CXCursor_TypedefDecl; 2810162e1c1b487352434552147967c3dd296ebee2f7Richard Smith case Decl::TypeAlias: return CXCursor_TypeAliasDecl; 2811e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::Var: return CXCursor_VarDecl; 2812e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::Namespace: return CXCursor_Namespace; 2813e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::NamespaceAlias: return CXCursor_NamespaceAlias; 2814e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::TemplateTypeParm: return CXCursor_TemplateTypeParameter; 2815e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::NonTypeTemplateParm:return CXCursor_NonTypeTemplateParameter; 2816e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::TemplateTemplateParm:return CXCursor_TemplateTemplateParameter; 2817e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::FunctionTemplate: return CXCursor_FunctionTemplate; 2818e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::ClassTemplate: return CXCursor_ClassTemplate; 28192dfdb948bef51a601e763191e4becfe59880d382Argyrios Kyrtzidis case Decl::AccessSpec: return CXCursor_CXXAccessSpecifier; 2820e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::ClassTemplatePartialSpecialization: 2821e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor return CXCursor_ClassTemplatePartialSpecialization; 2822e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::UsingDirective: return CXCursor_UsingDirective; 2823e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor 2824e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::Using: 2825e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::UnresolvedUsingValue: 2826e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case Decl::UnresolvedUsingTypename: 2827e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor return CXCursor_UsingDeclaration; 2828e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor 2829352697a87bca664356f21a838b162084013625eaDouglas Gregor case Decl::ObjCPropertyImpl: 2830352697a87bca664356f21a838b162084013625eaDouglas Gregor switch (cast<ObjCPropertyImplDecl>(D)->getPropertyImplementation()) { 2831352697a87bca664356f21a838b162084013625eaDouglas Gregor case ObjCPropertyImplDecl::Dynamic: 2832352697a87bca664356f21a838b162084013625eaDouglas Gregor return CXCursor_ObjCDynamicDecl; 2833352697a87bca664356f21a838b162084013625eaDouglas Gregor 2834352697a87bca664356f21a838b162084013625eaDouglas Gregor case ObjCPropertyImplDecl::Synthesize: 2835352697a87bca664356f21a838b162084013625eaDouglas Gregor return CXCursor_ObjCSynthesizeDecl; 2836352697a87bca664356f21a838b162084013625eaDouglas Gregor } 2837352697a87bca664356f21a838b162084013625eaDouglas Gregor break; 2838352697a87bca664356f21a838b162084013625eaDouglas Gregor 2839e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor default: 2840e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor if (TagDecl *TD = dyn_cast<TagDecl>(D)) { 2841e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor switch (TD->getTagKind()) { 2842e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case TTK_Struct: return CXCursor_StructDecl; 2843e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case TTK_Class: return CXCursor_ClassDecl; 2844e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case TTK_Union: return CXCursor_UnionDecl; 2845e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor case TTK_Enum: return CXCursor_EnumDecl; 2846e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor } 2847e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor } 2848e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor } 2849e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor 2850e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor return CXCursor_UnexposedDecl; 2851e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor} 2852e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor 2853590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregorstatic void AddMacroResults(Preprocessor &PP, ResultBuilder &Results, 2854590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregor bool TargetTypeIsPointer = false) { 28550a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 2856590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregor 28573f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor Results.EnterNewScope(); 2858c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor 28590c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor for (Preprocessor::macro_iterator M = PP.macro_begin(), 28600c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor MEnd = PP.macro_end(); 2861590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregor M != MEnd; ++M) { 28621827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor Results.AddResult(Result(M->first, 28631827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor getMacroUsagePriority(M->first->getName(), 2864b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor PP.getLangOptions(), 28651827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor TargetTypeIsPointer))); 2866590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregor } 2867c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor 28683f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor Results.ExitScope(); 2869c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor 28703f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor} 28713f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor 2872aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregorstatic void AddPrettyFunctionResults(const LangOptions &LangOpts, 2873aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor ResultBuilder &Results) { 28740a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 2875aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor 2876aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor Results.EnterNewScope(); 2877c7b7b7a8eda7a5316ad1062b7f81a339f5550bcaDouglas Gregor 2878aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor Results.AddResult(Result("__PRETTY_FUNCTION__", CCP_Constant)); 2879aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor Results.AddResult(Result("__FUNCTION__", CCP_Constant)); 2880aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor if (LangOpts.C99 || LangOpts.CPlusPlus0x) 2881aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor Results.AddResult(Result("__func__", CCP_Constant)); 2882aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor Results.ExitScope(); 2883aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor} 2884aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor 28853a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbarstatic void HandleCodeCompleteResults(Sema *S, 28863a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar CodeCompleteConsumer *CodeCompleter, 2887e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext Context, 28880a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall CodeCompletionResult *Results, 2889e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor unsigned NumResults) { 289086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (CodeCompleter) 2891e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompleter->ProcessCodeCompleteResults(*S, Context, Results, NumResults); 289286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 289386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 2894e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregorstatic enum CodeCompletionContext::Kind mapCodeCompletionContext(Sema &S, 2895e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Sema::ParserCompletionContext PCC) { 2896e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor switch (PCC) { 2897f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Namespace: 2898e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor return CodeCompletionContext::CCC_TopLevel; 2899e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor 2900f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Class: 2901e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor return CodeCompletionContext::CCC_ClassStructUnion; 2902e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor 2903f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ObjCInterface: 2904e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor return CodeCompletionContext::CCC_ObjCInterface; 2905e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor 2906f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ObjCImplementation: 2907e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor return CodeCompletionContext::CCC_ObjCImplementation; 2908e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor 2909f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ObjCInstanceVariableList: 2910e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor return CodeCompletionContext::CCC_ObjCIvarList; 2911e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor 2912f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Template: 2913f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_MemberTemplate: 291452779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor if (S.CurContext->isFileContext()) 291552779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor return CodeCompletionContext::CCC_TopLevel; 291652779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor else if (S.CurContext->isRecord()) 291752779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor return CodeCompletionContext::CCC_ClassStructUnion; 291852779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor else 291952779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor return CodeCompletionContext::CCC_Other; 292052779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor 2921f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_RecoveryInFunction: 292252779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor return CodeCompletionContext::CCC_Recovery; 2923a5450a097e83072c0e545ccd8df8b07e172f1b09Douglas Gregor 2924f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_ForInit: 2925a5450a097e83072c0e545ccd8df8b07e172f1b09Douglas Gregor if (S.getLangOptions().CPlusPlus || S.getLangOptions().C99 || 2926a5450a097e83072c0e545ccd8df8b07e172f1b09Douglas Gregor S.getLangOptions().ObjC1) 2927a5450a097e83072c0e545ccd8df8b07e172f1b09Douglas Gregor return CodeCompletionContext::CCC_ParenthesizedExpression; 2928a5450a097e83072c0e545ccd8df8b07e172f1b09Douglas Gregor else 2929a5450a097e83072c0e545ccd8df8b07e172f1b09Douglas Gregor return CodeCompletionContext::CCC_Expression; 2930a5450a097e83072c0e545ccd8df8b07e172f1b09Douglas Gregor 2931a5450a097e83072c0e545ccd8df8b07e172f1b09Douglas Gregor case Sema::PCC_Expression: 2932f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Condition: 2933e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor return CodeCompletionContext::CCC_Expression; 2934e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor 2935f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Statement: 2936e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor return CodeCompletionContext::CCC_Statement; 293772db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor 2938f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall case Sema::PCC_Type: 293972db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor return CodeCompletionContext::CCC_Type; 29400268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor 29410268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor case Sema::PCC_ParenthesizedExpression: 29420268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor return CodeCompletionContext::CCC_ParenthesizedExpression; 294368e3c2eef52701a178fbcc2bb424f31dd4b36931Douglas Gregor 294468e3c2eef52701a178fbcc2bb424f31dd4b36931Douglas Gregor case Sema::PCC_LocalDeclarationSpecifiers: 294568e3c2eef52701a178fbcc2bb424f31dd4b36931Douglas Gregor return CodeCompletionContext::CCC_Type; 2946e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor } 2947e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor 2948e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor return CodeCompletionContext::CCC_Other; 2949e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor} 2950e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor 2951f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor/// \brief If we're in a C++ virtual member function, add completion results 2952f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor/// that invoke the functions we override, since it's common to invoke the 2953f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor/// overridden function as well as adding new functionality. 2954f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor/// 2955f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor/// \param S The semantic analysis object for which we are generating results. 2956f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor/// 2957f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor/// \param InContext This context in which the nested-name-specifier preceding 2958f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor/// the code-completion point 2959f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregorstatic void MaybeAddOverrideCalls(Sema &S, DeclContext *InContext, 2960f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor ResultBuilder &Results) { 2961f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor // Look through blocks. 2962f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor DeclContext *CurContext = S.CurContext; 2963f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor while (isa<BlockDecl>(CurContext)) 2964f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor CurContext = CurContext->getParent(); 2965f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor 2966f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor 2967f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(CurContext); 2968f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor if (!Method || !Method->isVirtual()) 2969f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor return; 2970f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor 2971f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor // We need to have names for all of the parameters, if we're going to 2972f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor // generate a forwarding call. 2973f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor for (CXXMethodDecl::param_iterator P = Method->param_begin(), 2974f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor PEnd = Method->param_end(); 2975f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor P != PEnd; 2976f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor ++P) { 2977f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor if (!(*P)->getDeclName()) 2978f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor return; 2979f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor } 2980f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor 29818987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor PrintingPolicy Policy = getCompletionPrintingPolicy(S); 2982f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor for (CXXMethodDecl::method_iterator M = Method->begin_overridden_methods(), 2983f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor MEnd = Method->end_overridden_methods(); 2984f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor M != MEnd; ++M) { 2985218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder Builder(Results.getAllocator()); 2986f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor CXXMethodDecl *Overridden = const_cast<CXXMethodDecl *>(*M); 2987f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor if (Overridden->getCanonicalDecl() == Method->getCanonicalDecl()) 2988f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor continue; 2989f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor 2990f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor // If we need a nested-name-specifier, add one now. 2991f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor if (!InContext) { 2992f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor NestedNameSpecifier *NNS 2993f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor = getRequiredQualification(S.Context, CurContext, 2994f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor Overridden->getDeclContext()); 2995f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor if (NNS) { 2996f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor std::string Str; 2997f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor llvm::raw_string_ostream OS(Str); 29988987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor NNS->print(OS, Policy); 2999dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddTextChunk(Results.getAllocator().CopyString(OS.str())); 3000f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor } 3001f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor } else if (!InContext->Equals(Overridden->getDeclContext())) 3002f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor continue; 3003f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor 3004dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddTypedTextChunk(Results.getAllocator().CopyString( 3005218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Overridden->getNameAsString())); 3006218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 3007f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor bool FirstParam = true; 3008f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor for (CXXMethodDecl::param_iterator P = Method->param_begin(), 3009f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor PEnd = Method->param_end(); 3010f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor P != PEnd; ++P) { 3011f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor if (FirstParam) 3012f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor FirstParam = false; 3013f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor else 3014218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_Comma); 3015f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor 3016dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddPlaceholderChunk(Results.getAllocator().CopyString( 3017218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor (*P)->getIdentifier()->getName())); 3018f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor } 3019218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 3020218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(CodeCompletionResult(Builder.TakeString(), 3021f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor CCP_SuperCompletion, 3022f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor CXCursor_CXXMethod)); 3023f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor Results.Ignore(Overridden); 3024f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor } 3025f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor} 3026f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor 302701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregorvoid Sema::CodeCompleteOrdinaryName(Scope *S, 3028e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor ParserCompletionContext CompletionContext) { 30290a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 3030218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 303152779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor mapCodeCompletionContext(*this, CompletionContext)); 3032f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor Results.EnterNewScope(); 3033cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor 303401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Determine how to filter results, e.g., so that the names of 303501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // values (functions, enumerators, function templates, etc.) are 303601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // only allowed where we can have an expression. 303701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor switch (CompletionContext) { 3038e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_Namespace: 3039e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_Class: 3040e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_ObjCInterface: 3041e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_ObjCImplementation: 3042e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_ObjCInstanceVariableList: 3043e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_Template: 3044e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_MemberTemplate: 304572db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_Type: 304668e3c2eef52701a178fbcc2bb424f31dd4b36931Douglas Gregor case PCC_LocalDeclarationSpecifiers: 304701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Results.setFilter(&ResultBuilder::IsOrdinaryNonValueName); 304801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 304901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 3050e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_Statement: 30510268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor case PCC_ParenthesizedExpression: 3052eb0d0145910f3024d9bdefe279a1e9b95495f2fdDouglas Gregor case PCC_Expression: 3053e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_ForInit: 3054e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_Condition: 30554710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor if (WantTypesInContext(CompletionContext, getLangOptions())) 30564710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor Results.setFilter(&ResultBuilder::IsOrdinaryName); 30574710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor else 30584710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor Results.setFilter(&ResultBuilder::IsOrdinaryNonTypeName); 3059f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor 3060f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor if (getLangOptions().CPlusPlus) 3061f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor MaybeAddOverrideCalls(*this, /*InContext=*/0, Results); 306201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 3063dc8453422bec3bbf70c03920e01498d75783d122Douglas Gregor 3064e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_RecoveryInFunction: 3065dc8453422bec3bbf70c03920e01498d75783d122Douglas Gregor // Unfiltered 3066dc8453422bec3bbf70c03920e01498d75783d122Douglas Gregor break; 306701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 306801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 30693cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor // If we are in a C++ non-static member function, check the qualifiers on 30703cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor // the member function to filter/prioritize the results list. 30713cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor if (CXXMethodDecl *CurMethod = dyn_cast<CXXMethodDecl>(CurContext)) 30723cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor if (CurMethod->isInstance()) 30733cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor Results.setObjectTypeQualifiers( 30743cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor Qualifiers::fromCVRMask(CurMethod->getTypeQualifiers())); 30753cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor 30761ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 30778071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 30788071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompleter->includeGlobals()); 30792a7925c4abe45650f3ab27be09468e3a3a98084aDouglas Gregor 3080bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddOrdinaryNameResults(CompletionContext, S, *this, Results); 30812a7925c4abe45650f3ab27be09468e3a3a98084aDouglas Gregor Results.ExitScope(); 30822a7925c4abe45650f3ab27be09468e3a3a98084aDouglas Gregor 3083aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor switch (CompletionContext) { 30840268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor case PCC_ParenthesizedExpression: 308572db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_Expression: 308672db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_Statement: 308772db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_RecoveryInFunction: 308872db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor if (S->getFnParent()) 308972db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor AddPrettyFunctionResults(PP.getLangOptions(), Results); 309072db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor break; 309172db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor 309272db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_Namespace: 309372db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_Class: 309472db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_ObjCInterface: 309572db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_ObjCImplementation: 309672db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_ObjCInstanceVariableList: 309772db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_Template: 309872db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_MemberTemplate: 309972db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_ForInit: 310072db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_Condition: 310172db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor case PCC_Type: 310268e3c2eef52701a178fbcc2bb424f31dd4b36931Douglas Gregor case PCC_LocalDeclarationSpecifiers: 310372db10801161a23c3830d19844a8c0b2a348d849Douglas Gregor break; 3104aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor } 3105aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor 31060c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor if (CodeCompleter->includeMacros()) 3107bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddMacroResults(PP, Results); 3108aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor 3109cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 3110e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 3111791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor} 3112791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor 3113c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregorstatic void AddClassMessageCompletions(Sema &SemaRef, Scope *S, 3114c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor ParsedType Receiver, 3115c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor IdentifierInfo **SelIdents, 3116c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor unsigned NumSelIdents, 311770c5ac70ace21b011dc2d4001bae26cdcf62ff8dDouglas Gregor bool AtArgumentExpression, 3118c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor bool IsSuper, 3119c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor ResultBuilder &Results); 3120c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor 3121c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregorvoid Sema::CodeCompleteDeclSpec(Scope *S, DeclSpec &DS, 3122c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor bool AllowNonIdentifiers, 3123c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor bool AllowNestedNameSpecifiers) { 31240a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 3125218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 312652779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor AllowNestedNameSpecifiers 312752779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor ? CodeCompletionContext::CCC_PotentiallyQualifiedName 312852779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor : CodeCompletionContext::CCC_Name); 31292ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor Results.EnterNewScope(); 31302ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor 31312ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor // Type qualifiers can come after names. 31322ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor Results.AddResult(Result("const")); 31332ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor Results.AddResult(Result("volatile")); 31342ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor if (getLangOptions().C99) 31352ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor Results.AddResult(Result("restrict")); 31362ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor 31372ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor if (getLangOptions().CPlusPlus) { 31382ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor if (AllowNonIdentifiers) { 31392ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor Results.AddResult(Result("operator")); 31402ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor } 31412ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor 31422ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor // Add nested-name-specifiers. 31432ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor if (AllowNestedNameSpecifiers) { 31442ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor Results.allowNestedNameSpecifiers(); 314552779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor Results.setFilter(&ResultBuilder::IsImpossibleToSatisfy); 31462ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 31472ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor LookupVisibleDecls(S, LookupNestedNameSpecifierName, Consumer, 31482ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor CodeCompleter->includeGlobals()); 314952779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor Results.setFilter(0); 31502ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor } 31512ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor } 31522ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor Results.ExitScope(); 31532ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor 3154c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor // If we're in a context where we might have an expression (rather than a 3155c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor // declaration), and what we've seen so far is an Objective-C type that could 3156c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor // be a receiver of a class message, this may be a class message send with 3157c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor // the initial opening bracket '[' missing. Add appropriate completions. 3158c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor if (AllowNonIdentifiers && !AllowNestedNameSpecifiers && 3159c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor DS.getTypeSpecType() == DeclSpec::TST_typename && 3160c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor DS.getStorageClassSpecAsWritten() == DeclSpec::SCS_unspecified && 3161c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor !DS.isThreadSpecified() && !DS.isExternInLinkageSpec() && 3162c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor DS.getTypeSpecComplex() == DeclSpec::TSC_unspecified && 3163c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor DS.getTypeSpecSign() == DeclSpec::TSS_unspecified && 3164c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor DS.getTypeQualifiers() == 0 && 3165c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor S && 3166c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor (S->getFlags() & Scope::DeclScope) != 0 && 3167c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor (S->getFlags() & (Scope::ClassScope | Scope::TemplateParamScope | 3168c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor Scope::FunctionPrototypeScope | 3169c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor Scope::AtCatchScope)) == 0) { 3170c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor ParsedType T = DS.getRepAsType(); 3171c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor if (!T.get().isNull() && T.get()->isObjCObjectOrInterfaceType()) 317270c5ac70ace21b011dc2d4001bae26cdcf62ff8dDouglas Gregor AddClassMessageCompletions(*this, S, T, 0, 0, false, false, Results); 3173c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor } 3174c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor 31754497dd49f78eb5e1a7c3f19d1a13564f79e12341Douglas Gregor // Note that we intentionally suppress macro results here, since we do not 31764497dd49f78eb5e1a7c3f19d1a13564f79e12341Douglas Gregor // encourage using macros to produce the names of entities. 31774497dd49f78eb5e1a7c3f19d1a13564f79e12341Douglas Gregor 317852779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 317952779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor Results.getCompletionContext(), 31802ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor Results.data(), Results.size()); 31812ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor} 31822ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor 3183fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregorstruct Sema::CodeCompleteExpressionData { 3184fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor CodeCompleteExpressionData(QualType PreferredType = QualType()) 3185fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor : PreferredType(PreferredType), IntegralConstantExpression(false), 3186fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor ObjCCollection(false) { } 3187fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor 3188fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor QualType PreferredType; 3189fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor bool IntegralConstantExpression; 3190fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor bool ObjCCollection; 31915f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<Decl *, 4> IgnoreDecls; 3192fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor}; 3193fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor 31945ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor/// \brief Perform code-completion in an expression context when we know what 31955ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor/// type we're looking for. 3196f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor/// 3197f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor/// \param IntegralConstantExpression Only permit integral constant 3198f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor/// expressions. 3199fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregorvoid Sema::CodeCompleteExpression(Scope *S, 3200fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor const CodeCompleteExpressionData &Data) { 32010a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 3202218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 3203218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Expression); 3204fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor if (Data.ObjCCollection) 3205fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor Results.setFilter(&ResultBuilder::IsObjCCollection); 3206fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor else if (Data.IntegralConstantExpression) 3207f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor Results.setFilter(&ResultBuilder::IsIntegralConstantValue); 3208e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor else if (WantTypesInContext(PCC_Expression, getLangOptions())) 32095ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor Results.setFilter(&ResultBuilder::IsOrdinaryName); 32105ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor else 32115ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor Results.setFilter(&ResultBuilder::IsOrdinaryNonTypeName); 3212fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor 3213fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor if (!Data.PreferredType.isNull()) 3214fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor Results.setPreferredType(Data.PreferredType.getNonReferenceType()); 3215fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor 3216fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor // Ignore any declarations that we were told that we don't care about. 3217fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor for (unsigned I = 0, N = Data.IgnoreDecls.size(); I != N; ++I) 3218fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor Results.Ignore(Data.IgnoreDecls[I]); 32195ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 32205ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 32218071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 32228071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompleter->includeGlobals()); 32235ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 32245ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor Results.EnterNewScope(); 3225e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor AddOrdinaryNameResults(PCC_Expression, S, *this, Results); 32265ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor Results.ExitScope(); 32275ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 3228590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregor bool PreferredTypeIsPointer = false; 3229fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor if (!Data.PreferredType.isNull()) 3230fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor PreferredTypeIsPointer = Data.PreferredType->isAnyPointerType() 3231fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor || Data.PreferredType->isMemberPointerType() 3232fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor || Data.PreferredType->isBlockPointerType(); 3233590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregor 3234aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor if (S->getFnParent() && 3235aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor !Data.ObjCCollection && 3236aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor !Data.IntegralConstantExpression) 3237aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor AddPrettyFunctionResults(PP.getLangOptions(), Results); 3238aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor 32395ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (CodeCompleter->includeMacros()) 3240590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregor AddMacroResults(PP, Results, PreferredTypeIsPointer); 3241e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 3242fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor CodeCompletionContext(CodeCompletionContext::CCC_Expression, 3243fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor Data.PreferredType), 3244e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 32455ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor} 32465ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 3247ac5fd8404fa8ecfae28be76f98fd0d926350354cDouglas Gregorvoid Sema::CodeCompletePostfixExpression(Scope *S, ExprResult E) { 3248ac5fd8404fa8ecfae28be76f98fd0d926350354cDouglas Gregor if (E.isInvalid()) 3249ac5fd8404fa8ecfae28be76f98fd0d926350354cDouglas Gregor CodeCompleteOrdinaryName(S, PCC_RecoveryInFunction); 3250ac5fd8404fa8ecfae28be76f98fd0d926350354cDouglas Gregor else if (getLangOptions().ObjC1) 3251ac5fd8404fa8ecfae28be76f98fd0d926350354cDouglas Gregor CodeCompleteObjCInstanceMessage(S, E.take(), 0, 0, false); 325278edf515544f0b9dddf69d6c1678fd83e94d8352Douglas Gregor} 32535ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 32547344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor/// \brief The set of properties that have already been added, referenced by 32557344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor/// property name. 32567344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregortypedef llvm::SmallPtrSet<IdentifierInfo*, 16> AddedPropertiesSet; 32577344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor 325895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregorstatic void AddObjCProperties(ObjCContainerDecl *Container, 3259322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor bool AllowCategories, 32604b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor bool AllowNullaryMethods, 326195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor DeclContext *CurContext, 32627344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor AddedPropertiesSet &AddedProperties, 326395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor ResultBuilder &Results) { 32640a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 326595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 326695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Add properties in this container. 326795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor for (ObjCContainerDecl::prop_iterator P = Container->prop_begin(), 326895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor PEnd = Container->prop_end(); 326995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor P != PEnd; 32707344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor ++P) { 32717344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor if (AddedProperties.insert(P->getIdentifier())) 32727344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor Results.MaybeAddResult(Result(*P, 0), CurContext); 32737344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor } 327495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 32754b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor // Add nullary methods 32764b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor if (AllowNullaryMethods) { 32774b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor ASTContext &Context = Container->getASTContext(); 32788987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor PrintingPolicy Policy = getCompletionPrintingPolicy(Results.getSema()); 32794b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor for (ObjCContainerDecl::method_iterator M = Container->meth_begin(), 32804b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor MEnd = Container->meth_end(); 32814b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor M != MEnd; ++M) { 32824b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor if (M->getSelector().isUnarySelector()) 32834b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor if (IdentifierInfo *Name = M->getSelector().getIdentifierInfoForSlot(0)) 32844b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor if (AddedProperties.insert(Name)) { 32854b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor CodeCompletionBuilder Builder(Results.getAllocator()); 32868987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor AddResultTypeChunk(Context, Policy, *M, Builder); 32874b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor Builder.AddTypedTextChunk( 32884b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor Results.getAllocator().CopyString(Name->getName())); 32894b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor 32904b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor CXAvailabilityKind Availability = CXAvailability_Available; 32914b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor switch (M->getAvailability()) { 32924b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor case AR_Available: 32934b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor case AR_NotYetIntroduced: 32944b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor Availability = CXAvailability_Available; 32954b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor break; 32964b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor 32974b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor case AR_Deprecated: 32984b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor Availability = CXAvailability_Deprecated; 32994b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor break; 33004b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor 33014b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor case AR_Unavailable: 33024b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor Availability = CXAvailability_NotAvailable; 33034b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor break; 33044b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor } 33054b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor 33064b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor Results.MaybeAddResult(Result(Builder.TakeString(), 33074b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor CCP_MemberDeclaration + CCD_MethodAsProperty, 33084b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor M->isInstanceMethod() 33094b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor ? CXCursor_ObjCInstanceMethodDecl 33104b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor : CXCursor_ObjCClassMethodDecl, 33114b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor Availability), 33124b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor CurContext); 33134b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor } 33144b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor } 33154b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor } 33164b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor 33174b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor 331895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Add properties in referenced protocols. 331995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) { 332095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor for (ObjCProtocolDecl::protocol_iterator P = Protocol->protocol_begin(), 332195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor PEnd = Protocol->protocol_end(); 332295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor P != PEnd; ++P) 33234b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddObjCProperties(*P, AllowCategories, AllowNullaryMethods, CurContext, 33244b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddedProperties, Results); 332595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } else if (ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container)){ 3326322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor if (AllowCategories) { 3327322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Look through categories. 3328322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor for (ObjCCategoryDecl *Category = IFace->getCategoryList(); 3329322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Category; Category = Category->getNextClassCategory()) 33304b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddObjCProperties(Category, AllowCategories, AllowNullaryMethods, 33314b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor CurContext, AddedProperties, Results); 3332322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor } 333395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 333495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Look through protocols. 333553b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek for (ObjCInterfaceDecl::all_protocol_iterator 333653b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek I = IFace->all_referenced_protocol_begin(), 333753b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek E = IFace->all_referenced_protocol_end(); I != E; ++I) 33384b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddObjCProperties(*I, AllowCategories, AllowNullaryMethods, CurContext, 33394b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddedProperties, Results); 334095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 334195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Look in the superclass. 334295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (IFace->getSuperClass()) 33434b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddObjCProperties(IFace->getSuperClass(), AllowCategories, 33444b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AllowNullaryMethods, CurContext, 33457344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor AddedProperties, Results); 334695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } else if (const ObjCCategoryDecl *Category 334795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor = dyn_cast<ObjCCategoryDecl>(Container)) { 334895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Look through protocols. 334953b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek for (ObjCCategoryDecl::protocol_iterator P = Category->protocol_begin(), 335053b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek PEnd = Category->protocol_end(); 335195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor P != PEnd; ++P) 33524b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddObjCProperties(*P, AllowCategories, AllowNullaryMethods, CurContext, 33534b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddedProperties, Results); 335495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } 335595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor} 335695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 3357f81e5a9e3f3ff80c56e4afb4fe6311a8735f36e8Richard Trieuvoid Sema::CodeCompleteMemberReferenceExpr(Scope *S, Expr *BaseE, 335881b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor SourceLocation OpLoc, 335981b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor bool IsArrow) { 336081b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor if (!BaseE || !CodeCompleter) 336181b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor return; 336281b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor 33630a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 336486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 336581b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor Expr *Base = static_cast<Expr *>(BaseE); 336681b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor QualType BaseType = Base->getType(); 336786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 336886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (IsArrow) { 336986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (const PointerType *Ptr = BaseType->getAs<PointerType>()) 337086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor BaseType = Ptr->getPointeeType(); 337186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor else if (BaseType->isObjCObjectPointerType()) 33723cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor /*Do nothing*/ ; 337386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor else 337486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return; 337586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 337686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 33773da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor enum CodeCompletionContext::Kind contextKind; 33783da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor 33793da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor if (IsArrow) { 33803da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contextKind = CodeCompletionContext::CCC_ArrowMemberAccess; 33813da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 33823da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor else { 33833da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor if (BaseType->isObjCObjectPointerType() || 33843da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor BaseType->isObjCObjectOrInterfaceType()) { 33853da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contextKind = CodeCompletionContext::CCC_ObjCPropertyAccess; 33863da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 33873da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor else { 33883da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor contextKind = CodeCompletionContext::CCC_DotMemberAccess; 33893da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 33903da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 33913da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor 3392218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 33933da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CodeCompletionContext(contextKind, 339452779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor BaseType), 339552779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor &ResultBuilder::IsMember); 339695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor Results.EnterNewScope(); 339795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (const RecordType *Record = BaseType->getAs<RecordType>()) { 33983cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor // Indicate that we are performing a member access, and the cv-qualifiers 33993cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor // for the base object type. 34003cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor Results.setObjectTypeQualifiers(BaseType.getQualifiers()); 34013cdee121daa13403335094ce0e181b9911c2124cDouglas Gregor 340295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Access to a C/C++ class, struct, or union. 340345bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor Results.allowNestedNameSpecifiers(); 34040cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 34058071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(Record->getDecl(), LookupMemberName, Consumer, 34068071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompleter->includeGlobals()); 34073a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar 340895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (getLangOptions().CPlusPlus) { 340995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (!Results.empty()) { 341095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // The "template" keyword can follow "->" or "." in the grammar. 341195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // However, we only want to suggest the template keyword if something 341295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // is dependent. 341395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor bool IsDependent = BaseType->isDependentType(); 341495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (!IsDependent) { 341595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor for (Scope *DepScope = S; DepScope; DepScope = DepScope->getParent()) 341695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (DeclContext *Ctx = (DeclContext *)DepScope->getEntity()) { 341795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor IsDependent = Ctx->isDependentContext(); 341895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor break; 341995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } 342095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } 34213a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar 342295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (IsDependent) 3423a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("template")); 342486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 342595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } 342695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } else if (!IsArrow && BaseType->getAsObjCInterfacePointerType()) { 342795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Objective-C property reference. 34287344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor AddedPropertiesSet AddedProperties; 342995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 343095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Add property results based on our interface. 343195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor const ObjCObjectPointerType *ObjCPtr 343295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor = BaseType->getAsObjCInterfacePointerType(); 343395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor assert(ObjCPtr && "Non-NULL pointer guaranteed above!"); 34344b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddObjCProperties(ObjCPtr->getInterfaceDecl(), true, 34354b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor /*AllowNullaryMethods=*/true, CurContext, 34367344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor AddedProperties, Results); 343795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 343895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Add properties from the protocols in a qualified interface. 343995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor for (ObjCObjectPointerType::qual_iterator I = ObjCPtr->qual_begin(), 344095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor E = ObjCPtr->qual_end(); 344195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor I != E; ++I) 34424b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddObjCProperties(*I, true, /*AllowNullaryMethods=*/true, CurContext, 34434b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddedProperties, Results); 344495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } else if ((IsArrow && BaseType->isObjCObjectPointerType()) || 3445c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall (!IsArrow && BaseType->isObjCObjectType())) { 344695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Objective-C instance variable access. 344795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor ObjCInterfaceDecl *Class = 0; 344895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (const ObjCObjectPointerType *ObjCPtr 344995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor = BaseType->getAs<ObjCObjectPointerType>()) 345095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor Class = ObjCPtr->getInterfaceDecl(); 345195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor else 3452c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall Class = BaseType->getAs<ObjCObjectType>()->getInterface(); 345395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 345495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Add all ivars from this class and its superclasses. 345580f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor if (Class) { 345680f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 345780f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor Results.setFilter(&ResultBuilder::IsObjCIvar); 34588071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(Class, LookupMemberName, Consumer, 34598071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompleter->includeGlobals()); 346086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 346186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 346295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 346395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // FIXME: How do we cope with isa? 346495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 346595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor Results.ExitScope(); 34663a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar 34673a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar // Hand off the results found for code completion. 3468e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 346952779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor Results.getCompletionContext(), 3470e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 347181b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor} 347281b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor 3473374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregorvoid Sema::CodeCompleteTag(Scope *S, unsigned TagSpec) { 3474374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor if (!CodeCompleter) 3475374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor return; 3476374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor 34770a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 347886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ResultBuilder::LookupFilter Filter = 0; 3479e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor enum CodeCompletionContext::Kind ContextKind 3480e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor = CodeCompletionContext::CCC_Other; 3481374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor switch ((DeclSpec::TST)TagSpec) { 3482374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor case DeclSpec::TST_enum: 348386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Filter = &ResultBuilder::IsEnum; 3484e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor ContextKind = CodeCompletionContext::CCC_EnumTag; 3485374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor break; 3486374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor 3487374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor case DeclSpec::TST_union: 348886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Filter = &ResultBuilder::IsUnion; 3489e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor ContextKind = CodeCompletionContext::CCC_UnionTag; 3490374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor break; 3491374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor 3492374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor case DeclSpec::TST_struct: 3493374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor case DeclSpec::TST_class: 349486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Filter = &ResultBuilder::IsClassOrStruct; 3495e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor ContextKind = CodeCompletionContext::CCC_ClassOrStructTag; 3496374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor break; 3497374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor 3498374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor default: 3499b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("Unknown type specifier kind in CodeCompleteTag"); 3500374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor } 350186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 3502218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), ContextKind); 35035d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 35040d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCall 35050d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCall // First pass: look for tags. 35060d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCall Results.setFilter(Filter); 35078071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(S, LookupTagName, Consumer, 35088071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompleter->includeGlobals()); 35090d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCall 35108071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor if (CodeCompleter->includeGlobals()) { 35118071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor // Second pass: look for nested name specifiers. 35128071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor Results.setFilter(&ResultBuilder::IsNestedNameSpecifier); 35138071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(S, LookupNestedNameSpecifierName, Consumer); 35148071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor } 351586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 351652779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 3517e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 3518374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor} 3519374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor 35201a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregorvoid Sema::CodeCompleteTypeQualifiers(DeclSpec &DS) { 3521218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 3522218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_TypeQualifiers); 35231a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor Results.EnterNewScope(); 35241a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor if (!(DS.getTypeQualifiers() & DeclSpec::TQ_const)) 35251a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor Results.AddResult("const"); 35261a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor if (!(DS.getTypeQualifiers() & DeclSpec::TQ_volatile)) 35271a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor Results.AddResult("volatile"); 35281a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor if (getLangOptions().C99 && 35291a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor !(DS.getTypeQualifiers() & DeclSpec::TQ_restrict)) 35301a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor Results.AddResult("restrict"); 35311a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor Results.ExitScope(); 35321a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 353352779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor Results.getCompletionContext(), 35341a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor Results.data(), Results.size()); 35351a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor} 35361a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor 35373e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregorvoid Sema::CodeCompleteCase(Scope *S) { 3538781472fe99a120098c631b0cbe33c89f8cef5e70John McCall if (getCurFunction()->SwitchStack.empty() || !CodeCompleter) 35393e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor return; 3540a8e0cd8cdecc7e0ba1792e46773b884c6eed4829John McCall 3541781472fe99a120098c631b0cbe33c89f8cef5e70John McCall SwitchStmt *Switch = getCurFunction()->SwitchStack.back(); 3542a8e0cd8cdecc7e0ba1792e46773b884c6eed4829John McCall QualType type = Switch->getCond()->IgnoreImplicit()->getType(); 3543a8e0cd8cdecc7e0ba1792e46773b884c6eed4829John McCall if (!type->isEnumeralType()) { 3544a8e0cd8cdecc7e0ba1792e46773b884c6eed4829John McCall CodeCompleteExpressionData Data(type); 3545fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor Data.IntegralConstantExpression = true; 3546fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor CodeCompleteExpression(S, Data); 35473e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor return; 3548f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor } 35493e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 35503e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // Code-complete the cases of a switch statement over an enumeration type 35513e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // by providing the list of 3552a8e0cd8cdecc7e0ba1792e46773b884c6eed4829John McCall EnumDecl *Enum = type->castAs<EnumType>()->getDecl(); 35533e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 35543e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // Determine which enumerators we have already seen in the switch statement. 35553e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // FIXME: Ideally, we would also be able to look *past* the code-completion 35563e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // token, in case we are code-completing in the middle of the switch and not 35573e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // at the end. However, we aren't able to do so at the moment. 35583e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor llvm::SmallPtrSet<EnumConstantDecl *, 8> EnumeratorsSeen; 3559b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor NestedNameSpecifier *Qualifier = 0; 35603e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor for (SwitchCase *SC = Switch->getSwitchCaseList(); SC; 35613e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor SC = SC->getNextSwitchCase()) { 35623e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor CaseStmt *Case = dyn_cast<CaseStmt>(SC); 35633e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor if (!Case) 35643e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor continue; 35653e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 35663e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor Expr *CaseVal = Case->getLHS()->IgnoreParenCasts(); 35673e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(CaseVal)) 35683e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor if (EnumConstantDecl *Enumerator 35693e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor = dyn_cast<EnumConstantDecl>(DRE->getDecl())) { 35703e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // We look into the AST of the case statement to determine which 35713e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // enumerator was named. Alternatively, we could compute the value of 35723e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // the integral constant expression, then compare it against the 35733e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // values of each enumerator. However, value-based approach would not 35743e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // work as well with C++ templates where enumerators declared within a 35753e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // template are type- and value-dependent. 35763e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor EnumeratorsSeen.insert(Enumerator); 35773e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 3578b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // If this is a qualified-id, keep track of the nested-name-specifier 3579b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // so that we can reproduce it as part of code completion, e.g., 35803e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // 35813e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // switch (TagD.getKind()) { 35823e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // case TagDecl::TK_enum: 35833e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // break; 35843e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // case XXX 35853e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // 3586b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // At the XXX, our completions are TagDecl::TK_union, 35873e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // TagDecl::TK_struct, and TagDecl::TK_class, rather than TK_union, 35883e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // TK_struct, and TK_class. 3589a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor Qualifier = DRE->getQualifier(); 35903e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor } 35913e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor } 35923e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 3593b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor if (getLangOptions().CPlusPlus && !Qualifier && EnumeratorsSeen.empty()) { 3594b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // If there are no prior enumerators in C++, check whether we have to 3595b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // qualify the names of the enumerators that we suggest, because they 3596b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // may not be visible in this scope. 3597b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor Qualifier = getRequiredQualification(Context, CurContext, 3598b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor Enum->getDeclContext()); 3599b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor 3600b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // FIXME: Scoped enums need to start with "EnumDecl" as the context! 3601b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor } 3602b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor 36033e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // Add any enumerators that have not yet been mentioned. 3604218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 3605218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Expression); 36063e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor Results.EnterNewScope(); 36073e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor for (EnumDecl::enumerator_iterator E = Enum->enumerator_begin(), 36083e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor EEnd = Enum->enumerator_end(); 36093e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor E != EEnd; ++E) { 36103e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor if (EnumeratorsSeen.count(*E)) 36113e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor continue; 36123e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 36135c722c7020b33da57090422b854072258a50b3f0Douglas Gregor CodeCompletionResult R(*E, Qualifier); 36145c722c7020b33da57090422b854072258a50b3f0Douglas Gregor R.Priority = CCP_EnumInCase; 36155c722c7020b33da57090422b854072258a50b3f0Douglas Gregor Results.AddResult(R, CurContext, 0, false); 36163e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor } 36173e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor Results.ExitScope(); 36182f880e47ca32d007d7e9e5ff5efa05f5c3432744Douglas Gregor 36193da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor //We need to make sure we're setting the right context, 36203da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor //so only say we include macros if the code completer says we do 36213da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor enum CodeCompletionContext::Kind kind = CodeCompletionContext::CCC_Other; 36223da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor if (CodeCompleter->includeMacros()) { 3623bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddMacroResults(PP, Results); 36243da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor kind = CodeCompletionContext::CCC_OtherWithMacros; 36253da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor } 36263da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor 36273da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor 3628e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 36293da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor kind, 3630e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 36313e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor} 36323e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 36339c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregornamespace { 36349c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor struct IsBetterOverloadCandidate { 36359c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor Sema &S; 36365769d6195087229770d7ac90449443e026c47103John McCall SourceLocation Loc; 36379c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 36389c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor public: 36395769d6195087229770d7ac90449443e026c47103John McCall explicit IsBetterOverloadCandidate(Sema &S, SourceLocation Loc) 36405769d6195087229770d7ac90449443e026c47103John McCall : S(S), Loc(Loc) { } 36419c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 36429c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor bool 36439c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor operator()(const OverloadCandidate &X, const OverloadCandidate &Y) const { 3644120d63cd4465230c2cd56508c7cd8e0ad00848e7John McCall return isBetterOverloadCandidate(S, X, Y, Loc); 36459c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor } 36469c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor }; 36479c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor} 36489c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 3649d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregorstatic bool anyNullArguments(Expr **Args, unsigned NumArgs) { 3650d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor if (NumArgs && !Args) 3651d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor return true; 3652d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor 3653d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor for (unsigned I = 0; I != NumArgs; ++I) 3654d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor if (!Args[I]) 3655d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor return true; 3656d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor 3657d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor return false; 3658d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor} 3659d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor 3660f81e5a9e3f3ff80c56e4afb4fe6311a8735f36e8Richard Trieuvoid Sema::CodeCompleteCall(Scope *S, Expr *FnIn, 3661f81e5a9e3f3ff80c56e4afb4fe6311a8735f36e8Richard Trieu Expr **ArgsIn, unsigned NumArgs) { 36629c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor if (!CodeCompleter) 36639c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor return; 3664ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor 3665ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor // When we're code-completing for a call, we fall back to ordinary 3666ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor // name code-completion whenever we can't produce specific 3667ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor // results. We may want to revisit this strategy in the future, 3668ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor // e.g., by merging the two kinds of results. 3669ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor 36709c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor Expr *Fn = (Expr *)FnIn; 36719c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor Expr **Args = (Expr **)ArgsIn; 3672ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor 36739c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor // Ignore type-dependent call expressions entirely. 3674d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor if (!Fn || Fn->isTypeDependent() || anyNullArguments(Args, NumArgs) || 3675ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor Expr::hasAnyTypeDependentArguments(Args, NumArgs)) { 3676e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompleteOrdinaryName(S, PCC_Expression); 36779c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor return; 3678ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor } 36799c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 36803b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall // Build an overload candidate set based on the functions we find. 36815769d6195087229770d7ac90449443e026c47103John McCall SourceLocation Loc = Fn->getExprLoc(); 36825769d6195087229770d7ac90449443e026c47103John McCall OverloadCandidateSet CandidateSet(Loc); 36833b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall 36849c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor // FIXME: What if we're calling something that isn't a function declaration? 36859c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor // FIXME: What if we're calling a pseudo-destructor? 36869c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor // FIXME: What if we're calling a member function? 36879c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 3688c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor typedef CodeCompleteConsumer::OverloadCandidate ResultCandidate; 36895f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<ResultCandidate, 8> Results; 3690c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor 36913b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall Expr *NakedFn = Fn->IgnoreParenCasts(); 36923b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(NakedFn)) 36933b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall AddOverloadedCallCandidates(ULE, Args, NumArgs, CandidateSet, 36943b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall /*PartialOverloading=*/ true); 36953b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall else if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(NakedFn)) { 36963b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall FunctionDecl *FDecl = dyn_cast<FunctionDecl>(DRE->getDecl()); 3697c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor if (FDecl) { 3698d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor if (!getLangOptions().CPlusPlus || 3699d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor !FDecl->getType()->getAs<FunctionProtoType>()) 3700c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor Results.push_back(ResultCandidate(FDecl)); 3701c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor else 370286820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall // FIXME: access? 37039aa472c45d2bd81b7b52c225e8acc560d716db97John McCall AddOverloadCandidate(FDecl, DeclAccessPair::make(FDecl, AS_none), 37049aa472c45d2bd81b7b52c225e8acc560d716db97John McCall Args, NumArgs, CandidateSet, 3705c27d6c58b2c1a7fecfb53c4f4016af6773a9d5baDouglas Gregor false, /*PartialOverloading*/true); 3706c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor } 37073b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall } 37089c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 37095ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor QualType ParamType; 37105ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 3711c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor if (!CandidateSet.empty()) { 3712c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor // Sort the overload candidate set by placing the best overloads first. 3713c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor std::stable_sort(CandidateSet.begin(), CandidateSet.end(), 37145769d6195087229770d7ac90449443e026c47103John McCall IsBetterOverloadCandidate(*this, Loc)); 3715c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor 3716c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor // Add the remaining viable overload candidates as code-completion reslults. 3717c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor for (OverloadCandidateSet::iterator Cand = CandidateSet.begin(), 3718c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor CandEnd = CandidateSet.end(); 3719c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor Cand != CandEnd; ++Cand) { 3720c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor if (Cand->Viable) 3721c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor Results.push_back(ResultCandidate(Cand->Function)); 3722c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor } 37235ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 37245ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor // From the viable candidates, try to determine the type of this parameter. 37255ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor for (unsigned I = 0, N = Results.size(); I != N; ++I) { 37265ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (const FunctionType *FType = Results[I].getFunctionType()) 37275ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (const FunctionProtoType *Proto = dyn_cast<FunctionProtoType>(FType)) 37285ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (NumArgs < Proto->getNumArgs()) { 37295ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (ParamType.isNull()) 37305ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor ParamType = Proto->getArgType(NumArgs); 37315ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor else if (!Context.hasSameUnqualifiedType( 37325ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor ParamType.getNonReferenceType(), 37335ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor Proto->getArgType(NumArgs).getNonReferenceType())) { 37345ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor ParamType = QualType(); 37355ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor break; 37365ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor } 37375ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor } 37385ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor } 37395ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor } else { 37405ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor // Try to determine the parameter type from the type of the expression 37415ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor // being called. 37425ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor QualType FunctionType = Fn->getType(); 37435ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (const PointerType *Ptr = FunctionType->getAs<PointerType>()) 37445ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor FunctionType = Ptr->getPointeeType(); 37455ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor else if (const BlockPointerType *BlockPtr 37465ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor = FunctionType->getAs<BlockPointerType>()) 37475ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor FunctionType = BlockPtr->getPointeeType(); 37485ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor else if (const MemberPointerType *MemPtr 37495ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor = FunctionType->getAs<MemberPointerType>()) 37505ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor FunctionType = MemPtr->getPointeeType(); 37515ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 37525ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (const FunctionProtoType *Proto 37535ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor = FunctionType->getAs<FunctionProtoType>()) { 37545ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (NumArgs < Proto->getNumArgs()) 37555ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor ParamType = Proto->getArgType(NumArgs); 37565ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor } 37579c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor } 3758ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor 37595ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (ParamType.isNull()) 3760e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompleteOrdinaryName(S, PCC_Expression); 37615ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor else 37625ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor CodeCompleteExpression(S, ParamType); 37635ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 37642e4c7a5865739709a310d847da34096aa402d183Douglas Gregor if (!Results.empty()) 3765ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor CodeCompleter->ProcessOverloadCandidates(*this, NumArgs, Results.data(), 3766ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor Results.size()); 37679c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor} 37689c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 3769d226f65006733ed7f709c3174f22ce33391cb58fJohn McCallvoid Sema::CodeCompleteInitializer(Scope *S, Decl *D) { 3770d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall ValueDecl *VD = dyn_cast_or_null<ValueDecl>(D); 37715ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (!VD) { 3772e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompleteOrdinaryName(S, PCC_Expression); 37735ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor return; 37745ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor } 37755ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 37765ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor CodeCompleteExpression(S, VD->getType()); 37775ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor} 37785ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 37795ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregorvoid Sema::CodeCompleteReturn(Scope *S) { 37805ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor QualType ResultType; 37815ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (isa<BlockDecl>(CurContext)) { 37825ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (BlockScopeInfo *BSI = getCurBlock()) 37835ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor ResultType = BSI->ReturnType; 37845ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor } else if (FunctionDecl *Function = dyn_cast<FunctionDecl>(CurContext)) 37855ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor ResultType = Function->getResultType(); 37865ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor else if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(CurContext)) 37875ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor ResultType = Method->getResultType(); 37885ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 37895ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (ResultType.isNull()) 3790e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompleteOrdinaryName(S, PCC_Expression); 37915ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor else 37925ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor CodeCompleteExpression(S, ResultType); 37935ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor} 37945ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 3795d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregorvoid Sema::CodeCompleteAfterIf(Scope *S) { 3796d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor typedef CodeCompletionResult Result; 3797d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 3798d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor mapCodeCompletionContext(*this, PCC_Statement)); 3799d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Results.setFilter(&ResultBuilder::IsOrdinaryName); 3800d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Results.EnterNewScope(); 3801d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor 3802d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 3803d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 3804d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor CodeCompleter->includeGlobals()); 3805d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor 3806d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor AddOrdinaryNameResults(PCC_Statement, S, *this, Results); 3807d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor 3808d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor // "else" block 3809d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor CodeCompletionBuilder Builder(Results.getAllocator()); 3810d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddTypedTextChunk("else"); 3811d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 3812d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 3813d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 3814d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddPlaceholderChunk("statements"); 3815d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 3816d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 3817d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Results.AddResult(Builder.TakeString()); 3818d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor 3819d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor // "else if" block 3820d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddTypedTextChunk("else"); 3821d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 3822d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddTextChunk("if"); 3823d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 3824d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 3825d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor if (getLangOptions().CPlusPlus) 3826d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddPlaceholderChunk("condition"); 3827d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor else 3828d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddPlaceholderChunk("expression"); 3829d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 3830d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 3831d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 3832d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 3833d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddPlaceholderChunk("statements"); 3834d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 3835d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 3836d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Results.AddResult(Builder.TakeString()); 3837d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor 3838d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Results.ExitScope(); 3839d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor 3840d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor if (S->getFnParent()) 3841d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor AddPrettyFunctionResults(PP.getLangOptions(), Results); 3842d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor 3843d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor if (CodeCompleter->includeMacros()) 3844d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor AddMacroResults(PP, Results); 3845d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor 3846d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 3847d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor Results.data(),Results.size()); 3848d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor} 3849d2d8be6a27d0ef73d46039604682f7890e1cc3e0Douglas Gregor 3850f81e5a9e3f3ff80c56e4afb4fe6311a8735f36e8Richard Trieuvoid Sema::CodeCompleteAssignmentRHS(Scope *S, Expr *LHS) { 38515ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (LHS) 38525ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor CodeCompleteExpression(S, static_cast<Expr *>(LHS)->getType()); 38535ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor else 3854e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompleteOrdinaryName(S, PCC_Expression); 38555ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor} 38565ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 38579ab14541716928894821cf5d53d6b4c95ffdf3a3Jeffrey Yasskinvoid Sema::CodeCompleteQualifiedId(Scope *S, CXXScopeSpec &SS, 385881b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor bool EnteringContext) { 385981b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor if (!SS.getScopeRep() || !CodeCompleter) 386081b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor return; 386181b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor 386286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor DeclContext *Ctx = computeDeclContext(SS, EnteringContext); 386386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!Ctx) 386486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return; 3865d1cd31aeb806077340be94e32429f3192cf139b0Douglas Gregor 3866d1cd31aeb806077340be94e32429f3192cf139b0Douglas Gregor // Try to instantiate any non-dependent declaration contexts before 3867d1cd31aeb806077340be94e32429f3192cf139b0Douglas Gregor // we look in them. 386877bb1aa78bcd26e42c0382043e65a2b03242be4dJohn McCall if (!isDependentScopeSpecifier(SS) && RequireCompleteDeclContext(SS, Ctx)) 3869d1cd31aeb806077340be94e32429f3192cf139b0Douglas Gregor return; 3870d1cd31aeb806077340be94e32429f3192cf139b0Douglas Gregor 3871218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 3872218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Name); 3873f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor Results.EnterNewScope(); 387452779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor 387586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // The "template" keyword can follow "::" in the grammar, but only 387686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // put it into the grammar if the nested-name-specifier is dependent. 387786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NestedNameSpecifier *NNS = (NestedNameSpecifier *)SS.getScopeRep(); 387886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!Results.empty() && NNS->isDependent()) 3879a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult("template"); 3880f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor 3881f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor // Add calls to overridden virtual functions, if there are any. 3882f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor // 3883f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor // FIXME: This isn't wonderful, because we don't know whether we're actually 3884f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor // in a context that permits expressions. This is a general issue with 3885f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor // qualified-id completions. 3886f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor if (!EnteringContext) 3887f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor MaybeAddOverrideCalls(*this, Ctx, Results); 3888f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor Results.ExitScope(); 388986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 3890f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 3891f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor LookupVisibleDecls(Ctx, LookupOrdinaryName, Consumer); 3892f696152ccc574b4921b2cd1c3d8afbce0d72e510Douglas Gregor 3893e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 3894430d7a1a621a126a9ffe442ad8987ba02b46dae9Douglas Gregor Results.getCompletionContext(), 3895e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 389681b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor} 389749f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 389849f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregorvoid Sema::CodeCompleteUsing(Scope *S) { 389949f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor if (!CodeCompleter) 390049f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor return; 390149f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 3902218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 390352779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor CodeCompletionContext::CCC_PotentiallyQualifiedName, 390452779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor &ResultBuilder::IsNestedNameSpecifier); 39058e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.EnterNewScope(); 390686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 390786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // If we aren't in class scope, we could see the "namespace" keyword. 390886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!S->isClassScope()) 39090a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall Results.AddResult(CodeCompletionResult("namespace")); 391086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 391186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // After "using", we can see anything that would start a 391286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // nested-name-specifier. 39135d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 39148071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 39158071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompleter->includeGlobals()); 39168e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.ExitScope(); 391786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 3918e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 391952779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor CodeCompletionContext::CCC_PotentiallyQualifiedName, 3920e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 392149f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor} 392249f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 392349f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregorvoid Sema::CodeCompleteUsingDirective(Scope *S) { 392449f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor if (!CodeCompleter) 392549f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor return; 392649f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 392786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // After "using namespace", we expect to see a namespace name or namespace 392886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // alias. 3929218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 3930218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Namespace, 393152779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor &ResultBuilder::IsNamespaceOrAlias); 39328e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.EnterNewScope(); 39335d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 39348071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 39358071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompleter->includeGlobals()); 39368e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.ExitScope(); 3937e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 39388071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompletionContext::CCC_Namespace, 3939e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 394049f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor} 394149f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 394249f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregorvoid Sema::CodeCompleteNamespaceDecl(Scope *S) { 394349f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor if (!CodeCompleter) 394449f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor return; 394549f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 394686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor DeclContext *Ctx = (DeclContext *)S->getEntity(); 394786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!S->getParent()) 394886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Ctx = Context.getTranslationUnitDecl(); 394986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 395052779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor bool SuppressedGlobalResults 395152779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor = Ctx && !CodeCompleter->includeGlobals() && isa<TranslationUnitDecl>(Ctx); 395252779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor 3953218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 395452779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor SuppressedGlobalResults 395552779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor ? CodeCompletionContext::CCC_Namespace 395652779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor : CodeCompletionContext::CCC_Other, 395752779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor &ResultBuilder::IsNamespace); 395852779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor 395952779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor if (Ctx && Ctx->isFileContext() && !SuppressedGlobalResults) { 396086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // We only want to see those namespaces that have already been defined 396186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // within this scope, because its likely that the user is creating an 396286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // extended namespace declaration. Keep track of the most recent 396386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // definition of each namespace. 396486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor std::map<NamespaceDecl *, NamespaceDecl *> OrigToLatest; 396586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor for (DeclContext::specific_decl_iterator<NamespaceDecl> 396686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NS(Ctx->decls_begin()), NSEnd(Ctx->decls_end()); 396786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NS != NSEnd; ++NS) 396886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor OrigToLatest[NS->getOriginalNamespace()] = *NS; 396986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 397086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add the most recent definition (or extended definition) of each 397186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // namespace to the list of results. 39728e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.EnterNewScope(); 397386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor for (std::map<NamespaceDecl *, NamespaceDecl *>::iterator 397486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NS = OrigToLatest.begin(), NSEnd = OrigToLatest.end(); 397586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NS != NSEnd; ++NS) 39760a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall Results.AddResult(CodeCompletionResult(NS->second, 0), 3977608300be1972c43fe99154d25d62d697e7c0a0c2Douglas Gregor CurContext, 0, false); 39788e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.ExitScope(); 397986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 398086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 3981e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 398252779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor Results.getCompletionContext(), 3983e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 398449f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor} 398549f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 398649f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregorvoid Sema::CodeCompleteNamespaceAliasDecl(Scope *S) { 398749f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor if (!CodeCompleter) 398849f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor return; 398949f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 399086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // After "namespace", we expect to see a namespace or alias. 3991218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 3992218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Namespace, 399352779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor &ResultBuilder::IsNamespaceOrAlias); 39945d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 39958071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 39968071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompleter->includeGlobals()); 3997e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 399852779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor Results.getCompletionContext(), 3999e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 400049f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor} 400149f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 4002ed8d322b4086b8b1e1f78b21389cabb23457dcb3Douglas Gregorvoid Sema::CodeCompleteOperatorName(Scope *S) { 4003ed8d322b4086b8b1e1f78b21389cabb23457dcb3Douglas Gregor if (!CodeCompleter) 4004ed8d322b4086b8b1e1f78b21389cabb23457dcb3Douglas Gregor return; 400586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 40060a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 4007218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 4008218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Type, 400952779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor &ResultBuilder::IsType); 40108e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.EnterNewScope(); 401186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 401286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add the names of overloadable operators. 401386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 401486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (std::strcmp(Spelling, "?")) \ 4015a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Spelling)); 401686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor#include "clang/Basic/OperatorKinds.def" 401786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 401886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add any type names visible from the current scope 401945bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor Results.allowNestedNameSpecifiers(); 40205d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 40218071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 40228071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompleter->includeGlobals()); 402386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 402486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add any type specifiers 4025bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddTypeSpecifierResults(getLangOptions(), Results); 40268e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.ExitScope(); 4027ed8d322b4086b8b1e1f78b21389cabb23457dcb3Douglas Gregor 4028e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 40298071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompletionContext::CCC_Type, 4030e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 4031c464ae8444edb6d07ea49b7a0eae1674c0fa1bb8Douglas Gregor} 4032c464ae8444edb6d07ea49b7a0eae1674c0fa1bb8Douglas Gregor 40330133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregorvoid Sema::CodeCompleteConstructorInitializer(Decl *ConstructorD, 4034cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt CXXCtorInitializer** Initializers, 40350133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor unsigned NumInitializers) { 40368987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor PrintingPolicy Policy = getCompletionPrintingPolicy(*this); 40370133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor CXXConstructorDecl *Constructor 40380133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor = static_cast<CXXConstructorDecl *>(ConstructorD); 40390133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor if (!Constructor) 40400133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor return; 40410133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor 4042218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 404352779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor CodeCompletionContext::CCC_PotentiallyQualifiedName); 40440133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor Results.EnterNewScope(); 40450133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor 40460133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor // Fill in any already-initialized fields or base classes. 40470133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor llvm::SmallPtrSet<FieldDecl *, 4> InitializedFields; 40480133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor llvm::SmallPtrSet<CanQualType, 4> InitializedBases; 40490133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor for (unsigned I = 0; I != NumInitializers; ++I) { 40500133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor if (Initializers[I]->isBaseInitializer()) 40510133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor InitializedBases.insert( 40520133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor Context.getCanonicalType(QualType(Initializers[I]->getBaseClass(), 0))); 40530133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor else 405400eb3f9c5b33e3d99aee1f8b75dd9c9678fdd66bFrancois Pichet InitializedFields.insert(cast<FieldDecl>( 405500eb3f9c5b33e3d99aee1f8b75dd9c9678fdd66bFrancois Pichet Initializers[I]->getAnyMember())); 40560133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor } 40570133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor 40580133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor // Add completions for base classes. 4059218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder Builder(Results.getAllocator()); 40600c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor bool SawLastInitializer = (NumInitializers == 0); 40610133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor CXXRecordDecl *ClassDecl = Constructor->getParent(); 40620133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor for (CXXRecordDecl::base_class_iterator Base = ClassDecl->bases_begin(), 40630133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor BaseEnd = ClassDecl->bases_end(); 40640133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor Base != BaseEnd; ++Base) { 40650c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor if (!InitializedBases.insert(Context.getCanonicalType(Base->getType()))) { 40660c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor SawLastInitializer 40670c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor = NumInitializers > 0 && 40680c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor Initializers[NumInitializers - 1]->isBaseInitializer() && 40690c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor Context.hasSameUnqualifiedType(Base->getType(), 40700c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor QualType(Initializers[NumInitializers - 1]->getBaseClass(), 0)); 40710133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor continue; 40720c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor } 40730133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor 4074218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk( 4075dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Results.getAllocator().CopyString( 4076f85e193739c953358c865005855253af4f68a497John McCall Base->getType().getAsString(Policy))); 4077218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4078218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("args"); 4079218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 4080218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(CodeCompletionResult(Builder.TakeString(), 40810c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor SawLastInitializer? CCP_NextInitializer 40820c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor : CCP_MemberDeclaration)); 40830c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor SawLastInitializer = false; 40840133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor } 40850133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor 40860133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor // Add completions for virtual base classes. 40870133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor for (CXXRecordDecl::base_class_iterator Base = ClassDecl->vbases_begin(), 40880133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor BaseEnd = ClassDecl->vbases_end(); 40890133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor Base != BaseEnd; ++Base) { 40900c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor if (!InitializedBases.insert(Context.getCanonicalType(Base->getType()))) { 40910c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor SawLastInitializer 40920c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor = NumInitializers > 0 && 40930c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor Initializers[NumInitializers - 1]->isBaseInitializer() && 40940c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor Context.hasSameUnqualifiedType(Base->getType(), 40950c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor QualType(Initializers[NumInitializers - 1]->getBaseClass(), 0)); 40960133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor continue; 40970c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor } 40980133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor 4099218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk( 4100dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.getAllocator().CopyString( 4101f85e193739c953358c865005855253af4f68a497John McCall Base->getType().getAsString(Policy))); 4102218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4103218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("args"); 4104218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 4105218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(CodeCompletionResult(Builder.TakeString(), 41060c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor SawLastInitializer? CCP_NextInitializer 41070c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor : CCP_MemberDeclaration)); 41080c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor SawLastInitializer = false; 41090133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor } 41100133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor 41110133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor // Add completions for members. 41120133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor for (CXXRecordDecl::field_iterator Field = ClassDecl->field_begin(), 41130133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor FieldEnd = ClassDecl->field_end(); 41140133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor Field != FieldEnd; ++Field) { 41150c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor if (!InitializedFields.insert(cast<FieldDecl>(Field->getCanonicalDecl()))) { 41160c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor SawLastInitializer 41170c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor = NumInitializers > 0 && 411800eb3f9c5b33e3d99aee1f8b75dd9c9678fdd66bFrancois Pichet Initializers[NumInitializers - 1]->isAnyMemberInitializer() && 411900eb3f9c5b33e3d99aee1f8b75dd9c9678fdd66bFrancois Pichet Initializers[NumInitializers - 1]->getAnyMember() == *Field; 41200133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor continue; 41210c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor } 41220133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor 41230133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor if (!Field->getDeclName()) 41240133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor continue; 41250133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor 4126dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddTypedTextChunk(Builder.getAllocator().CopyString( 4127218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Field->getIdentifier()->getName())); 4128218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4129218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("args"); 4130218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 4131218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(CodeCompletionResult(Builder.TakeString(), 41320c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor SawLastInitializer? CCP_NextInitializer 4133a67e03fdf1ae8a1f92463a307d0b6281f1161f40Douglas Gregor : CCP_MemberDeclaration, 4134a67e03fdf1ae8a1f92463a307d0b6281f1161f40Douglas Gregor CXCursor_MemberRef)); 41350c431c8c001e4c1f7488663d98700a8ce1e89e2aDouglas Gregor SawLastInitializer = false; 41360133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor } 41370133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor Results.ExitScope(); 41380133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor 413952779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 41400133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor Results.data(), Results.size()); 41410133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor} 41420133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor 4143b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor// Macro that expands to @Keyword or Keyword, depending on whether NeedAt is 4144b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor// true or false. 4145b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor#define OBJC_AT_KEYWORD_NAME(NeedAt,Keyword) NeedAt? "@" #Keyword : #Keyword 4146bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCImplementationResults(const LangOptions &LangOpts, 4147b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor ResultBuilder &Results, 4148b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor bool NeedAt) { 41490a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 4150b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // Since we have an implementation, we can end it. 4151a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,end))); 4152b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 4153218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder Builder(Results.getAllocator()); 4154b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor if (LangOpts.ObjC2) { 4155b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @dynamic 4156218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,dynamic)); 4157218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4158218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("property"); 4159218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 4160b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 4161b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @synthesize 4162218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,synthesize)); 4163218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4164218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("property"); 4165218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 4166b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor } 4167b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor} 4168c464ae8444edb6d07ea49b7a0eae1674c0fa1bb8Douglas Gregor 4169bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCInterfaceResults(const LangOptions &LangOpts, 4170b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor ResultBuilder &Results, 4171b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor bool NeedAt) { 41720a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 4173b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 4174b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // Since we have an interface or protocol, we can end it. 4175a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,end))); 4176b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 4177b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor if (LangOpts.ObjC2) { 4178b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @property 4179a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,property))); 4180b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 4181b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @required 4182a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,required))); 4183b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 4184b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @optional 4185a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,optional))); 4186b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor } 4187b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor} 4188834389b87451b24618513b907b4dfb5b00d211f3Douglas Gregor 4189bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCTopLevelResults(ResultBuilder &Results, bool NeedAt) { 41900a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 4191218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder Builder(Results.getAllocator()); 4192b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 4193b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @class name ; 4194218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,class)); 4195218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4196218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("name"); 4197218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 4198b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 4199c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor if (Results.includeCodePatterns()) { 4200c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // @interface name 4201c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // FIXME: Could introduce the whole pattern, including superclasses and 4202c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // such. 4203218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,interface)); 4204218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4205218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("class"); 4206218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 4207b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 4208c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // @protocol name 4209218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,protocol)); 4210218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4211218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("protocol"); 4212218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 4213c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor 4214c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // @implementation name 4215218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,implementation)); 4216218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4217218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("class"); 4218218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 4219c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor } 4220b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 4221b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @compatibility_alias name 4222218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,compatibility_alias)); 4223218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4224218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("alias"); 4225218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4226218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("class"); 4227218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 4228b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor} 4229834389b87451b24618513b907b4dfb5b00d211f3Douglas Gregor 4230a28948f34817476d02412fa204cae038e228c827Fariborz Jahanianvoid Sema::CodeCompleteObjCAtDirective(Scope *S) { 42310a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 4232218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 4233218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 4234b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Results.EnterNewScope(); 4235a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian if (isa<ObjCImplDecl>(CurContext)) 4236bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCImplementationResults(getLangOptions(), Results, false); 4237a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian else if (CurContext->isObjCContainer()) 4238bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCInterfaceResults(getLangOptions(), Results, false); 4239b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor else 4240bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCTopLevelResults(Results, false); 4241c464ae8444edb6d07ea49b7a0eae1674c0fa1bb8Douglas Gregor Results.ExitScope(); 4242e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 4243e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 4244e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 42459a0c85e640a08174569a303db22981612f05d385Douglas Gregor} 42469a0c85e640a08174569a303db22981612f05d385Douglas Gregor 4247bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCExpressionResults(ResultBuilder &Results, bool NeedAt) { 42480a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 4249218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder Builder(Results.getAllocator()); 42509a0c85e640a08174569a303db22981612f05d385Douglas Gregor 42519a0c85e640a08174569a303db22981612f05d385Douglas Gregor // @encode ( type-name ) 42528ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor const char *EncodeType = "char[]"; 42538ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor if (Results.getSema().getLangOptions().CPlusPlus || 42548ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Results.getSema().getLangOptions().ConstStrings) 42558ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor EncodeType = " const char[]"; 42568ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk(EncodeType); 4257218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,encode)); 4258218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4259218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("type-name"); 4260218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 4261218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 42629a0c85e640a08174569a303db22981612f05d385Douglas Gregor 42639a0c85e640a08174569a303db22981612f05d385Douglas Gregor // @protocol ( protocol-name ) 42648ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("Protocol *"); 4265218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,protocol)); 4266218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4267218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("protocol-name"); 4268218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 4269218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 42709a0c85e640a08174569a303db22981612f05d385Douglas Gregor 42719a0c85e640a08174569a303db22981612f05d385Douglas Gregor // @selector ( selector ) 42728ca7208d0fb4dcbc5fa8cfeca6a1081ce69da8e0Douglas Gregor Builder.AddResultTypeChunk("SEL"); 4273218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,selector)); 4274218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4275218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("selector"); 4276218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 4277218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 42789a0c85e640a08174569a303db22981612f05d385Douglas Gregor} 42799a0c85e640a08174569a303db22981612f05d385Douglas Gregor 4280bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCStatementResults(ResultBuilder &Results, bool NeedAt) { 42810a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 4282218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder Builder(Results.getAllocator()); 4283b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 4284c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor if (Results.includeCodePatterns()) { 4285c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // @try { statements } @catch ( declaration ) { statements } @finally 4286c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // { statements } 4287218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,try)); 4288218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 4289218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("statements"); 4290218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 4291218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("@catch"); 4292218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4293218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("parameter"); 4294218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 4295218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 4296218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("statements"); 4297218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 4298218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("@finally"); 4299218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 4300218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("statements"); 4301218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 4302218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 4303c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor } 4304b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 43059a0c85e640a08174569a303db22981612f05d385Douglas Gregor // @throw 4306218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,throw)); 4307218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4308218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 4309218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 4310b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 4311c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor if (Results.includeCodePatterns()) { 4312c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // @synchronized ( expression ) { statements } 4313218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,synchronized)); 4314218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4315218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4316218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 4317218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 4318218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 4319218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("statements"); 4320218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 4321218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString())); 4322c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor } 4323b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor} 43249a0c85e640a08174569a303db22981612f05d385Douglas Gregor 4325bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCVisibilityResults(const LangOptions &LangOpts, 4326c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor ResultBuilder &Results, 4327c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor bool NeedAt) { 43280a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 4329a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,private))); 4330a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,protected))); 4331a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,public))); 4332c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor if (LangOpts.ObjC2) 4333a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,package))); 4334c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor} 4335c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor 4336c38c3e1e726630458154534227d74eda833d26a0Douglas Gregorvoid Sema::CodeCompleteObjCAtVisibility(Scope *S) { 4337218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 4338218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 4339c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor Results.EnterNewScope(); 4340bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCVisibilityResults(getLangOptions(), Results, false); 4341c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor Results.ExitScope(); 4342e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 4343e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 4344e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 4345c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor} 4346c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor 4347c38c3e1e726630458154534227d74eda833d26a0Douglas Gregorvoid Sema::CodeCompleteObjCAtStatement(Scope *S) { 4348218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 4349218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 4350b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Results.EnterNewScope(); 4351bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCStatementResults(Results, false); 4352bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCExpressionResults(Results, false); 43539a0c85e640a08174569a303db22981612f05d385Douglas Gregor Results.ExitScope(); 4354e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 4355e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 4356e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 43579a0c85e640a08174569a303db22981612f05d385Douglas Gregor} 43589a0c85e640a08174569a303db22981612f05d385Douglas Gregor 43599a0c85e640a08174569a303db22981612f05d385Douglas Gregorvoid Sema::CodeCompleteObjCAtExpression(Scope *S) { 4360218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 4361218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 43629a0c85e640a08174569a303db22981612f05d385Douglas Gregor Results.EnterNewScope(); 4363bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCExpressionResults(Results, false); 43649a0c85e640a08174569a303db22981612f05d385Douglas Gregor Results.ExitScope(); 4365e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 4366e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 4367e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 4368ed8d322b4086b8b1e1f78b21389cabb23457dcb3Douglas Gregor} 436949f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 4370988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor/// \brief Determine whether the addition of the given flag to an Objective-C 4371988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor/// property's attributes will cause a conflict. 4372988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregorstatic bool ObjCPropertyFlagConflicts(unsigned Attributes, unsigned NewFlag) { 4373988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor // Check if we've already added this flag. 4374988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (Attributes & NewFlag) 4375988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor return true; 4376988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor 4377988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor Attributes |= NewFlag; 4378988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor 4379988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor // Check for collisions with "readonly". 4380988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if ((Attributes & ObjCDeclSpec::DQ_PR_readonly) && 4381988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor (Attributes & (ObjCDeclSpec::DQ_PR_readwrite | 4382988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor ObjCDeclSpec::DQ_PR_assign | 4383f85e193739c953358c865005855253af4f68a497John McCall ObjCDeclSpec::DQ_PR_unsafe_unretained | 4384988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor ObjCDeclSpec::DQ_PR_copy | 4385f85e193739c953358c865005855253af4f68a497John McCall ObjCDeclSpec::DQ_PR_retain | 4386f85e193739c953358c865005855253af4f68a497John McCall ObjCDeclSpec::DQ_PR_strong))) 4387988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor return true; 4388988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor 4389f85e193739c953358c865005855253af4f68a497John McCall // Check for more than one of { assign, copy, retain, strong }. 4390988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor unsigned AssignCopyRetMask = Attributes & (ObjCDeclSpec::DQ_PR_assign | 4391f85e193739c953358c865005855253af4f68a497John McCall ObjCDeclSpec::DQ_PR_unsafe_unretained | 4392988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor ObjCDeclSpec::DQ_PR_copy | 4393f85e193739c953358c865005855253af4f68a497John McCall ObjCDeclSpec::DQ_PR_retain| 4394f85e193739c953358c865005855253af4f68a497John McCall ObjCDeclSpec::DQ_PR_strong); 4395988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (AssignCopyRetMask && 4396988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor AssignCopyRetMask != ObjCDeclSpec::DQ_PR_assign && 4397f85e193739c953358c865005855253af4f68a497John McCall AssignCopyRetMask != ObjCDeclSpec::DQ_PR_unsafe_unretained && 4398988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor AssignCopyRetMask != ObjCDeclSpec::DQ_PR_copy && 4399f85e193739c953358c865005855253af4f68a497John McCall AssignCopyRetMask != ObjCDeclSpec::DQ_PR_retain && 4400f85e193739c953358c865005855253af4f68a497John McCall AssignCopyRetMask != ObjCDeclSpec::DQ_PR_strong) 4401988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor return true; 4402988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor 4403988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor return false; 4404988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor} 4405988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor 4406a93b108e025ef2480fa867cc533e7781a40a639bDouglas Gregorvoid Sema::CodeCompleteObjCPropertyFlags(Scope *S, ObjCDeclSpec &ODS) { 4407ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff if (!CodeCompleter) 4408ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff return; 4409d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor 4410ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff unsigned Attributes = ODS.getPropertyAttributes(); 4411ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff 44120a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 4413218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 4414218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 4415ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff Results.EnterNewScope(); 4416988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_readonly)) 44170a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall Results.AddResult(CodeCompletionResult("readonly")); 4418988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_assign)) 44190a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall Results.AddResult(CodeCompletionResult("assign")); 4420f85e193739c953358c865005855253af4f68a497John McCall if (!ObjCPropertyFlagConflicts(Attributes, 4421f85e193739c953358c865005855253af4f68a497John McCall ObjCDeclSpec::DQ_PR_unsafe_unretained)) 4422f85e193739c953358c865005855253af4f68a497John McCall Results.AddResult(CodeCompletionResult("unsafe_unretained")); 4423988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_readwrite)) 44240a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall Results.AddResult(CodeCompletionResult("readwrite")); 4425988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_retain)) 44260a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall Results.AddResult(CodeCompletionResult("retain")); 4427f85e193739c953358c865005855253af4f68a497John McCall if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_strong)) 4428f85e193739c953358c865005855253af4f68a497John McCall Results.AddResult(CodeCompletionResult("strong")); 4429988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_copy)) 44300a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall Results.AddResult(CodeCompletionResult("copy")); 4431988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_nonatomic)) 44320a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall Results.AddResult(CodeCompletionResult("nonatomic")); 443327f45236005d9dd2bbbfeb1682eb349cb8b6998bFariborz Jahanian if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_atomic)) 443427f45236005d9dd2bbbfeb1682eb349cb8b6998bFariborz Jahanian Results.AddResult(CodeCompletionResult("atomic")); 4435988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_setter)) { 4436218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder Setter(Results.getAllocator()); 4437218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Setter.AddTypedTextChunk("setter"); 4438218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Setter.AddTextChunk(" = "); 4439218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Setter.AddPlaceholderChunk("method"); 4440218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(CodeCompletionResult(Setter.TakeString())); 444154f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor } 4442988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_getter)) { 4443218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder Getter(Results.getAllocator()); 4444218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Getter.AddTypedTextChunk("getter"); 4445218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Getter.AddTextChunk(" = "); 4446218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Getter.AddPlaceholderChunk("method"); 4447218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(CodeCompletionResult(Getter.TakeString())); 444854f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor } 4449ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff Results.ExitScope(); 4450e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 4451e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 4452e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 4453ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff} 4454c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff 44554ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor/// \brief Descripts the kind of Objective-C method that we want to find 44564ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor/// via code completion. 44574ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregorenum ObjCMethodKind { 44584ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor MK_Any, //< Any kind of method, provided it means other specified criteria. 44594ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor MK_ZeroArgSelector, //< Zero-argument (unary) selector. 44604ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor MK_OneArgSelector //< One-argument selector. 44614ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor}; 44624ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 4463458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregorstatic bool isAcceptableObjCSelector(Selector Sel, 4464458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor ObjCMethodKind WantKind, 4465458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor IdentifierInfo **SelIdents, 4466cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor unsigned NumSelIdents, 4467cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor bool AllowSameLength = true) { 44684ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (NumSelIdents > Sel.getNumArgs()) 44694ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor return false; 4470458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor 44714ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor switch (WantKind) { 4472458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor case MK_Any: break; 4473458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor case MK_ZeroArgSelector: return Sel.isUnarySelector(); 4474458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor case MK_OneArgSelector: return Sel.getNumArgs() == 1; 44754ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor } 4476458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor 4477cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor if (!AllowSameLength && NumSelIdents && NumSelIdents == Sel.getNumArgs()) 4478cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor return false; 4479cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor 44804ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor for (unsigned I = 0; I != NumSelIdents; ++I) 44814ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (SelIdents[I] != Sel.getIdentifierInfoForSlot(I)) 44824ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor return false; 4483458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor 44844ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor return true; 44854ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor} 4486458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor 4487458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregorstatic bool isAcceptableObjCMethod(ObjCMethodDecl *Method, 4488458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor ObjCMethodKind WantKind, 4489458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor IdentifierInfo **SelIdents, 4490cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor unsigned NumSelIdents, 4491cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor bool AllowSameLength = true) { 4492458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor return isAcceptableObjCSelector(Method->getSelector(), WantKind, SelIdents, 4493cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor NumSelIdents, AllowSameLength); 4494458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor} 4495d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor 4496d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregornamespace { 4497d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor /// \brief A set of selectors, which is used to avoid introducing multiple 4498d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor /// completions with the same selector into the result set. 4499d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor typedef llvm::SmallPtrSet<Selector, 16> VisitedSelectorSet; 4500d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor} 4501d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor 450236ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// \brief Add all of the Objective-C methods in the given Objective-C 450336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// container to the set of results. 450436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// 450536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// The container will be a class, protocol, category, or implementation of 450636ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// any of the above. This mether will recurse to include methods from 450736ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// the superclasses of classes along with their categories, protocols, and 450836ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// implementations. 450936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// 451036ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// \param Container the container in which we'll look to find methods. 451136ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// 451236ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// \param WantInstance whether to add instance methods (only); if false, this 451336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// routine will add factory methods (only). 451436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// 451536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// \param CurContext the context in which we're performing the lookup that 451636ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// finds methods. 451736ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// 4518cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor/// \param AllowSameLength Whether we allow a method to be added to the list 4519cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor/// when it has the same number of parameters as we have selector identifiers. 4520cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor/// 452136ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// \param Results the structure into which we'll add results. 452236ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregorstatic void AddObjCMethods(ObjCContainerDecl *Container, 452336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor bool WantInstanceMethods, 45244ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor ObjCMethodKind WantKind, 4525d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor IdentifierInfo **SelIdents, 4526d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor unsigned NumSelIdents, 452736ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor DeclContext *CurContext, 4528d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor VisitedSelectorSet &Selectors, 4529cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor bool AllowSameLength, 4530408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor ResultBuilder &Results, 4531408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor bool InOriginalClass = true) { 45320a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 453336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor for (ObjCContainerDecl::method_iterator M = Container->meth_begin(), 453436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor MEnd = Container->meth_end(); 453536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor M != MEnd; ++M) { 4536d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor if ((*M)->isInstanceMethod() == WantInstanceMethods) { 4537d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor // Check whether the selector identifiers we've been given are a 4538d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor // subset of the identifiers for this particular method. 4539cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor if (!isAcceptableObjCMethod(*M, WantKind, SelIdents, NumSelIdents, 4540cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor AllowSameLength)) 4541d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor continue; 45424ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 4543d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor if (!Selectors.insert((*M)->getSelector())) 4544d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor continue; 4545d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor 4546d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor Result R = Result(*M, 0); 4547d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor R.StartParameter = NumSelIdents; 45484ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor R.AllParametersAreInformative = (WantKind != MK_Any); 4549408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor if (!InOriginalClass) 4550408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor R.Priority += CCD_InBaseClass; 4551d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor Results.MaybeAddResult(R, CurContext); 4552d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor } 455336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor } 455436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 4555e396c7bd99ed99fd8136fadc8945791754c61b16Douglas Gregor // Visit the protocols of protocols. 4556e396c7bd99ed99fd8136fadc8945791754c61b16Douglas Gregor if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) { 4557e396c7bd99ed99fd8136fadc8945791754c61b16Douglas Gregor const ObjCList<ObjCProtocolDecl> &Protocols 4558e396c7bd99ed99fd8136fadc8945791754c61b16Douglas Gregor = Protocol->getReferencedProtocols(); 4559e396c7bd99ed99fd8136fadc8945791754c61b16Douglas Gregor for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 4560e396c7bd99ed99fd8136fadc8945791754c61b16Douglas Gregor E = Protocols.end(); 4561e396c7bd99ed99fd8136fadc8945791754c61b16Douglas Gregor I != E; ++I) 4562e396c7bd99ed99fd8136fadc8945791754c61b16Douglas Gregor AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents, NumSelIdents, 4563cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor CurContext, Selectors, AllowSameLength, Results, false); 4564e396c7bd99ed99fd8136fadc8945791754c61b16Douglas Gregor } 4565e396c7bd99ed99fd8136fadc8945791754c61b16Douglas Gregor 456636ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container); 456736ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor if (!IFace) 456836ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor return; 456936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 457036ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add methods in protocols. 457136ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor const ObjCList<ObjCProtocolDecl> &Protocols= IFace->getReferencedProtocols(); 457236ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 457336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor E = Protocols.end(); 457436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor I != E; ++I) 45754ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents, NumSelIdents, 4576cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor CurContext, Selectors, AllowSameLength, Results, false); 457736ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 457836ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add methods in categories. 457936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor for (ObjCCategoryDecl *CatDecl = IFace->getCategoryList(); CatDecl; 458036ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor CatDecl = CatDecl->getNextClassCategory()) { 45814ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(CatDecl, WantInstanceMethods, WantKind, SelIdents, 4582cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor NumSelIdents, CurContext, Selectors, AllowSameLength, 4583cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor Results, InOriginalClass); 458436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 458536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add a categories protocol methods. 458636ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor const ObjCList<ObjCProtocolDecl> &Protocols 458736ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor = CatDecl->getReferencedProtocols(); 458836ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 458936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor E = Protocols.end(); 459036ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor I != E; ++I) 45914ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents, 4592cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor NumSelIdents, CurContext, Selectors, AllowSameLength, 4593cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor Results, false); 459436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 459536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add methods in category implementations. 459636ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor if (ObjCCategoryImplDecl *Impl = CatDecl->getImplementation()) 45974ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(Impl, WantInstanceMethods, WantKind, SelIdents, 4598cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor NumSelIdents, CurContext, Selectors, AllowSameLength, 4599cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor Results, InOriginalClass); 460036ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor } 460136ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 460236ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add methods in superclass. 460336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor if (IFace->getSuperClass()) 46044ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(IFace->getSuperClass(), WantInstanceMethods, WantKind, 4605cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor SelIdents, NumSelIdents, CurContext, Selectors, 4606cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor AllowSameLength, Results, false); 460736ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 460836ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add methods in our implementation, if any. 460936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor if (ObjCImplementationDecl *Impl = IFace->getImplementation()) 46104ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(Impl, WantInstanceMethods, WantKind, SelIdents, 4611cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor NumSelIdents, CurContext, Selectors, AllowSameLength, 4612cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor Results, InOriginalClass); 46134ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor} 46144ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 46154ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 4616a28948f34817476d02412fa204cae038e228c827Fariborz Jahanianvoid Sema::CodeCompleteObjCPropertyGetter(Scope *S) { 46170a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 46184ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 46194ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor // Try to find the interface where getters might live. 4620a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurContext); 46214ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (!Class) { 46224ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (ObjCCategoryDecl *Category 4623a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian = dyn_cast_or_null<ObjCCategoryDecl>(CurContext)) 46244ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Class = Category->getClassInterface(); 46254ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 46264ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (!Class) 46274ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor return; 46284ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor } 46294ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 46304ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor // Find all of the potential getters. 4631218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 4632218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 46334ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Results.EnterNewScope(); 46344ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 4635d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor VisitedSelectorSet Selectors; 4636d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor AddObjCMethods(Class, true, MK_ZeroArgSelector, 0, 0, CurContext, Selectors, 4637cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor /*AllowSameLength=*/true, Results); 46384ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Results.ExitScope(); 4639e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 4640e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 4641e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 46424ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor} 46434ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 4644a28948f34817476d02412fa204cae038e228c827Fariborz Jahanianvoid Sema::CodeCompleteObjCPropertySetter(Scope *S) { 46450a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 46464ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 46474ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor // Try to find the interface where setters might live. 46484ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor ObjCInterfaceDecl *Class 4649a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian = dyn_cast_or_null<ObjCInterfaceDecl>(CurContext); 46504ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (!Class) { 46514ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (ObjCCategoryDecl *Category 4652a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian = dyn_cast_or_null<ObjCCategoryDecl>(CurContext)) 46534ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Class = Category->getClassInterface(); 46544ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 46554ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (!Class) 46564ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor return; 46574ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor } 46584ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 46594ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor // Find all of the potential getters. 4660218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 4661218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 46624ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Results.EnterNewScope(); 46634ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 4664d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor VisitedSelectorSet Selectors; 4665d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor AddObjCMethods(Class, true, MK_OneArgSelector, 0, 0, CurContext, 4666cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor Selectors, /*AllowSameLength=*/true, Results); 46674ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 46684ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Results.ExitScope(); 4669e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 4670e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 4671e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 467236ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor} 467336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 4674afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregorvoid Sema::CodeCompleteObjCPassingType(Scope *S, ObjCDeclSpec &DS, 4675afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor bool IsParameter) { 46760a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 4677218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 4678218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Type); 4679d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor Results.EnterNewScope(); 4680d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor 4681d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor // Add context-sensitive, Objective-C parameter-passing keywords. 4682d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor bool AddedInOut = false; 4683d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor if ((DS.getObjCDeclQualifier() & 4684d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor (ObjCDeclSpec::DQ_In | ObjCDeclSpec::DQ_Inout)) == 0) { 4685d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor Results.AddResult("in"); 4686d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor Results.AddResult("inout"); 4687d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor AddedInOut = true; 4688d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor } 4689d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor if ((DS.getObjCDeclQualifier() & 4690d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor (ObjCDeclSpec::DQ_Out | ObjCDeclSpec::DQ_Inout)) == 0) { 4691d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor Results.AddResult("out"); 4692d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor if (!AddedInOut) 4693d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor Results.AddResult("inout"); 4694d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor } 4695d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor if ((DS.getObjCDeclQualifier() & 4696d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor (ObjCDeclSpec::DQ_Bycopy | ObjCDeclSpec::DQ_Byref | 4697d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor ObjCDeclSpec::DQ_Oneway)) == 0) { 4698d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor Results.AddResult("bycopy"); 4699d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor Results.AddResult("byref"); 4700d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor Results.AddResult("oneway"); 4701d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor } 4702d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor 4703afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor // If we're completing the return type of an Objective-C method and the 4704afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor // identifier IBAction refers to a macro, provide a completion item for 4705afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor // an action, e.g., 4706afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor // IBAction)<#selector#>:(id)sender 4707afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor if (DS.getObjCDeclQualifier() == 0 && !IsParameter && 4708afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor Context.Idents.get("IBAction").hasMacroDefinition()) { 4709afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor typedef CodeCompletionString::Chunk Chunk; 4710afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor CodeCompletionBuilder Builder(Results.getAllocator(), CCP_CodePattern, 4711afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor CXAvailability_Available); 4712afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor Builder.AddTypedTextChunk("IBAction"); 4713afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor Builder.AddChunk(Chunk(CodeCompletionString::CK_RightParen)); 4714afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor Builder.AddPlaceholderChunk("selector"); 4715afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor Builder.AddChunk(Chunk(CodeCompletionString::CK_Colon)); 4716afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor Builder.AddChunk(Chunk(CodeCompletionString::CK_LeftParen)); 4717afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor Builder.AddTextChunk("id"); 4718afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor Builder.AddChunk(Chunk(CodeCompletionString::CK_RightParen)); 4719afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor Builder.AddTextChunk("sender"); 4720afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor Results.AddResult(CodeCompletionResult(Builder.TakeString())); 4721afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor } 4722afc4578f8e55d4377b291e2325b2e9bc2cd72e89Douglas Gregor 4723d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor // Add various builtin type names and specifiers. 4724d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor AddOrdinaryNameResults(PCC_Type, S, *this, Results); 4725d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor Results.ExitScope(); 4726d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor 4727d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor // Add the various type names 4728d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor Results.setFilter(&ResultBuilder::IsOrdinaryNonValueName); 4729d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 4730d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 4731d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor CodeCompleter->includeGlobals()); 4732d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor 4733d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor if (CodeCompleter->includeMacros()) 4734d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor AddMacroResults(PP, Results); 4735d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor 4736d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 4737d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor CodeCompletionContext::CCC_Type, 4738d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor Results.data(), Results.size()); 4739d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor} 4740d32b0225e29fcafb2b2b2a4b1c51dcb1518af9c6Douglas Gregor 474122f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor/// \brief When we have an expression with type "id", we may assume 474222f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor/// that it has some more-specific class type based on knowledge of 474322f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor/// common uses of Objective-C. This routine returns that class type, 474422f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor/// or NULL if no better result could be determined. 474522f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregorstatic ObjCInterfaceDecl *GetAssumedMessageSendExprType(Expr *E) { 474678edf515544f0b9dddf69d6c1678fd83e94d8352Douglas Gregor ObjCMessageExpr *Msg = dyn_cast_or_null<ObjCMessageExpr>(E); 474722f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor if (!Msg) 474822f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor return 0; 474922f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor 475022f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor Selector Sel = Msg->getSelector(); 475122f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor if (Sel.isNull()) 475222f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor return 0; 475322f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor 475422f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor IdentifierInfo *Id = Sel.getIdentifierInfoForSlot(0); 475522f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor if (!Id) 475622f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor return 0; 475722f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor 475822f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor ObjCMethodDecl *Method = Msg->getMethodDecl(); 475922f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor if (!Method) 476022f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor return 0; 476122f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor 476222f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor // Determine the class that we're sending the message to. 476304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor ObjCInterfaceDecl *IFace = 0; 476404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor switch (Msg->getReceiverKind()) { 476504badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor case ObjCMessageExpr::Class: 4766c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (const ObjCObjectType *ObjType 4767c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall = Msg->getClassReceiver()->getAs<ObjCObjectType>()) 4768c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall IFace = ObjType->getInterface(); 476904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor break; 477004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor 477104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor case ObjCMessageExpr::Instance: { 477204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor QualType T = Msg->getInstanceReceiver()->getType(); 477304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor if (const ObjCObjectPointerType *Ptr = T->getAs<ObjCObjectPointerType>()) 477404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor IFace = Ptr->getInterfaceDecl(); 477504badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor break; 477604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor } 477704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor 477804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor case ObjCMessageExpr::SuperInstance: 477904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor case ObjCMessageExpr::SuperClass: 478004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor break; 478122f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor } 478222f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor 478322f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor if (!IFace) 478422f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor return 0; 478522f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor 478622f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor ObjCInterfaceDecl *Super = IFace->getSuperClass(); 478722f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor if (Method->isInstanceMethod()) 478822f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor return llvm::StringSwitch<ObjCInterfaceDecl *>(Id->getName()) 478922f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("retain", IFace) 4790f85e193739c953358c865005855253af4f68a497John McCall .Case("strong", IFace) 479122f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("autorelease", IFace) 479222f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("copy", IFace) 479322f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("copyWithZone", IFace) 479422f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("mutableCopy", IFace) 479522f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("mutableCopyWithZone", IFace) 479622f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("awakeFromCoder", IFace) 479722f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("replacementObjectFromCoder", IFace) 479822f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("class", IFace) 479922f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("classForCoder", IFace) 480022f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("superclass", Super) 480122f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Default(0); 480222f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor 480322f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor return llvm::StringSwitch<ObjCInterfaceDecl *>(Id->getName()) 480422f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("new", IFace) 480522f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("alloc", IFace) 480622f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("allocWithZone", IFace) 480722f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("class", IFace) 480822f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("superclass", Super) 480922f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Default(0); 481022f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor} 481122f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor 481203d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor// Add a special completion for a message send to "super", which fills in the 481303d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor// most likely case of forwarding all of our arguments to the superclass 481403d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor// function. 481503d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// 481603d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// \param S The semantic analysis object. 481703d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// 481803d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// \param S NeedSuperKeyword Whether we need to prefix this completion with 481903d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// the "super" keyword. Otherwise, we just need to provide the arguments. 482003d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// 482103d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// \param SelIdents The identifiers in the selector that have already been 482203d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// provided as arguments for a send to "super". 482303d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// 482403d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// \param NumSelIdents The number of identifiers in \p SelIdents. 482503d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// 482603d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// \param Results The set of results to augment. 482703d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// 482803d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// \returns the Objective-C method declaration that would be invoked by 482903d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor/// this "super" completion. If NULL, no completion was added. 483003d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregorstatic ObjCMethodDecl *AddSuperSendCompletion(Sema &S, bool NeedSuperKeyword, 483103d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor IdentifierInfo **SelIdents, 483203d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor unsigned NumSelIdents, 483303d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor ResultBuilder &Results) { 483403d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor ObjCMethodDecl *CurMethod = S.getCurMethodDecl(); 483503d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (!CurMethod) 483603d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor return 0; 483703d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 483803d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor ObjCInterfaceDecl *Class = CurMethod->getClassInterface(); 483903d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (!Class) 484003d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor return 0; 484103d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 484203d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor // Try to find a superclass method with the same selector. 484303d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor ObjCMethodDecl *SuperMethod = 0; 484478bcd9139f4b35be75190446c95614120d9b4c09Douglas Gregor while ((Class = Class->getSuperClass()) && !SuperMethod) { 484578bcd9139f4b35be75190446c95614120d9b4c09Douglas Gregor // Check in the class 484603d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor SuperMethod = Class->getMethod(CurMethod->getSelector(), 484703d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor CurMethod->isInstanceMethod()); 484803d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 484978bcd9139f4b35be75190446c95614120d9b4c09Douglas Gregor // Check in categories or class extensions. 485078bcd9139f4b35be75190446c95614120d9b4c09Douglas Gregor if (!SuperMethod) { 485178bcd9139f4b35be75190446c95614120d9b4c09Douglas Gregor for (ObjCCategoryDecl *Category = Class->getCategoryList(); Category; 485278bcd9139f4b35be75190446c95614120d9b4c09Douglas Gregor Category = Category->getNextClassCategory()) 485378bcd9139f4b35be75190446c95614120d9b4c09Douglas Gregor if ((SuperMethod = Category->getMethod(CurMethod->getSelector(), 485478bcd9139f4b35be75190446c95614120d9b4c09Douglas Gregor CurMethod->isInstanceMethod()))) 485578bcd9139f4b35be75190446c95614120d9b4c09Douglas Gregor break; 485678bcd9139f4b35be75190446c95614120d9b4c09Douglas Gregor } 485778bcd9139f4b35be75190446c95614120d9b4c09Douglas Gregor } 485878bcd9139f4b35be75190446c95614120d9b4c09Douglas Gregor 485903d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (!SuperMethod) 486003d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor return 0; 486103d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 486203d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor // Check whether the superclass method has the same signature. 486303d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (CurMethod->param_size() != SuperMethod->param_size() || 486403d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor CurMethod->isVariadic() != SuperMethod->isVariadic()) 486503d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor return 0; 486603d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 486703d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor for (ObjCMethodDecl::param_iterator CurP = CurMethod->param_begin(), 486803d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor CurPEnd = CurMethod->param_end(), 486903d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor SuperP = SuperMethod->param_begin(); 487003d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor CurP != CurPEnd; ++CurP, ++SuperP) { 487103d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor // Make sure the parameter types are compatible. 487203d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (!S.Context.hasSameUnqualifiedType((*CurP)->getType(), 487303d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor (*SuperP)->getType())) 487403d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor return 0; 487503d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 487603d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor // Make sure we have a parameter name to forward! 487703d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (!(*CurP)->getIdentifier()) 487803d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor return 0; 487903d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor } 488003d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 488103d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor // We have a superclass method. Now, form the send-to-super completion. 4882218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder Builder(Results.getAllocator()); 488303d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 488403d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor // Give this completion a return type. 48858987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor AddResultTypeChunk(S.Context, getCompletionPrintingPolicy(S), SuperMethod, 48868987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor Builder); 488703d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 488803d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor // If we need the "super" keyword, add it (plus some spacing). 488903d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (NeedSuperKeyword) { 4890218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("super"); 4891218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 489203d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor } 489303d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 489403d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor Selector Sel = CurMethod->getSelector(); 489503d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (Sel.isUnarySelector()) { 489603d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (NeedSuperKeyword) 4897dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddTextChunk(Builder.getAllocator().CopyString( 4898813d8346529bf094eb2b249648906ba7fd226688Douglas Gregor Sel.getNameForSlot(0))); 489903d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor else 4900dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddTypedTextChunk(Builder.getAllocator().CopyString( 4901813d8346529bf094eb2b249648906ba7fd226688Douglas Gregor Sel.getNameForSlot(0))); 490203d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor } else { 490303d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor ObjCMethodDecl::param_iterator CurP = CurMethod->param_begin(); 490403d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor for (unsigned I = 0, N = Sel.getNumArgs(); I != N; ++I, ++CurP) { 490503d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (I > NumSelIdents) 4906218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 490703d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 490803d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (I < NumSelIdents) 4909218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddInformativeChunk( 4910dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.getAllocator().CopyString( 4911813d8346529bf094eb2b249648906ba7fd226688Douglas Gregor Sel.getNameForSlot(I) + ":")); 491203d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor else if (NeedSuperKeyword || I > NumSelIdents) { 4913218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk( 4914dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.getAllocator().CopyString( 4915813d8346529bf094eb2b249648906ba7fd226688Douglas Gregor Sel.getNameForSlot(I) + ":")); 4916dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddPlaceholderChunk(Builder.getAllocator().CopyString( 4917218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor (*CurP)->getIdentifier()->getName())); 491803d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor } else { 4919218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk( 4920dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.getAllocator().CopyString( 4921813d8346529bf094eb2b249648906ba7fd226688Douglas Gregor Sel.getNameForSlot(I) + ":")); 4922dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddPlaceholderChunk(Builder.getAllocator().CopyString( 4923218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor (*CurP)->getIdentifier()->getName())); 492403d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor } 492503d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor } 492603d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor } 492703d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 4928218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(CodeCompletionResult(Builder.TakeString(), CCP_SuperCompletion, 492903d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor SuperMethod->isInstanceMethod() 493003d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor ? CXCursor_ObjCInstanceMethodDecl 493103d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor : CXCursor_ObjCClassMethodDecl)); 493203d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor return SuperMethod; 493303d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor} 493403d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 49358e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregorvoid Sema::CodeCompleteObjCMessageReceiver(Scope *S) { 49360a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 4937218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 4938218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_ObjCMessageReceiver, 493952779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor &ResultBuilder::IsObjCMessageReceiver); 49408e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 49418e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 49428e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor Results.EnterNewScope(); 49438071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 49448071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompleter->includeGlobals()); 49458e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 49468e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor // If we are in an Objective-C method inside a class that has a superclass, 49478e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor // add "super" as an option. 49488e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor if (ObjCMethodDecl *Method = getCurMethodDecl()) 49498e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor if (ObjCInterfaceDecl *Iface = Method->getClassInterface()) 495003d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (Iface->getSuperClass()) { 49518e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor Results.AddResult(Result("super")); 495203d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 495303d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor AddSuperSendCompletion(*this, /*NeedSuperKeyword=*/true, 0, 0, Results); 495403d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor } 49558e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 49568e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor Results.ExitScope(); 49578e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 49588e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor if (CodeCompleter->includeMacros()) 49598e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor AddMacroResults(PP, Results); 4960cee9ff16688bc6dd6571162c1860f4eae05d98f7Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 4961e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(), Results.size()); 49628e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 49638e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor} 49648e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 49652725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregorvoid Sema::CodeCompleteObjCSuperMessage(Scope *S, SourceLocation SuperLoc, 4966d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor IdentifierInfo **SelIdents, 496770c5ac70ace21b011dc2d4001bae26cdcf62ff8dDouglas Gregor unsigned NumSelIdents, 496870c5ac70ace21b011dc2d4001bae26cdcf62ff8dDouglas Gregor bool AtArgumentExpression) { 496924a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor ObjCInterfaceDecl *CDecl = 0; 49702725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) { 49712725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // Figure out which interface we're in. 49722725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor CDecl = CurMethod->getClassInterface(); 49732725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (!CDecl) 49742725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor return; 49752725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor 49762725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // Find the superclass of this class. 49772725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor CDecl = CDecl->getSuperClass(); 49782725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (!CDecl) 49792725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor return; 498024a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor 49812725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (CurMethod->isInstanceMethod()) { 49822725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // We are inside an instance method, which means that the message 49832725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // send [super ...] is actually calling an instance method on the 49846b0656a7c386662e1bec5f23a3bd0bf2687a9635Douglas Gregor // current object. 49856b0656a7c386662e1bec5f23a3bd0bf2687a9635Douglas Gregor return CodeCompleteObjCInstanceMessage(S, 0, 498603d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor SelIdents, NumSelIdents, 498770c5ac70ace21b011dc2d4001bae26cdcf62ff8dDouglas Gregor AtArgumentExpression, 49886b0656a7c386662e1bec5f23a3bd0bf2687a9635Douglas Gregor CDecl); 49892725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor } 499024a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor 49912725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // Fall through to send to the superclass in CDecl. 49922725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor } else { 49932725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // "super" may be the name of a type or variable. Figure out which 49942725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // it is. 49952725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor IdentifierInfo *Super = &Context.Idents.get("super"); 49962725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor NamedDecl *ND = LookupSingleName(S, Super, SuperLoc, 49972725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor LookupOrdinaryName); 49982725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if ((CDecl = dyn_cast_or_null<ObjCInterfaceDecl>(ND))) { 49992725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // "super" names an interface. Use it. 50002725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor } else if (TypeDecl *TD = dyn_cast_or_null<TypeDecl>(ND)) { 5001c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (const ObjCObjectType *Iface 5002c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall = Context.getTypeDeclType(TD)->getAs<ObjCObjectType>()) 5003c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall CDecl = Iface->getInterface(); 50042725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor } else if (ND && isa<UnresolvedUsingTypenameDecl>(ND)) { 50052725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // "super" names an unresolved type; we can't be more specific. 50062725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor } else { 50072725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // Assume that "super" names some kind of value and parse that way. 50082725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor CXXScopeSpec SS; 50092725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor UnqualifiedId id; 50102725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor id.setIdentifier(Super, SuperLoc); 501160d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult SuperExpr = ActOnIdExpression(S, SS, id, false, false); 50122725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor return CodeCompleteObjCInstanceMessage(S, (Expr *)SuperExpr.get(), 501370c5ac70ace21b011dc2d4001bae26cdcf62ff8dDouglas Gregor SelIdents, NumSelIdents, 501470c5ac70ace21b011dc2d4001bae26cdcf62ff8dDouglas Gregor AtArgumentExpression); 50152725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor } 501624a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor 50172725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // Fall through 501824a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor } 501924a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor 5020b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall ParsedType Receiver; 50212725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (CDecl) 5022b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall Receiver = ParsedType::make(Context.getObjCInterfaceType(CDecl)); 50232725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor return CodeCompleteObjCClassMessage(S, Receiver, SelIdents, 502470c5ac70ace21b011dc2d4001bae26cdcf62ff8dDouglas Gregor NumSelIdents, AtArgumentExpression, 502570c5ac70ace21b011dc2d4001bae26cdcf62ff8dDouglas Gregor /*IsSuper=*/true); 50262725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor} 50272725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor 5028b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor/// \brief Given a set of code-completion results for the argument of a message 5029b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor/// send, determine the preferred type (if any) for that argument expression. 5030b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregorstatic QualType getPreferredArgumentTypeForMessageSend(ResultBuilder &Results, 5031b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor unsigned NumSelIdents) { 5032b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor typedef CodeCompletionResult Result; 5033b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor ASTContext &Context = Results.getSema().Context; 5034b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor 5035b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor QualType PreferredType; 5036b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor unsigned BestPriority = CCP_Unlikely * 2; 5037b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor Result *ResultsData = Results.data(); 5038b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor for (unsigned I = 0, N = Results.size(); I != N; ++I) { 5039b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor Result &R = ResultsData[I]; 5040b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor if (R.Kind == Result::RK_Declaration && 5041b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor isa<ObjCMethodDecl>(R.Declaration)) { 5042b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor if (R.Priority <= BestPriority) { 5043b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor ObjCMethodDecl *Method = cast<ObjCMethodDecl>(R.Declaration); 5044b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor if (NumSelIdents <= Method->param_size()) { 5045b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor QualType MyPreferredType = Method->param_begin()[NumSelIdents - 1] 5046b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor ->getType(); 5047b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor if (R.Priority < BestPriority || PreferredType.isNull()) { 5048b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor BestPriority = R.Priority; 5049b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor PreferredType = MyPreferredType; 5050b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor } else if (!Context.hasSameUnqualifiedType(PreferredType, 5051b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor MyPreferredType)) { 5052b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor PreferredType = QualType(); 5053b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor } 5054b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor } 5055b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor } 5056b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor } 5057b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor } 5058b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor 5059b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor return PreferredType; 5060b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor} 5061b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor 5062c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregorstatic void AddClassMessageCompletions(Sema &SemaRef, Scope *S, 5063c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor ParsedType Receiver, 5064c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor IdentifierInfo **SelIdents, 5065c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor unsigned NumSelIdents, 506670c5ac70ace21b011dc2d4001bae26cdcf62ff8dDouglas Gregor bool AtArgumentExpression, 5067c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor bool IsSuper, 5068c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor ResultBuilder &Results) { 50690a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 50702725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor ObjCInterfaceDecl *CDecl = 0; 5071c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor 507224a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor // If the given name refers to an interface type, retrieve the 507324a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor // corresponding declaration. 50742725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (Receiver) { 5075c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor QualType T = SemaRef.GetTypeFromParser(Receiver, 0); 50762725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (!T.isNull()) 5077c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (const ObjCObjectType *Interface = T->getAs<ObjCObjectType>()) 5078c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall CDecl = Interface->getInterface(); 507924a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor } 5080c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor 508136ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add all of the factory methods in this Objective-C class, its protocols, 508236ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // superclasses, categories, implementation, etc. 5083c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff Results.EnterNewScope(); 5084c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor 508503d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor // If this is a send-to-super, try to add the special "super" send 508603d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor // completion. 508703d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (IsSuper) { 508803d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (ObjCMethodDecl *SuperMethod 5089c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor = AddSuperSendCompletion(SemaRef, false, SelIdents, NumSelIdents, 5090c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor Results)) 509103d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor Results.Ignore(SuperMethod); 509203d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor } 5093c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor 5094265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor // If we're inside an Objective-C method definition, prefer its selector to 5095265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor // others. 5096c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor if (ObjCMethodDecl *CurMethod = SemaRef.getCurMethodDecl()) 5097265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor Results.setPreferredSelector(CurMethod->getSelector()); 5098c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor 5099d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor VisitedSelectorSet Selectors; 510013438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor if (CDecl) 5101c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor AddObjCMethods(CDecl, false, MK_Any, SelIdents, NumSelIdents, 5102cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor SemaRef.CurContext, Selectors, AtArgumentExpression, 5103cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor Results); 51042725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor else { 510513438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor // We're messaging "id" as a type; provide all class/factory methods. 5106c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor 5107719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor // If we have an external source, load the entire class method 51083c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl // pool from the AST file. 5109c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor if (SemaRef.ExternalSource) { 5110c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor for (uint32_t I = 0, 5111c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor N = SemaRef.ExternalSource->GetNumExternalSelectors(); 511276bd1f387e6a7b7abfe53f63b3bd429b97bb80f0John McCall I != N; ++I) { 5113c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor Selector Sel = SemaRef.ExternalSource->GetExternalSelector(I); 5114c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor if (Sel.isNull() || SemaRef.MethodPool.count(Sel)) 5115719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor continue; 5116c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor 5117c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor SemaRef.ReadMethodPool(Sel); 5118719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor } 5119719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor } 5120c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor 5121c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor for (Sema::GlobalMethodPool::iterator M = SemaRef.MethodPool.begin(), 5122c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor MEnd = SemaRef.MethodPool.end(); 5123db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl M != MEnd; ++M) { 5124db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl for (ObjCMethodList *MethList = &M->second.second; 5125db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl MethList && MethList->Method; 512613438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor MethList = MethList->Next) { 512713438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor if (!isAcceptableObjCMethod(MethList->Method, MK_Any, SelIdents, 512813438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor NumSelIdents)) 512913438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor continue; 5130c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor 513113438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor Result R(MethList->Method, 0); 513213438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor R.StartParameter = NumSelIdents; 513313438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor R.AllParametersAreInformative = false; 5134c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor Results.MaybeAddResult(R, SemaRef.CurContext); 513513438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor } 513613438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor } 513713438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor } 5138c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor 5139c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor Results.ExitScope(); 5140c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor} 514113438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor 5142c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregorvoid Sema::CodeCompleteObjCClassMessage(Scope *S, ParsedType Receiver, 5143c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor IdentifierInfo **SelIdents, 5144c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor unsigned NumSelIdents, 514570c5ac70ace21b011dc2d4001bae26cdcf62ff8dDouglas Gregor bool AtArgumentExpression, 5146c7b6d883360092808b0ae81b7829fa8196ef42a1Douglas Gregor bool IsSuper) { 5147e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor 5148e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor QualType T = this->GetTypeFromParser(Receiver); 5149e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor 5150218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5151e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor CodeCompletionContext(CodeCompletionContext::CCC_ObjCClassMessage, 51520a47d69af8bda945352997af3da4687a3356096aDouglas Gregor T, SelIdents, NumSelIdents)); 5153e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor 515470c5ac70ace21b011dc2d4001bae26cdcf62ff8dDouglas Gregor AddClassMessageCompletions(*this, S, Receiver, SelIdents, NumSelIdents, 515570c5ac70ace21b011dc2d4001bae26cdcf62ff8dDouglas Gregor AtArgumentExpression, IsSuper, Results); 5156b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor 5157b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor // If we're actually at the argument expression (rather than prior to the 5158b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor // selector), we're actually performing code completion for an expression. 5159b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor // Determine whether we have a single, best method. If so, we can 5160b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor // code-complete the expression using the corresponding parameter type as 5161b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor // our preferred type, improving completion results. 5162b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor if (AtArgumentExpression) { 5163b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor QualType PreferredType = getPreferredArgumentTypeForMessageSend(Results, 5164e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor NumSelIdents); 5165b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor if (PreferredType.isNull()) 5166b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor CodeCompleteOrdinaryName(S, PCC_Expression); 5167b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor else 5168b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor CodeCompleteExpression(S, PreferredType); 5169b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor return; 5170b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor } 5171b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor 5172e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 5173e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor Results.getCompletionContext(), 517403d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor Results.data(), Results.size()); 5175c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff} 5176c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff 5177f81e5a9e3f3ff80c56e4afb4fe6311a8735f36e8Richard Trieuvoid Sema::CodeCompleteObjCInstanceMessage(Scope *S, Expr *Receiver, 5178d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor IdentifierInfo **SelIdents, 517903d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor unsigned NumSelIdents, 518070c5ac70ace21b011dc2d4001bae26cdcf62ff8dDouglas Gregor bool AtArgumentExpression, 51816b0656a7c386662e1bec5f23a3bd0bf2687a9635Douglas Gregor ObjCInterfaceDecl *Super) { 51820a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 5183c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff 5184c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff Expr *RecExpr = static_cast<Expr *>(Receiver); 5185c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff 518636ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // If necessary, apply function/array conversion to the receiver. 518736ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // C99 6.7.5.3p[7,8]. 5188429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley if (RecExpr) { 5189429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley ExprResult Conv = DefaultFunctionArrayLvalueConversion(RecExpr); 5190429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley if (Conv.isInvalid()) // conversion failed. bail. 5191429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley return; 5192429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley RecExpr = Conv.take(); 5193429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley } 51946b0656a7c386662e1bec5f23a3bd0bf2687a9635Douglas Gregor QualType ReceiverType = RecExpr? RecExpr->getType() 51956b0656a7c386662e1bec5f23a3bd0bf2687a9635Douglas Gregor : Super? Context.getObjCObjectPointerType( 51966b0656a7c386662e1bec5f23a3bd0bf2687a9635Douglas Gregor Context.getObjCInterfaceType(Super)) 51976b0656a7c386662e1bec5f23a3bd0bf2687a9635Douglas Gregor : Context.getObjCIdType(); 5198c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff 5199da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor // If we're messaging an expression with type "id" or "Class", check 5200da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor // whether we know something special about the receiver that allows 5201da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor // us to assume a more-specific receiver type. 5202da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor if (ReceiverType->isObjCIdType() || ReceiverType->isObjCClassType()) 5203da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor if (ObjCInterfaceDecl *IFace = GetAssumedMessageSendExprType(RecExpr)) { 5204da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor if (ReceiverType->isObjCClassType()) 5205da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor return CodeCompleteObjCClassMessage(S, 5206da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor ParsedType::make(Context.getObjCInterfaceType(IFace)), 5207da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor SelIdents, NumSelIdents, 5208da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor AtArgumentExpression, Super); 5209da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor 5210da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor ReceiverType = Context.getObjCObjectPointerType( 5211da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor Context.getObjCInterfaceType(IFace)); 5212da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor } 5213da892649f9a0b6dd92eecb97c7959dc3f968241fDouglas Gregor 521436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Build the set of methods we can see. 5215218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5216e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor CodeCompletionContext(CodeCompletionContext::CCC_ObjCInstanceMessage, 52170a47d69af8bda945352997af3da4687a3356096aDouglas Gregor ReceiverType, SelIdents, NumSelIdents)); 5218e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor 521936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor Results.EnterNewScope(); 522022f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor 522103d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor // If this is a send-to-super, try to add the special "super" send 522203d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor // completion. 52236b0656a7c386662e1bec5f23a3bd0bf2687a9635Douglas Gregor if (Super) { 522403d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor if (ObjCMethodDecl *SuperMethod 522503d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor = AddSuperSendCompletion(*this, false, SelIdents, NumSelIdents, 522603d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor Results)) 522703d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor Results.Ignore(SuperMethod); 522803d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor } 522903d8aec611380d30ddb0659bb61be9289c3871b3Douglas Gregor 5230265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor // If we're inside an Objective-C method definition, prefer its selector to 5231265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor // others. 5232265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) 5233265f749edb28a80db517cc9051bd21092720d0f0Douglas Gregor Results.setPreferredSelector(CurMethod->getSelector()); 523436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 5235d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor // Keep track of the selectors we've already added. 5236d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor VisitedSelectorSet Selectors; 5237d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor 5238f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // Handle messages to Class. This really isn't a message to an instance 5239f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // method, so we treat it the same way we would treat a message send to a 5240f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // class method. 5241f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor if (ReceiverType->isObjCClassType() || 5242f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor ReceiverType->isObjCQualifiedClassType()) { 5243f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) { 5244f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor if (ObjCInterfaceDecl *ClassDecl = CurMethod->getClassInterface()) 52454ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(ClassDecl, false, MK_Any, SelIdents, NumSelIdents, 5246cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor CurContext, Selectors, AtArgumentExpression, Results); 5247f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor } 5248f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor } 5249f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // Handle messages to a qualified ID ("id<foo>"). 5250f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor else if (const ObjCObjectPointerType *QualID 5251f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor = ReceiverType->getAsObjCQualifiedIdType()) { 5252f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // Search protocols for instance methods. 5253f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor for (ObjCObjectPointerType::qual_iterator I = QualID->qual_begin(), 5254f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor E = QualID->qual_end(); 5255f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor I != E; ++I) 52564ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(*I, true, MK_Any, SelIdents, NumSelIdents, CurContext, 5257cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor Selectors, AtArgumentExpression, Results); 5258f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor } 5259f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // Handle messages to a pointer to interface type. 5260f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor else if (const ObjCObjectPointerType *IFacePtr 5261f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor = ReceiverType->getAsObjCInterfacePointerType()) { 5262f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // Search the class, its superclasses, etc., for instance methods. 52634ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(IFacePtr->getInterfaceDecl(), true, MK_Any, SelIdents, 5264cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor NumSelIdents, CurContext, Selectors, AtArgumentExpression, 5265cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor Results); 5266f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor 5267f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // Search protocols for instance methods. 5268f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor for (ObjCObjectPointerType::qual_iterator I = IFacePtr->qual_begin(), 5269f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor E = IFacePtr->qual_end(); 5270f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor I != E; ++I) 52714ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(*I, true, MK_Any, SelIdents, NumSelIdents, CurContext, 5272cf5442648d4fdd9f1a3b524e449bbdb172ed14faDouglas Gregor Selectors, AtArgumentExpression, Results); 5273f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor } 527413438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor // Handle messages to "id". 527513438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor else if (ReceiverType->isObjCIdType()) { 5276719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor // We're messaging "id", so provide all instance methods we know 5277719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor // about as code-completion results. 5278719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor 5279719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor // If we have an external source, load the entire class method 52803c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl // pool from the AST file. 5281719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor if (ExternalSource) { 528276bd1f387e6a7b7abfe53f63b3bd429b97bb80f0John McCall for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors(); 528376bd1f387e6a7b7abfe53f63b3bd429b97bb80f0John McCall I != N; ++I) { 528476bd1f387e6a7b7abfe53f63b3bd429b97bb80f0John McCall Selector Sel = ExternalSource->GetExternalSelector(I); 5285db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl if (Sel.isNull() || MethodPool.count(Sel)) 5286719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor continue; 5287719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor 5288db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl ReadMethodPool(Sel); 5289719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor } 5290719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor } 5291719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor 5292db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl for (GlobalMethodPool::iterator M = MethodPool.begin(), 5293db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl MEnd = MethodPool.end(); 5294db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl M != MEnd; ++M) { 5295db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl for (ObjCMethodList *MethList = &M->second.first; 5296db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl MethList && MethList->Method; 529713438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor MethList = MethList->Next) { 529813438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor if (!isAcceptableObjCMethod(MethList->Method, MK_Any, SelIdents, 529913438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor NumSelIdents)) 530013438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor continue; 5301d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor 5302d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor if (!Selectors.insert(MethList->Method->getSelector())) 5303d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor continue; 5304d36adf553cd71df96fe869204482e0f0d68c6bbfDouglas Gregor 530513438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor Result R(MethList->Method, 0); 530613438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor R.StartParameter = NumSelIdents; 530713438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor R.AllParametersAreInformative = false; 530813438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor Results.MaybeAddResult(R, CurContext); 530913438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor } 531013438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor } 531113438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor } 5312f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor Results.ExitScope(); 5313b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor 5314b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor 5315b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor // If we're actually at the argument expression (rather than prior to the 5316b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor // selector), we're actually performing code completion for an expression. 5317b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor // Determine whether we have a single, best method. If so, we can 5318b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor // code-complete the expression using the corresponding parameter type as 5319b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor // our preferred type, improving completion results. 5320b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor if (AtArgumentExpression) { 5321b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor QualType PreferredType = getPreferredArgumentTypeForMessageSend(Results, 5322b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor NumSelIdents); 5323b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor if (PreferredType.isNull()) 5324b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor CodeCompleteOrdinaryName(S, PCC_Expression); 5325b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor else 5326b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor CodeCompleteExpression(S, PreferredType); 5327b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor return; 5328b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor } 5329b9d775734b02e5369bdfa78fa3e479c7281a9761Douglas Gregor 5330e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 5331e081a61bb0dc546fd623bf259435d17c9a4ea0d5Douglas Gregor Results.getCompletionContext(), 5332e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 5333c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff} 533455385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor 5335fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregorvoid Sema::CodeCompleteObjCForCollection(Scope *S, 5336fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor DeclGroupPtrTy IterationVar) { 5337fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor CodeCompleteExpressionData Data; 5338fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor Data.ObjCCollection = true; 5339fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor 5340fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor if (IterationVar.getAsOpaquePtr()) { 5341fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor DeclGroupRef DG = IterationVar.getAsVal<DeclGroupRef>(); 5342fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor for (DeclGroupRef::iterator I = DG.begin(), End = DG.end(); I != End; ++I) { 5343fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor if (*I) 5344fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor Data.IgnoreDecls.push_back(*I); 5345fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor } 5346fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor } 5347fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor 5348fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor CodeCompleteExpression(S, Data); 5349fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor} 5350fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor 5351458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregorvoid Sema::CodeCompleteObjCSelector(Scope *S, IdentifierInfo **SelIdents, 5352458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor unsigned NumSelIdents) { 5353458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor // If we have an external source, load the entire class method 5354458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor // pool from the AST file. 5355458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor if (ExternalSource) { 5356458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors(); 5357458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor I != N; ++I) { 5358458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor Selector Sel = ExternalSource->GetExternalSelector(I); 5359458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor if (Sel.isNull() || MethodPool.count(Sel)) 5360458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor continue; 5361458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor 5362458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor ReadMethodPool(Sel); 5363458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor } 5364458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor } 5365458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor 5366218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5367218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_SelectorName); 5368458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor Results.EnterNewScope(); 5369458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor for (GlobalMethodPool::iterator M = MethodPool.begin(), 5370458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor MEnd = MethodPool.end(); 5371458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor M != MEnd; ++M) { 5372458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor 5373458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor Selector Sel = M->first; 5374458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor if (!isAcceptableObjCSelector(Sel, MK_Any, SelIdents, NumSelIdents)) 5375458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor continue; 5376458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor 5377218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder Builder(Results.getAllocator()); 5378458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor if (Sel.isUnarySelector()) { 5379dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddTypedTextChunk(Builder.getAllocator().CopyString( 5380813d8346529bf094eb2b249648906ba7fd226688Douglas Gregor Sel.getNameForSlot(0))); 5381218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 5382458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor continue; 5383458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor } 5384458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor 53852d9e21f4675232a39a39611a5b4bb1f4914b2742Douglas Gregor std::string Accumulator; 5386458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor for (unsigned I = 0, N = Sel.getNumArgs(); I != N; ++I) { 53872d9e21f4675232a39a39611a5b4bb1f4914b2742Douglas Gregor if (I == NumSelIdents) { 53882d9e21f4675232a39a39611a5b4bb1f4914b2742Douglas Gregor if (!Accumulator.empty()) { 5389dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddInformativeChunk(Builder.getAllocator().CopyString( 5390218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Accumulator)); 53912d9e21f4675232a39a39611a5b4bb1f4914b2742Douglas Gregor Accumulator.clear(); 53922d9e21f4675232a39a39611a5b4bb1f4914b2742Douglas Gregor } 53932d9e21f4675232a39a39611a5b4bb1f4914b2742Douglas Gregor } 53942d9e21f4675232a39a39611a5b4bb1f4914b2742Douglas Gregor 5395a0651c5f5d1c8928d3ae062435ed9cf0aa0d04baBenjamin Kramer Accumulator += Sel.getNameForSlot(I); 53962d9e21f4675232a39a39611a5b4bb1f4914b2742Douglas Gregor Accumulator += ':'; 5397458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor } 5398dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddTypedTextChunk(Builder.getAllocator().CopyString( Accumulator)); 5399218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 5400458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor } 5401458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor Results.ExitScope(); 5402458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor 5403458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 5404458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor CodeCompletionContext::CCC_SelectorName, 5405458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor Results.data(), Results.size()); 5406458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor} 5407458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor 540855385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor/// \brief Add all of the protocol declarations that we find in the given 540955385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor/// (translation unit) context. 541055385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregorstatic void AddProtocolResults(DeclContext *Ctx, DeclContext *CurContext, 5411083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor bool OnlyForwardDeclarations, 541255385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor ResultBuilder &Results) { 54130a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 541455385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor 541555385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor for (DeclContext::decl_iterator D = Ctx->decls_begin(), 541655385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor DEnd = Ctx->decls_end(); 541755385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor D != DEnd; ++D) { 541855385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor // Record any protocols we find. 541955385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor if (ObjCProtocolDecl *Proto = dyn_cast<ObjCProtocolDecl>(*D)) 5420083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor if (!OnlyForwardDeclarations || Proto->isForwardDecl()) 5421608300be1972c43fe99154d25d62d697e7c0a0c2Douglas Gregor Results.AddResult(Result(Proto, 0), CurContext, 0, false); 542255385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor 542355385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor // Record any forward-declared protocols we find. 542455385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor if (ObjCForwardProtocolDecl *Forward 542555385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor = dyn_cast<ObjCForwardProtocolDecl>(*D)) { 542655385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor for (ObjCForwardProtocolDecl::protocol_iterator 542755385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor P = Forward->protocol_begin(), 542855385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor PEnd = Forward->protocol_end(); 542955385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor P != PEnd; ++P) 5430083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor if (!OnlyForwardDeclarations || (*P)->isForwardDecl()) 5431608300be1972c43fe99154d25d62d697e7c0a0c2Douglas Gregor Results.AddResult(Result(*P, 0), CurContext, 0, false); 543255385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor } 543355385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor } 543455385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor} 543555385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor 543655385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregorvoid Sema::CodeCompleteObjCProtocolReferences(IdentifierLocPair *Protocols, 543755385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor unsigned NumProtocols) { 5438218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5439218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_ObjCProtocolName); 544055385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor 544170c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor if (CodeCompleter && CodeCompleter->includeGlobals()) { 544270c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor Results.EnterNewScope(); 544370c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor 544470c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor // Tell the result set to ignore all of the protocols we have 544570c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor // already seen. 544670c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor // FIXME: This doesn't work when caching code-completion results. 544770c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor for (unsigned I = 0; I != NumProtocols; ++I) 544870c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor if (ObjCProtocolDecl *Protocol = LookupProtocol(Protocols[I].first, 544970c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor Protocols[I].second)) 545070c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor Results.Ignore(Protocol); 545170c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor 545270c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor // Add all protocols. 545370c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor AddProtocolResults(Context.getTranslationUnitDecl(), CurContext, false, 545470c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor Results); 5455083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor 545670c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor Results.ExitScope(); 545770c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor } 545870c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor 5459e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 5460e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_ObjCProtocolName, 5461e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 5462083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor} 5463083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor 5464083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregorvoid Sema::CodeCompleteObjCProtocolDecl(Scope *) { 5465218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5466218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_ObjCProtocolName); 5467083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor 546870c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor if (CodeCompleter && CodeCompleter->includeGlobals()) { 546970c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor Results.EnterNewScope(); 547070c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor 547170c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor // Add all protocols. 547270c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor AddProtocolResults(Context.getTranslationUnitDecl(), CurContext, true, 547370c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor Results); 547455385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor 547570c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor Results.ExitScope(); 547670c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor } 547770c233591ad2f77a01c8a318283ae03010c64c8fDouglas Gregor 5478e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 5479e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_ObjCProtocolName, 5480e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 548155385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor} 54823b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 54833b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor/// \brief Add all of the Objective-C interface declarations that we find in 54843b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor/// the given (translation unit) context. 54853b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregorstatic void AddInterfaceResults(DeclContext *Ctx, DeclContext *CurContext, 54863b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor bool OnlyForwardDeclarations, 54873b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor bool OnlyUnimplemented, 54883b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor ResultBuilder &Results) { 54890a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 54903b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 54913b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor for (DeclContext::decl_iterator D = Ctx->decls_begin(), 54923b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor DEnd = Ctx->decls_end(); 54933b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor D != DEnd; ++D) { 5494deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor // Record any interfaces we find. 5495deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor if (ObjCInterfaceDecl *Class = dyn_cast<ObjCInterfaceDecl>(*D)) 5496deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor if ((!OnlyForwardDeclarations || Class->isForwardDecl()) && 5497deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor (!OnlyUnimplemented || !Class->getImplementation())) 5498deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor Results.AddResult(Result(Class, 0), CurContext, 0, false); 54993b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 55003b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor // Record any forward-declared interfaces we find. 55013b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor if (ObjCClassDecl *Forward = dyn_cast<ObjCClassDecl>(*D)) { 550295ed7784a335aca53b0c6e952cf31a4cfb633360Fariborz Jahanian ObjCInterfaceDecl *IDecl = Forward->getForwardInterfaceDecl(); 550395ed7784a335aca53b0c6e952cf31a4cfb633360Fariborz Jahanian if ((!OnlyForwardDeclarations || IDecl->isForwardDecl()) && 550495ed7784a335aca53b0c6e952cf31a4cfb633360Fariborz Jahanian (!OnlyUnimplemented || !IDecl->getImplementation())) 550595ed7784a335aca53b0c6e952cf31a4cfb633360Fariborz Jahanian Results.AddResult(Result(IDecl, 0), CurContext, 550695ed7784a335aca53b0c6e952cf31a4cfb633360Fariborz Jahanian 0, false); 55073b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor } 55083b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor } 55093b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor} 55103b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 55113b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregorvoid Sema::CodeCompleteObjCInterfaceDecl(Scope *S) { 5512218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5513218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 55143b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.EnterNewScope(); 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 5529c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregorvoid Sema::CodeCompleteObjCSuperclass(Scope *S, IdentifierInfo *ClassName, 5530c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor SourceLocation ClassNameLoc) { 5531218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 55320f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor CodeCompletionContext::CCC_ObjCInterfaceName); 55333b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.EnterNewScope(); 55343b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 55353b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor // Make sure that we ignore the class we're currently defining. 55363b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor NamedDecl *CurClass 5537c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor = LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName); 553833ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor if (CurClass && isa<ObjCInterfaceDecl>(CurClass)) 55393b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.Ignore(CurClass); 55403b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 55410f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor if (CodeCompleter->includeGlobals()) { 55420f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor // Add all classes. 55430f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false, 55440f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor false, Results); 55450f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor } 55460f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor 55473b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.ExitScope(); 55480f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor 5549e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 55500f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor CodeCompletionContext::CCC_ObjCInterfaceName, 5551e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 55523b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor} 55533b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 55543b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregorvoid Sema::CodeCompleteObjCImplementationDecl(Scope *S) { 5555218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5556218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 55573b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.EnterNewScope(); 55583b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 55590f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor if (CodeCompleter->includeGlobals()) { 55600f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor // Add all unimplemented classes. 55610f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false, 55620f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor true, Results); 55630f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor } 55640f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor 55653b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.ExitScope(); 55660f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor 5567e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 55680f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor CodeCompletionContext::CCC_ObjCInterfaceName, 5569e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 55703b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor} 557133ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 557233ced0b8550f3e7169f326944731ee02e9338659Douglas Gregorvoid Sema::CodeCompleteObjCInterfaceCategory(Scope *S, 5573c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor IdentifierInfo *ClassName, 5574c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor SourceLocation ClassNameLoc) { 55750a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 557633ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 5577218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 55783da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CodeCompletionContext::CCC_ObjCCategoryName); 557933ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 558033ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // Ignore any categories we find that have already been implemented by this 558133ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // interface. 558233ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor llvm::SmallPtrSet<IdentifierInfo *, 16> CategoryNames; 558333ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor NamedDecl *CurClass 5584c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor = LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName); 558533ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor if (ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurClass)) 558633ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor for (ObjCCategoryDecl *Category = Class->getCategoryList(); Category; 558733ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Category = Category->getNextClassCategory()) 558833ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor CategoryNames.insert(Category->getIdentifier()); 558933ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 559033ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // Add all of the categories we know about. 559133ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Results.EnterNewScope(); 559233ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor TranslationUnitDecl *TU = Context.getTranslationUnitDecl(); 559333ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor for (DeclContext::decl_iterator D = TU->decls_begin(), 559433ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor DEnd = TU->decls_end(); 559533ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor D != DEnd; ++D) 559633ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(*D)) 559733ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor if (CategoryNames.insert(Category->getIdentifier())) 5598608300be1972c43fe99154d25d62d697e7c0a0c2Douglas Gregor Results.AddResult(Result(Category, 0), CurContext, 0, false); 559933ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Results.ExitScope(); 560033ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 5601e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 56023da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CodeCompletionContext::CCC_ObjCCategoryName, 5603e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 560433ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor} 560533ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 560633ced0b8550f3e7169f326944731ee02e9338659Douglas Gregorvoid Sema::CodeCompleteObjCImplementationCategory(Scope *S, 5607c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor IdentifierInfo *ClassName, 5608c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor SourceLocation ClassNameLoc) { 56090a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 561033ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 561133ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // Find the corresponding interface. If we couldn't find the interface, the 561233ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // program itself is ill-formed. However, we'll try to be helpful still by 561333ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // providing the list of all of the categories we know about. 561433ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor NamedDecl *CurClass 5615c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor = LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName); 561633ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurClass); 561733ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor if (!Class) 5618c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor return CodeCompleteObjCInterfaceCategory(S, ClassName, ClassNameLoc); 561933ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 5620218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 56213da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CodeCompletionContext::CCC_ObjCCategoryName); 562233ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 562333ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // Add all of the categories that have have corresponding interface 562433ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // declarations in this class and any of its superclasses, except for 562533ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // already-implemented categories in the class itself. 562633ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor llvm::SmallPtrSet<IdentifierInfo *, 16> CategoryNames; 562733ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Results.EnterNewScope(); 562833ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor bool IgnoreImplemented = true; 562933ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor while (Class) { 563033ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor for (ObjCCategoryDecl *Category = Class->getCategoryList(); Category; 563133ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Category = Category->getNextClassCategory()) 563233ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor if ((!IgnoreImplemented || !Category->getImplementation()) && 563333ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor CategoryNames.insert(Category->getIdentifier())) 5634608300be1972c43fe99154d25d62d697e7c0a0c2Douglas Gregor Results.AddResult(Result(Category, 0), CurContext, 0, false); 563533ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 563633ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Class = Class->getSuperClass(); 563733ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor IgnoreImplemented = false; 563833ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor } 563933ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Results.ExitScope(); 564033ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 5641e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 56423da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor CodeCompletionContext::CCC_ObjCCategoryName, 5643e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 564433ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor} 5645322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 5646a28948f34817476d02412fa204cae038e228c827Fariborz Jahanianvoid Sema::CodeCompleteObjCPropertyDefinition(Scope *S) { 56470a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 5648218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5649218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 5650322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 5651322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Figure out where this @synthesize lives. 5652322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor ObjCContainerDecl *Container 5653a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian = dyn_cast_or_null<ObjCContainerDecl>(CurContext); 5654322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor if (!Container || 5655322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor (!isa<ObjCImplementationDecl>(Container) && 5656322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor !isa<ObjCCategoryImplDecl>(Container))) 5657322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor return; 5658322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 5659322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Ignore any properties that have already been implemented. 5660322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor for (DeclContext::decl_iterator D = Container->decls_begin(), 5661322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor DEnd = Container->decls_end(); 5662322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor D != DEnd; ++D) 5663322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor if (ObjCPropertyImplDecl *PropertyImpl = dyn_cast<ObjCPropertyImplDecl>(*D)) 5664322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Results.Ignore(PropertyImpl->getPropertyDecl()); 5665322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 5666322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Add any properties that we find. 56677344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor AddedPropertiesSet AddedProperties; 5668322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Results.EnterNewScope(); 5669322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor if (ObjCImplementationDecl *ClassImpl 5670322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor = dyn_cast<ObjCImplementationDecl>(Container)) 56714b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddObjCProperties(ClassImpl->getClassInterface(), false, 56724b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor /*AllowNullaryMethods=*/false, CurContext, 56737344921b22bebec4f86eb8eb865150b2978b5d2eDouglas Gregor AddedProperties, Results); 5674322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor else 5675322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor AddObjCProperties(cast<ObjCCategoryImplDecl>(Container)->getCategoryDecl(), 56764b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor false, /*AllowNullaryMethods=*/false, CurContext, 56774b81cde48b8b56c219e8d665884f5f33139b5ecaDouglas Gregor AddedProperties, Results); 5678322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Results.ExitScope(); 5679322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 5680e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 5681e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 5682e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 5683322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor} 5684322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 5685322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregorvoid Sema::CodeCompleteObjCPropertySynthesizeIvar(Scope *S, 5686a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian IdentifierInfo *PropertyName) { 56870a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 5688218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5689218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 5690322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 5691322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Figure out where this @synthesize lives. 5692322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor ObjCContainerDecl *Container 5693a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian = dyn_cast_or_null<ObjCContainerDecl>(CurContext); 5694322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor if (!Container || 5695322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor (!isa<ObjCImplementationDecl>(Container) && 5696322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor !isa<ObjCCategoryImplDecl>(Container))) 5697322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor return; 5698322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 5699322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Figure out which interface we're looking into. 5700322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor ObjCInterfaceDecl *Class = 0; 5701322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor if (ObjCImplementationDecl *ClassImpl 5702322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor = dyn_cast<ObjCImplementationDecl>(Container)) 5703322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Class = ClassImpl->getClassInterface(); 5704322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor else 5705322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Class = cast<ObjCCategoryImplDecl>(Container)->getCategoryDecl() 5706322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor ->getClassInterface(); 5707322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 5708e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor // Determine the type of the property we're synthesizing. 5709e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor QualType PropertyType = Context.getObjCIdType(); 5710e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor if (Class) { 5711e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor if (ObjCPropertyDecl *Property 5712e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor = Class->FindPropertyDeclaration(PropertyName)) { 5713e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor PropertyType 5714e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor = Property->getType().getNonReferenceType().getUnqualifiedType(); 5715e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor 5716e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor // Give preference to ivars 5717e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor Results.setPreferredType(PropertyType); 5718e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor } 5719e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor } 5720e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor 5721322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Add all of the instance variables in this class and its superclasses. 5722322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Results.EnterNewScope(); 5723aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor bool SawSimilarlyNamedIvar = false; 5724aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor std::string NameWithPrefix; 5725aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor NameWithPrefix += '_'; 5726a0651c5f5d1c8928d3ae062435ed9cf0aa0d04baBenjamin Kramer NameWithPrefix += PropertyName->getName(); 5727aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor std::string NameWithSuffix = PropertyName->getName().str(); 5728aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor NameWithSuffix += '_'; 5729322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor for(; Class; Class = Class->getSuperClass()) { 5730aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor for (ObjCIvarDecl *Ivar = Class->all_declared_ivar_begin(); Ivar; 5731aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor Ivar = Ivar->getNextIvar()) { 5732e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor Results.AddResult(Result(Ivar, 0), CurContext, 0, false); 5733e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor 5734aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor // Determine whether we've seen an ivar with a name similar to the 5735aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor // property. 5736e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor if ((PropertyName == Ivar->getIdentifier() || 5737aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor NameWithPrefix == Ivar->getName() || 5738e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor NameWithSuffix == Ivar->getName())) { 5739aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor SawSimilarlyNamedIvar = true; 5740e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor 5741e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor // Reduce the priority of this result by one, to give it a slight 5742e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor // advantage over other results whose names don't match so closely. 5743e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor if (Results.size() && 5744e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor Results.data()[Results.size() - 1].Kind 5745e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor == CodeCompletionResult::RK_Declaration && 5746e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor Results.data()[Results.size() - 1].Declaration == Ivar) 5747e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor Results.data()[Results.size() - 1].Priority--; 5748e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor } 5749aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor } 5750322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor } 5751aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor 5752aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor if (!SawSimilarlyNamedIvar) { 5753aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor // Create ivar result _propName, that the user can use to synthesize 5754e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor // an ivar of the appropriate type. 5755e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor unsigned Priority = CCP_MemberDeclaration + 1; 5756aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor typedef CodeCompletionResult Result; 5757aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor CodeCompletionAllocator &Allocator = Results.getAllocator(); 5758aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor CodeCompletionBuilder Builder(Allocator, Priority,CXAvailability_Available); 5759aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor 57608987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor PrintingPolicy Policy = getCompletionPrintingPolicy(*this); 5761e84260513dc9fc17904c30c9400c5862a2d7fcb8Douglas Gregor Builder.AddResultTypeChunk(GetCompletionTypeString(PropertyType, Context, 57628987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor Policy, Allocator)); 5763aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(NameWithPrefix)); 5764aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor Results.AddResult(Result(Builder.TakeString(), Priority, 5765aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor CXCursor_ObjCIvarDecl)); 5766aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor } 5767aa490cb6a70e7ff0335bdc4c88619e00ff0dab25Douglas Gregor 5768322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Results.ExitScope(); 5769322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 5770e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 5771e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 5772e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 5773322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor} 5774e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 5775408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor// Mapping from selectors to the methods that implement that selector, along 5776408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor// with the "in original class" flag. 5777408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregortypedef llvm::DenseMap<Selector, std::pair<ObjCMethodDecl *, bool> > 5778408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor KnownMethodsMap; 5779e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 5780e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor/// \brief Find all of the methods that reside in the given container 5781e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor/// (and its superclasses, protocols, etc.) that meet the given 5782e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor/// criteria. Insert those methods into the map of known methods, 5783e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor/// indexed by selector so they can be easily found. 5784e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregorstatic void FindImplementableMethods(ASTContext &Context, 5785e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor ObjCContainerDecl *Container, 5786e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor bool WantInstanceMethods, 5787e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor QualType ReturnType, 5788408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor KnownMethodsMap &KnownMethods, 5789408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor bool InOriginalClass = true) { 5790e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container)) { 5791e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Recurse into protocols. 5792e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor const ObjCList<ObjCProtocolDecl> &Protocols 5793e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor = IFace->getReferencedProtocols(); 5794e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 5795ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor E = Protocols.end(); 5796e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor I != E; ++I) 5797e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType, 5798ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor KnownMethods, InOriginalClass); 5799e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 5800ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor // Add methods from any class extensions and categories. 5801ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor for (const ObjCCategoryDecl *Cat = IFace->getCategoryList(); Cat; 5802ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor Cat = Cat->getNextClassCategory()) 580380aa1cd7973561889e51c1c152c8990a8de9c953Fariborz Jahanian FindImplementableMethods(Context, const_cast<ObjCCategoryDecl*>(Cat), 580480aa1cd7973561889e51c1c152c8990a8de9c953Fariborz Jahanian WantInstanceMethods, ReturnType, 5805ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor KnownMethods, false); 5806ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor 5807ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor // Visit the superclass. 5808ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor if (IFace->getSuperClass()) 5809ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor FindImplementableMethods(Context, IFace->getSuperClass(), 5810ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor WantInstanceMethods, ReturnType, 5811ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor KnownMethods, false); 5812e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 5813e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 5814e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(Container)) { 5815e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Recurse into protocols. 5816e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor const ObjCList<ObjCProtocolDecl> &Protocols 5817e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor = Category->getReferencedProtocols(); 5818e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 5819ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor E = Protocols.end(); 5820e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor I != E; ++I) 5821e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType, 5822ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor KnownMethods, InOriginalClass); 5823ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor 5824ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor // If this category is the original class, jump to the interface. 5825ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor if (InOriginalClass && Category->getClassInterface()) 5826ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor FindImplementableMethods(Context, Category->getClassInterface(), 5827ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor WantInstanceMethods, ReturnType, KnownMethods, 5828ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor false); 5829e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 5830e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 5831e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) { 5832e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Recurse into protocols. 5833e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor const ObjCList<ObjCProtocolDecl> &Protocols 5834e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor = Protocol->getReferencedProtocols(); 5835e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 5836e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor E = Protocols.end(); 5837e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor I != E; ++I) 5838e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType, 5839ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor KnownMethods, false); 5840e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 5841e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 5842e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Add methods in this container. This operation occurs last because 5843e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // we want the methods from this container to override any methods 5844e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // we've previously seen with the same selector. 5845e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor for (ObjCContainerDecl::method_iterator M = Container->meth_begin(), 5846e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor MEnd = Container->meth_end(); 5847e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor M != MEnd; ++M) { 5848e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if ((*M)->isInstanceMethod() == WantInstanceMethods) { 5849e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (!ReturnType.isNull() && 5850e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor !Context.hasSameUnqualifiedType(ReturnType, (*M)->getResultType())) 5851e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor continue; 5852e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 5853408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor KnownMethods[(*M)->getSelector()] = std::make_pair(*M, InOriginalClass); 5854e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 5855e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 5856e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor} 5857e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 5858577cdfdb20840350e841a483df630237326126d5Douglas Gregor/// \brief Add the parenthesized return or parameter type chunk to a code 5859577cdfdb20840350e841a483df630237326126d5Douglas Gregor/// completion string. 5860577cdfdb20840350e841a483df630237326126d5Douglas Gregorstatic void AddObjCPassingTypeChunk(QualType Type, 5861577cdfdb20840350e841a483df630237326126d5Douglas Gregor ASTContext &Context, 58628987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor const PrintingPolicy &Policy, 5863577cdfdb20840350e841a483df630237326126d5Douglas Gregor CodeCompletionBuilder &Builder) { 5864577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 58658987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor Builder.AddTextChunk(GetCompletionTypeString(Type, Context, Policy, 5866577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.getAllocator())); 5867577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 5868577cdfdb20840350e841a483df630237326126d5Douglas Gregor} 5869577cdfdb20840350e841a483df630237326126d5Douglas Gregor 5870577cdfdb20840350e841a483df630237326126d5Douglas Gregor/// \brief Determine whether the given class is or inherits from a class by 5871577cdfdb20840350e841a483df630237326126d5Douglas Gregor/// the given name. 5872577cdfdb20840350e841a483df630237326126d5Douglas Gregorstatic bool InheritsFromClassNamed(ObjCInterfaceDecl *Class, 58735f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef Name) { 5874577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (!Class) 5875577cdfdb20840350e841a483df630237326126d5Douglas Gregor return false; 5876577cdfdb20840350e841a483df630237326126d5Douglas Gregor 5877577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (Class->getIdentifier() && Class->getIdentifier()->getName() == Name) 5878577cdfdb20840350e841a483df630237326126d5Douglas Gregor return true; 5879577cdfdb20840350e841a483df630237326126d5Douglas Gregor 5880577cdfdb20840350e841a483df630237326126d5Douglas Gregor return InheritsFromClassNamed(Class->getSuperClass(), Name); 5881577cdfdb20840350e841a483df630237326126d5Douglas Gregor} 5882577cdfdb20840350e841a483df630237326126d5Douglas Gregor 5883577cdfdb20840350e841a483df630237326126d5Douglas Gregor/// \brief Add code completions for Objective-C Key-Value Coding (KVC) and 5884577cdfdb20840350e841a483df630237326126d5Douglas Gregor/// Key-Value Observing (KVO). 5885577cdfdb20840350e841a483df630237326126d5Douglas Gregorstatic void AddObjCKeyValueCompletions(ObjCPropertyDecl *Property, 5886577cdfdb20840350e841a483df630237326126d5Douglas Gregor bool IsInstanceMethod, 5887577cdfdb20840350e841a483df630237326126d5Douglas Gregor QualType ReturnType, 5888577cdfdb20840350e841a483df630237326126d5Douglas Gregor ASTContext &Context, 5889e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor VisitedSelectorSet &KnownSelectors, 5890577cdfdb20840350e841a483df630237326126d5Douglas Gregor ResultBuilder &Results) { 5891577cdfdb20840350e841a483df630237326126d5Douglas Gregor IdentifierInfo *PropName = Property->getIdentifier(); 5892577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (!PropName || PropName->getLength() == 0) 5893577cdfdb20840350e841a483df630237326126d5Douglas Gregor return; 5894577cdfdb20840350e841a483df630237326126d5Douglas Gregor 58958987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor PrintingPolicy Policy = getCompletionPrintingPolicy(Results.getSema()); 58968987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor 5897577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Builder that will create each code completion. 5898577cdfdb20840350e841a483df630237326126d5Douglas Gregor typedef CodeCompletionResult Result; 5899577cdfdb20840350e841a483df630237326126d5Douglas Gregor CodeCompletionAllocator &Allocator = Results.getAllocator(); 5900577cdfdb20840350e841a483df630237326126d5Douglas Gregor CodeCompletionBuilder Builder(Allocator); 5901577cdfdb20840350e841a483df630237326126d5Douglas Gregor 5902577cdfdb20840350e841a483df630237326126d5Douglas Gregor // The selector table. 5903577cdfdb20840350e841a483df630237326126d5Douglas Gregor SelectorTable &Selectors = Context.Selectors; 5904577cdfdb20840350e841a483df630237326126d5Douglas Gregor 5905577cdfdb20840350e841a483df630237326126d5Douglas Gregor // The property name, copied into the code completion allocation region 5906577cdfdb20840350e841a483df630237326126d5Douglas Gregor // on demand. 5907577cdfdb20840350e841a483df630237326126d5Douglas Gregor struct KeyHolder { 5908577cdfdb20840350e841a483df630237326126d5Douglas Gregor CodeCompletionAllocator &Allocator; 59095f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef Key; 5910577cdfdb20840350e841a483df630237326126d5Douglas Gregor const char *CopiedKey; 5911577cdfdb20840350e841a483df630237326126d5Douglas Gregor 59125f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner KeyHolder(CodeCompletionAllocator &Allocator, StringRef Key) 5913577cdfdb20840350e841a483df630237326126d5Douglas Gregor : Allocator(Allocator), Key(Key), CopiedKey(0) { } 5914577cdfdb20840350e841a483df630237326126d5Douglas Gregor 5915577cdfdb20840350e841a483df630237326126d5Douglas Gregor operator const char *() { 5916577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (CopiedKey) 5917577cdfdb20840350e841a483df630237326126d5Douglas Gregor return CopiedKey; 5918577cdfdb20840350e841a483df630237326126d5Douglas Gregor 5919577cdfdb20840350e841a483df630237326126d5Douglas Gregor return CopiedKey = Allocator.CopyString(Key); 5920577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 5921577cdfdb20840350e841a483df630237326126d5Douglas Gregor } Key(Allocator, PropName->getName()); 5922577cdfdb20840350e841a483df630237326126d5Douglas Gregor 5923577cdfdb20840350e841a483df630237326126d5Douglas Gregor // The uppercased name of the property name. 5924577cdfdb20840350e841a483df630237326126d5Douglas Gregor std::string UpperKey = PropName->getName(); 5925577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (!UpperKey.empty()) 5926577cdfdb20840350e841a483df630237326126d5Douglas Gregor UpperKey[0] = toupper(UpperKey[0]); 5927577cdfdb20840350e841a483df630237326126d5Douglas Gregor 5928577cdfdb20840350e841a483df630237326126d5Douglas Gregor bool ReturnTypeMatchesProperty = ReturnType.isNull() || 5929577cdfdb20840350e841a483df630237326126d5Douglas Gregor Context.hasSameUnqualifiedType(ReturnType.getNonReferenceType(), 5930577cdfdb20840350e841a483df630237326126d5Douglas Gregor Property->getType()); 5931577cdfdb20840350e841a483df630237326126d5Douglas Gregor bool ReturnTypeMatchesVoid 5932577cdfdb20840350e841a483df630237326126d5Douglas Gregor = ReturnType.isNull() || ReturnType->isVoidType(); 5933577cdfdb20840350e841a483df630237326126d5Douglas Gregor 5934577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Add the normal accessor -(type)key. 5935577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && 5936e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor KnownSelectors.insert(Selectors.getNullarySelector(PropName)) && 5937577cdfdb20840350e841a483df630237326126d5Douglas Gregor ReturnTypeMatchesProperty && !Property->getGetterMethodDecl()) { 5938577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) 59398987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor AddObjCPassingTypeChunk(Property->getType(), Context, Policy, Builder); 5940577cdfdb20840350e841a483df630237326126d5Douglas Gregor 5941577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Key); 5942577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern, 5943577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 5944577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 5945577cdfdb20840350e841a483df630237326126d5Douglas Gregor 5946577cdfdb20840350e841a483df630237326126d5Douglas Gregor // If we have an integral or boolean property (or the user has provided 5947577cdfdb20840350e841a483df630237326126d5Douglas Gregor // an integral or boolean return type), add the accessor -(type)isKey. 5948577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && 5949577cdfdb20840350e841a483df630237326126d5Douglas Gregor ((!ReturnType.isNull() && 5950577cdfdb20840350e841a483df630237326126d5Douglas Gregor (ReturnType->isIntegerType() || ReturnType->isBooleanType())) || 5951577cdfdb20840350e841a483df630237326126d5Douglas Gregor (ReturnType.isNull() && 5952577cdfdb20840350e841a483df630237326126d5Douglas Gregor (Property->getType()->isIntegerType() || 5953577cdfdb20840350e841a483df630237326126d5Douglas Gregor Property->getType()->isBooleanType())))) { 59545f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::string SelectorName = (Twine("is") + UpperKey).str(); 59556204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 5956e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))) { 5957577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 5958577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 5959577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("BOOL"); 5960577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 5961577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 5962577cdfdb20840350e841a483df630237326126d5Douglas Gregor 5963577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk( 5964577cdfdb20840350e841a483df630237326126d5Douglas Gregor Allocator.CopyString(SelectorId->getName())); 5965577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern, 5966577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 5967577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 5968577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 5969577cdfdb20840350e841a483df630237326126d5Douglas Gregor 5970577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Add the normal mutator. 5971577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid && 5972577cdfdb20840350e841a483df630237326126d5Douglas Gregor !Property->getSetterMethodDecl()) { 59735f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::string SelectorName = (Twine("set") + UpperKey).str(); 59746204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 5975e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 5976577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 5977577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 5978577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 5979577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 5980577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 5981577cdfdb20840350e841a483df630237326126d5Douglas Gregor 5982577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk( 5983577cdfdb20840350e841a483df630237326126d5Douglas Gregor Allocator.CopyString(SelectorId->getName())); 5984577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(":"); 59858987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor AddObjCPassingTypeChunk(Property->getType(), Context, Policy, Builder); 5986577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk(Key); 5987577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern, 5988577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 5989577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 5990577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 5991577cdfdb20840350e841a483df630237326126d5Douglas Gregor 5992577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Indexed and unordered accessors 5993577cdfdb20840350e841a483df630237326126d5Douglas Gregor unsigned IndexedGetterPriority = CCP_CodePattern; 5994577cdfdb20840350e841a483df630237326126d5Douglas Gregor unsigned IndexedSetterPriority = CCP_CodePattern; 5995577cdfdb20840350e841a483df630237326126d5Douglas Gregor unsigned UnorderedGetterPriority = CCP_CodePattern; 5996577cdfdb20840350e841a483df630237326126d5Douglas Gregor unsigned UnorderedSetterPriority = CCP_CodePattern; 5997577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (const ObjCObjectPointerType *ObjCPointer 5998577cdfdb20840350e841a483df630237326126d5Douglas Gregor = Property->getType()->getAs<ObjCObjectPointerType>()) { 5999577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ObjCInterfaceDecl *IFace = ObjCPointer->getInterfaceDecl()) { 6000577cdfdb20840350e841a483df630237326126d5Douglas Gregor // If this interface type is not provably derived from a known 6001577cdfdb20840350e841a483df630237326126d5Douglas Gregor // collection, penalize the corresponding completions. 6002577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (!InheritsFromClassNamed(IFace, "NSMutableArray")) { 6003577cdfdb20840350e841a483df630237326126d5Douglas Gregor IndexedSetterPriority += CCD_ProbablyNotObjCCollection; 6004577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (!InheritsFromClassNamed(IFace, "NSArray")) 6005577cdfdb20840350e841a483df630237326126d5Douglas Gregor IndexedGetterPriority += CCD_ProbablyNotObjCCollection; 6006577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6007577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6008577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (!InheritsFromClassNamed(IFace, "NSMutableSet")) { 6009577cdfdb20840350e841a483df630237326126d5Douglas Gregor UnorderedSetterPriority += CCD_ProbablyNotObjCCollection; 6010577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (!InheritsFromClassNamed(IFace, "NSSet")) 6011577cdfdb20840350e841a483df630237326126d5Douglas Gregor UnorderedGetterPriority += CCD_ProbablyNotObjCCollection; 6012577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6013577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6014577cdfdb20840350e841a483df630237326126d5Douglas Gregor } else { 6015577cdfdb20840350e841a483df630237326126d5Douglas Gregor IndexedGetterPriority += CCD_ProbablyNotObjCCollection; 6016577cdfdb20840350e841a483df630237326126d5Douglas Gregor IndexedSetterPriority += CCD_ProbablyNotObjCCollection; 6017577cdfdb20840350e841a483df630237326126d5Douglas Gregor UnorderedGetterPriority += CCD_ProbablyNotObjCCollection; 6018577cdfdb20840350e841a483df630237326126d5Douglas Gregor UnorderedSetterPriority += CCD_ProbablyNotObjCCollection; 6019577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6020577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6021577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Add -(NSUInteger)countOf<key> 6022577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && 6023577cdfdb20840350e841a483df630237326126d5Douglas Gregor (ReturnType.isNull() || ReturnType->isIntegerType())) { 60245f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::string SelectorName = (Twine("countOf") + UpperKey).str(); 60256204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6026e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))) { 6027577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6028577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6029577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSUInteger"); 6030577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6031577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6032577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6033577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk( 6034577cdfdb20840350e841a483df630237326126d5Douglas Gregor Allocator.CopyString(SelectorId->getName())); 6035577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), 6036577cdfdb20840350e841a483df630237326126d5Douglas Gregor std::min(IndexedGetterPriority, 6037577cdfdb20840350e841a483df630237326126d5Douglas Gregor UnorderedGetterPriority), 6038577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6039577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6040577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6041577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6042577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Indexed getters 6043577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Add -(id)objectInKeyAtIndex:(NSUInteger)index 6044577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && 6045577cdfdb20840350e841a483df630237326126d5Douglas Gregor (ReturnType.isNull() || ReturnType->isObjCObjectPointerType())) { 60466204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor std::string SelectorName 60475f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner = (Twine("objectIn") + UpperKey + "AtIndex").str(); 60486204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6049e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6050577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6051577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6052577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("id"); 6053577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6054577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6055577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6056577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6057577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6058577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSUInteger"); 6059577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6060577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("index"); 6061577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority, 6062577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6063577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6064577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6065577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6066577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Add -(NSArray *)keyAtIndexes:(NSIndexSet *)indexes 6067577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && 6068577cdfdb20840350e841a483df630237326126d5Douglas Gregor (ReturnType.isNull() || 6069577cdfdb20840350e841a483df630237326126d5Douglas Gregor (ReturnType->isObjCObjectPointerType() && 6070577cdfdb20840350e841a483df630237326126d5Douglas Gregor ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() && 6071577cdfdb20840350e841a483df630237326126d5Douglas Gregor ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() 6072577cdfdb20840350e841a483df630237326126d5Douglas Gregor ->getName() == "NSArray"))) { 60736204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor std::string SelectorName 60745f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner = (Twine(Property->getName()) + "AtIndexes").str(); 60756204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6076e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6077577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6078577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6079577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSArray *"); 6080577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6081577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6082577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6083577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6084577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6085577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSIndexSet *"); 6086577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6087577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("indexes"); 6088577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority, 6089577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6090577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6091577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6092577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6093577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Add -(void)getKey:(type **)buffer range:(NSRange)inRange 6094577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid) { 60955f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::string SelectorName = (Twine("get") + UpperKey).str(); 6096577cdfdb20840350e841a483df630237326126d5Douglas Gregor IdentifierInfo *SelectorIds[2] = { 60976204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor &Context.Idents.get(SelectorName), 6098577cdfdb20840350e841a483df630237326126d5Douglas Gregor &Context.Idents.get("range") 6099577cdfdb20840350e841a483df630237326126d5Douglas Gregor }; 6100577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6101e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds))) { 6102577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6103577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6104577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6105577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6106577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6107577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6108577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6109577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6110577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddPlaceholderChunk("object-type"); 6111577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk(" **"); 6112577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6113577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("buffer"); 6114577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6115577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk("range:"); 6116577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6117577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSRange"); 6118577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6119577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("inRange"); 6120577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority, 6121577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6122577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6123577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6124577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6125577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Mutable indexed accessors 6126577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6127577cdfdb20840350e841a483df630237326126d5Douglas Gregor // - (void)insertObject:(type *)object inKeyAtIndex:(NSUInteger)index 6128577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid) { 61295f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::string SelectorName = (Twine("in") + UpperKey + "AtIndex").str(); 6130577cdfdb20840350e841a483df630237326126d5Douglas Gregor IdentifierInfo *SelectorIds[2] = { 6131577cdfdb20840350e841a483df630237326126d5Douglas Gregor &Context.Idents.get("insertObject"), 61326204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor &Context.Idents.get(SelectorName) 6133577cdfdb20840350e841a483df630237326126d5Douglas Gregor }; 6134577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6135e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds))) { 6136577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6137577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6138577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6139577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6140577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6141577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6142577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk("insertObject:"); 6143577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6144577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddPlaceholderChunk("object-type"); 6145577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk(" *"); 6146577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6147577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("object"); 6148577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6149577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6150577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6151577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddPlaceholderChunk("NSUInteger"); 6152577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6153577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("index"); 6154577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 6155577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6156577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6157577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6158577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6159577cdfdb20840350e841a483df630237326126d5Douglas Gregor // - (void)insertKey:(NSArray *)array atIndexes:(NSIndexSet *)indexes 6160577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid) { 61615f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::string SelectorName = (Twine("insert") + UpperKey).str(); 6162577cdfdb20840350e841a483df630237326126d5Douglas Gregor IdentifierInfo *SelectorIds[2] = { 61636204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor &Context.Idents.get(SelectorName), 6164577cdfdb20840350e841a483df630237326126d5Douglas Gregor &Context.Idents.get("atIndexes") 6165577cdfdb20840350e841a483df630237326126d5Douglas Gregor }; 6166577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6167e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds))) { 6168577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6169577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6170577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6171577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6172577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6173577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6174577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6175577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6176577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSArray *"); 6177577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6178577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("array"); 6179577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6180577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk("atIndexes:"); 6181577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6182577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddPlaceholderChunk("NSIndexSet *"); 6183577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6184577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("indexes"); 6185577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 6186577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6187577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6188577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6189577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6190577cdfdb20840350e841a483df630237326126d5Douglas Gregor // -(void)removeObjectFromKeyAtIndex:(NSUInteger)index 6191577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid) { 61926204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor std::string SelectorName 61935f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner = (Twine("removeObjectFrom") + UpperKey + "AtIndex").str(); 61946204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6195e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6196577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6197577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6198577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6199577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6200577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6201577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6202577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6203577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6204577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSUInteger"); 6205577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6206577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("index"); 6207577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 6208577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6209577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6210577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6211577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6212577cdfdb20840350e841a483df630237326126d5Douglas Gregor // -(void)removeKeyAtIndexes:(NSIndexSet *)indexes 6213577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid) { 62146204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor std::string SelectorName 62155f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner = (Twine("remove") + UpperKey + "AtIndexes").str(); 62166204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6217e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6218577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6219577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6220577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6221577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6222577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6223577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6224577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6225577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6226577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSIndexSet *"); 6227577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6228577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("indexes"); 6229577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 6230577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6231577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6232577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6233577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6234577cdfdb20840350e841a483df630237326126d5Douglas Gregor // - (void)replaceObjectInKeyAtIndex:(NSUInteger)index withObject:(id)object 6235577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid) { 62366204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor std::string SelectorName 62375f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner = (Twine("replaceObjectIn") + UpperKey + "AtIndex").str(); 6238577cdfdb20840350e841a483df630237326126d5Douglas Gregor IdentifierInfo *SelectorIds[2] = { 62396204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor &Context.Idents.get(SelectorName), 6240577cdfdb20840350e841a483df630237326126d5Douglas Gregor &Context.Idents.get("withObject") 6241577cdfdb20840350e841a483df630237326126d5Douglas Gregor }; 6242577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6243e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds))) { 6244577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6245577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6246577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6247577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6248577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6249577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6250577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6251577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6252577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddPlaceholderChunk("NSUInteger"); 6253577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6254577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("index"); 6255577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6256577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk("withObject:"); 6257577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6258577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("id"); 6259577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6260577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("object"); 6261577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 6262577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6263577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6264577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6265577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6266577cdfdb20840350e841a483df630237326126d5Douglas Gregor // - (void)replaceKeyAtIndexes:(NSIndexSet *)indexes withKey:(NSArray *)array 6267577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid) { 62686204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor std::string SelectorName1 62695f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner = (Twine("replace") + UpperKey + "AtIndexes").str(); 62705f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::string SelectorName2 = (Twine("with") + UpperKey).str(); 6271577cdfdb20840350e841a483df630237326126d5Douglas Gregor IdentifierInfo *SelectorIds[2] = { 62726204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor &Context.Idents.get(SelectorName1), 62736204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor &Context.Idents.get(SelectorName2) 6274577cdfdb20840350e841a483df630237326126d5Douglas Gregor }; 6275577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6276e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds))) { 6277577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6278577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6279577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6280577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6281577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6282577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6283577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName1 + ":")); 6284577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6285577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddPlaceholderChunk("NSIndexSet *"); 6286577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6287577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("indexes"); 6288577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6289577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName2 + ":")); 6290577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6291577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSArray *"); 6292577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6293577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("array"); 6294577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 6295577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6296577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6297577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6298577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6299577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Unordered getters 6300577cdfdb20840350e841a483df630237326126d5Douglas Gregor // - (NSEnumerator *)enumeratorOfKey 6301577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && 6302577cdfdb20840350e841a483df630237326126d5Douglas Gregor (ReturnType.isNull() || 6303577cdfdb20840350e841a483df630237326126d5Douglas Gregor (ReturnType->isObjCObjectPointerType() && 6304577cdfdb20840350e841a483df630237326126d5Douglas Gregor ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() && 6305577cdfdb20840350e841a483df630237326126d5Douglas Gregor ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() 6306577cdfdb20840350e841a483df630237326126d5Douglas Gregor ->getName() == "NSEnumerator"))) { 63075f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::string SelectorName = (Twine("enumeratorOf") + UpperKey).str(); 63086204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6309e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))) { 6310577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6311577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6312577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSEnumerator *"); 6313577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6314577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6315577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6316577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName)); 6317577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), UnorderedGetterPriority, 6318577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6319577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6320577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6321577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6322577cdfdb20840350e841a483df630237326126d5Douglas Gregor // - (type *)memberOfKey:(type *)object 6323577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && 6324577cdfdb20840350e841a483df630237326126d5Douglas Gregor (ReturnType.isNull() || ReturnType->isObjCObjectPointerType())) { 63255f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::string SelectorName = (Twine("memberOf") + UpperKey).str(); 63266204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6327e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6328577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6329577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6330577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddPlaceholderChunk("object-type"); 6331577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk(" *"); 6332577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6333577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6334577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6335577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6336577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6337577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6338577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddPlaceholderChunk("object-type"); 6339577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk(" *"); 6340577cdfdb20840350e841a483df630237326126d5Douglas Gregor } else { 6341577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk(GetCompletionTypeString(ReturnType, Context, 63428987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor Policy, 6343577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.getAllocator())); 6344577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6345577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6346577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("object"); 6347577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), UnorderedGetterPriority, 6348577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6349577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6350577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6351577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6352577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Mutable unordered accessors 6353577cdfdb20840350e841a483df630237326126d5Douglas Gregor // - (void)addKeyObject:(type *)object 6354577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid) { 63556204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor std::string SelectorName 63565f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner = (Twine("add") + UpperKey + Twine("Object")).str(); 63576204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6358e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6359577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6360577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6361577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6362577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6363577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6364577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6365577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6366577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6367577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddPlaceholderChunk("object-type"); 6368577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk(" *"); 6369577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6370577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("object"); 6371577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority, 6372577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6373577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6374577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6375577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6376577cdfdb20840350e841a483df630237326126d5Douglas Gregor // - (void)addKey:(NSSet *)objects 6377577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid) { 63785f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::string SelectorName = (Twine("add") + UpperKey).str(); 63796204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6380e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6381577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6382577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6383577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6384577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6385577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6386577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6387577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6388577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6389577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSSet *"); 6390577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6391577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("objects"); 6392577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority, 6393577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6394577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6395577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6396577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6397577cdfdb20840350e841a483df630237326126d5Douglas Gregor // - (void)removeKeyObject:(type *)object 6398577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid) { 63996204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor std::string SelectorName 64005f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner = (Twine("remove") + UpperKey + Twine("Object")).str(); 64016204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6402e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6403577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6404577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6405577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6406577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6407577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6408577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6409577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6410577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6411577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddPlaceholderChunk("object-type"); 6412577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk(" *"); 6413577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6414577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("object"); 6415577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority, 6416577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6417577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6418577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6419577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6420577cdfdb20840350e841a483df630237326126d5Douglas Gregor // - (void)removeKey:(NSSet *)objects 6421577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid) { 64225f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::string SelectorName = (Twine("remove") + UpperKey).str(); 64236204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6424e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6425577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6426577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6427577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6428577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6429577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6430577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6431577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6432577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6433577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSSet *"); 6434577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6435577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("objects"); 6436577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority, 6437577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6438577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6439577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6440577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6441577cdfdb20840350e841a483df630237326126d5Douglas Gregor // - (void)intersectKey:(NSSet *)objects 6442577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IsInstanceMethod && ReturnTypeMatchesVoid) { 64435f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::string SelectorName = (Twine("intersect") + UpperKey).str(); 64446204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6445e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6446577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6447577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6448577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("void"); 6449577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6450577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6451577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6452577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6453577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6454577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSSet *"); 6455577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6456577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("objects"); 6457577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority, 6458577cdfdb20840350e841a483df630237326126d5Douglas Gregor CXCursor_ObjCInstanceMethodDecl)); 6459577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6460577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6461577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6462577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Key-Value Observing 6463577cdfdb20840350e841a483df630237326126d5Douglas Gregor // + (NSSet *)keyPathsForValuesAffectingKey 6464577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (!IsInstanceMethod && 6465577cdfdb20840350e841a483df630237326126d5Douglas Gregor (ReturnType.isNull() || 6466577cdfdb20840350e841a483df630237326126d5Douglas Gregor (ReturnType->isObjCObjectPointerType() && 6467577cdfdb20840350e841a483df630237326126d5Douglas Gregor ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() && 6468577cdfdb20840350e841a483df630237326126d5Douglas Gregor ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() 6469577cdfdb20840350e841a483df630237326126d5Douglas Gregor ->getName() == "NSSet"))) { 64706204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor std::string SelectorName 64715f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner = (Twine("keyPathsForValuesAffecting") + UpperKey).str(); 64726204159b21d88b356015ba3f3e42d40f1887acd6Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6473e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))) { 6474577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) { 6475577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6476577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTextChunk("NSSet *"); 6477577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6478577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6479577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6480577cdfdb20840350e841a483df630237326126d5Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName)); 6481577cdfdb20840350e841a483df630237326126d5Douglas Gregor Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern, 64823f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor CXCursor_ObjCClassMethodDecl)); 64833f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor } 64843f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor } 64853f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor 64863f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor // + (BOOL)automaticallyNotifiesObserversForKey 64873f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor if (!IsInstanceMethod && 64883f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor (ReturnType.isNull() || 64893f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor ReturnType->isIntegerType() || 64903f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor ReturnType->isBooleanType())) { 64913f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor std::string SelectorName 64925f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner = (Twine("automaticallyNotifiesObserversOf") + UpperKey).str(); 64933f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 64943f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))) { 64953f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor if (ReturnType.isNull()) { 64963f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 64973f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor Builder.AddTextChunk("BOOL"); 64983f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 64993f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor } 65003f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor 65013f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName)); 65023f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern, 65033f828d1710df819c1dd84c4782166b10f8d18b56Douglas Gregor CXCursor_ObjCClassMethodDecl)); 6504577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6505577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6506577cdfdb20840350e841a483df630237326126d5Douglas Gregor} 6507577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6508e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregorvoid Sema::CodeCompleteObjCMethodDecl(Scope *S, 6509e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor bool IsInstanceMethod, 6510a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian ParsedType ReturnTy) { 6511e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Determine the return type of the method we're declaring, if 6512e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // provided. 6513e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor QualType ReturnType = GetTypeFromParser(ReturnTy); 6514a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian Decl *IDecl = 0; 6515a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian if (CurContext->isObjCContainer()) { 6516a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian ObjCContainerDecl *OCD = dyn_cast<ObjCContainerDecl>(CurContext); 6517a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian IDecl = cast<Decl>(OCD); 6518a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian } 6519ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor // Determine where we should start searching for methods. 6520ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor ObjCContainerDecl *SearchDecl = 0; 6521e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor bool IsInImplementation = false; 6522d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall if (Decl *D = IDecl) { 6523e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (ObjCImplementationDecl *Impl = dyn_cast<ObjCImplementationDecl>(D)) { 6524e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor SearchDecl = Impl->getClassInterface(); 6525e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor IsInImplementation = true; 6526e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } else if (ObjCCategoryImplDecl *CatImpl 6527ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor = dyn_cast<ObjCCategoryImplDecl>(D)) { 6528e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor SearchDecl = CatImpl->getCategoryDecl(); 6529e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor IsInImplementation = true; 6530ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor } else 6531e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor SearchDecl = dyn_cast<ObjCContainerDecl>(D); 6532e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 6533e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6534e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (!SearchDecl && S) { 6535ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor if (DeclContext *DC = static_cast<DeclContext *>(S->getEntity())) 6536e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor SearchDecl = dyn_cast<ObjCContainerDecl>(DC); 6537e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 6538e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6539ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor if (!SearchDecl) { 6540e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 6541e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 6542e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor 0, 0); 6543e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor return; 6544e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 6545e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6546e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Find all of the methods that we could declare/implement here. 6547e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor KnownMethodsMap KnownMethods; 6548e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor FindImplementableMethods(Context, SearchDecl, IsInstanceMethod, 6549ea76618ced548ea1550a7a4de21cb8b6eea878bcDouglas Gregor ReturnType, KnownMethods); 6550e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6551e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Add declarations or definitions for each of the known methods. 65520a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 6553218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 6554218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 6555e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Results.EnterNewScope(); 65568987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor PrintingPolicy Policy = getCompletionPrintingPolicy(*this); 6557e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor for (KnownMethodsMap::iterator M = KnownMethods.begin(), 6558e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor MEnd = KnownMethods.end(); 6559e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor M != MEnd; ++M) { 6560408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor ObjCMethodDecl *Method = M->second.first; 6561218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder Builder(Results.getAllocator()); 6562e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6563e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // If the result type was not already provided, add it to the 6564e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // pattern as (type). 6565577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ReturnType.isNull()) 65668987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor AddObjCPassingTypeChunk(Method->getResultType(), Context, Policy, 65678987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor Builder); 6568e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6569e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Selector Sel = Method->getSelector(); 6570e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6571e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Add the first part of the selector to the pattern. 6572dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddTypedTextChunk(Builder.getAllocator().CopyString( 6573813d8346529bf094eb2b249648906ba7fd226688Douglas Gregor Sel.getNameForSlot(0))); 6574e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6575e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Add parameters to the pattern. 6576e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor unsigned I = 0; 6577e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor for (ObjCMethodDecl::param_iterator P = Method->param_begin(), 6578e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor PEnd = Method->param_end(); 6579e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor P != PEnd; (void)++P, ++I) { 6580e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Add the part of the selector name. 6581e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (I == 0) 6582218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk(":"); 6583e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor else if (I < Sel.getNumArgs()) { 6584218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6585218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk( 6586813d8346529bf094eb2b249648906ba7fd226688Douglas Gregor Builder.getAllocator().CopyString(Sel.getNameForSlot(I) + ":")); 6587e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } else 6588e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor break; 6589e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6590e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Add the parameter type. 65918987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor AddObjCPassingTypeChunk((*P)->getOriginalType(), Context, Policy, 65928987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor Builder); 6593e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6594e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (IdentifierInfo *Id = (*P)->getIdentifier()) 6595dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddTextChunk(Builder.getAllocator().CopyString( Id->getName())); 6596e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 6597e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6598e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (Method->isVariadic()) { 6599e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (Method->param_size() > 0) 6600218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_Comma); 6601218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("..."); 6602e17794ffbb8d509d705207ce7140e290665ca33dDouglas Gregor } 6603e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6604447107dfff705ab79d1dbf33ce79b524d63572fdDouglas Gregor if (IsInImplementation && Results.includeCodePatterns()) { 6605e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // We will be defining the method here, so add a compound statement. 6606218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6607218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 6608218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 6609e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (!Method->getResultType()->isVoidType()) { 6610e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // If the result type is not void, add a return clause. 6611218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("return"); 6612218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6613218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("expression"); 6614218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_SemiColon); 6615e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } else 6616218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("statements"); 6617e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6618218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 6619218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightBrace); 6620e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 6621e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6622408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor unsigned Priority = CCP_CodePattern; 6623408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor if (!M->second.second) 6624408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor Priority += CCD_InBaseClass; 6625408be5a4c0ed09a6c0375468d7fff7c93725f2d3Douglas Gregor 6626218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Result(Builder.TakeString(), Priority, 662716ed9ada523a990ca4bb5015c7bf8d0ead60c7d9Douglas Gregor Method->isInstanceMethod() 662816ed9ada523a990ca4bb5015c7bf8d0ead60c7d9Douglas Gregor ? CXCursor_ObjCInstanceMethodDecl 662916ed9ada523a990ca4bb5015c7bf8d0ead60c7d9Douglas Gregor : CXCursor_ObjCClassMethodDecl)); 6630e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 6631e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6632577cdfdb20840350e841a483df630237326126d5Douglas Gregor // Add Key-Value-Coding and Key-Value-Observing accessor methods for all of 6633577cdfdb20840350e841a483df630237326126d5Douglas Gregor // the properties in this class and its categories. 6634577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (Context.getLangOptions().ObjC2) { 66355f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<ObjCContainerDecl *, 4> Containers; 6636577cdfdb20840350e841a483df630237326126d5Douglas Gregor Containers.push_back(SearchDecl); 6637577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6638e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor VisitedSelectorSet KnownSelectors; 6639e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor for (KnownMethodsMap::iterator M = KnownMethods.begin(), 6640e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor MEnd = KnownMethods.end(); 6641e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor M != MEnd; ++M) 6642e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor KnownSelectors.insert(M->first); 6643e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor 6644e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor 6645577cdfdb20840350e841a483df630237326126d5Douglas Gregor ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(SearchDecl); 6646577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (!IFace) 6647577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(SearchDecl)) 6648577cdfdb20840350e841a483df630237326126d5Douglas Gregor IFace = Category->getClassInterface(); 6649577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6650577cdfdb20840350e841a483df630237326126d5Douglas Gregor if (IFace) { 6651577cdfdb20840350e841a483df630237326126d5Douglas Gregor for (ObjCCategoryDecl *Category = IFace->getCategoryList(); Category; 6652577cdfdb20840350e841a483df630237326126d5Douglas Gregor Category = Category->getNextClassCategory()) 6653577cdfdb20840350e841a483df630237326126d5Douglas Gregor Containers.push_back(Category); 6654577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6655577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6656577cdfdb20840350e841a483df630237326126d5Douglas Gregor for (unsigned I = 0, N = Containers.size(); I != N; ++I) { 6657577cdfdb20840350e841a483df630237326126d5Douglas Gregor for (ObjCContainerDecl::prop_iterator P = Containers[I]->prop_begin(), 6658577cdfdb20840350e841a483df630237326126d5Douglas Gregor PEnd = Containers[I]->prop_end(); 6659577cdfdb20840350e841a483df630237326126d5Douglas Gregor P != PEnd; ++P) { 6660577cdfdb20840350e841a483df630237326126d5Douglas Gregor AddObjCKeyValueCompletions(*P, IsInstanceMethod, ReturnType, Context, 6661e74c25c5c0375004bd84945bda53c3a96f443da8Douglas Gregor KnownSelectors, Results); 6662577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6663577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6664577cdfdb20840350e841a483df630237326126d5Douglas Gregor } 6665577cdfdb20840350e841a483df630237326126d5Douglas Gregor 6666e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Results.ExitScope(); 6667e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 6668e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 6669e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 6670e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 6671e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor} 66721f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 66731f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregorvoid Sema::CodeCompleteObjCMethodDeclSelector(Scope *S, 66741f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor bool IsInstanceMethod, 667540ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor bool AtParameterName, 6676b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall ParsedType ReturnTy, 66771f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor IdentifierInfo **SelIdents, 66781f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor unsigned NumSelIdents) { 66791f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor // If we have an external source, load the entire class method 66803c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl // pool from the AST file. 66811f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor if (ExternalSource) { 66821f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors(); 66831f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor I != N; ++I) { 66841f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor Selector Sel = ExternalSource->GetExternalSelector(I); 6685db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl if (Sel.isNull() || MethodPool.count(Sel)) 66861f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor continue; 6687db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl 6688db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl ReadMethodPool(Sel); 66891f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor } 66901f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor } 66911f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 66921f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor // Build the set of methods we can see. 66930a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 6694218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 6695218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionContext::CCC_Other); 66961f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 66971f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor if (ReturnTy) 66981f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor Results.setPreferredType(GetTypeFromParser(ReturnTy).getNonReferenceType()); 6699db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl 67001f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor Results.EnterNewScope(); 6701db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl for (GlobalMethodPool::iterator M = MethodPool.begin(), 6702db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl MEnd = MethodPool.end(); 6703db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl M != MEnd; ++M) { 6704db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl for (ObjCMethodList *MethList = IsInstanceMethod ? &M->second.first : 6705db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl &M->second.second; 6706db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl MethList && MethList->Method; 67071f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor MethList = MethList->Next) { 67081f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor if (!isAcceptableObjCMethod(MethList->Method, MK_Any, SelIdents, 67091f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor NumSelIdents)) 67101f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor continue; 67111f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 671240ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor if (AtParameterName) { 671340ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor // Suggest parameter names we've seen before. 671440ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor if (NumSelIdents && NumSelIdents <= MethList->Method->param_size()) { 671540ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor ParmVarDecl *Param = MethList->Method->param_begin()[NumSelIdents-1]; 671640ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor if (Param->getIdentifier()) { 6717218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder Builder(Results.getAllocator()); 6718dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddTypedTextChunk(Builder.getAllocator().CopyString( 6719218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Param->getIdentifier()->getName())); 6720218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 672140ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor } 672240ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor } 672340ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor 672440ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor continue; 672540ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor } 672640ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor 67271f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor Result R(MethList->Method, 0); 67281f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor R.StartParameter = NumSelIdents; 67291f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor R.AllParametersAreInformative = false; 67301f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor R.DeclaringEntity = true; 67311f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor Results.MaybeAddResult(R, CurContext); 67321f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor } 67331f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor } 67341f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 67351f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor Results.ExitScope(); 6736e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 6737e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 6738e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 67391f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor} 674087c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor 6741f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregorvoid Sema::CodeCompletePreprocessorDirective(bool InConditional) { 6742218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 674352779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor CodeCompletionContext::CCC_PreprocessorDirective); 6744f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor Results.EnterNewScope(); 6745f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 6746f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #if <condition> 6747218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder Builder(Results.getAllocator()); 6748218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("if"); 6749218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6750218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("condition"); 6751218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 6752f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 6753f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #ifdef <macro> 6754218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("ifdef"); 6755218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6756218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("macro"); 6757218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 6758218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor 6759f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #ifndef <macro> 6760218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("ifndef"); 6761218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6762218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("macro"); 6763218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 6764f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 6765f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor if (InConditional) { 6766f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #elif <condition> 6767218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("elif"); 6768218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6769218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("condition"); 6770218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 6771f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 6772f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #else 6773218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("else"); 6774218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 6775f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 6776f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #endif 6777218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("endif"); 6778218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 6779f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor } 6780f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 6781f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #include "header" 6782218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("include"); 6783218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6784218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("\""); 6785218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("header"); 6786218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("\""); 6787218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 6788f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 6789f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #include <header> 6790218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("include"); 6791218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6792218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("<"); 6793218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("header"); 6794218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk(">"); 6795218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 6796f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 6797f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #define <macro> 6798218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("define"); 6799218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6800218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("macro"); 6801218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 6802f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 6803f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #define <macro>(<args>) 6804218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("define"); 6805218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6806218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("macro"); 6807218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6808218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("args"); 6809218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6810218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 6811f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 6812f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #undef <macro> 6813218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("undef"); 6814218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6815218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("macro"); 6816218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 6817f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 6818f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #line <number> 6819218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("line"); 6820218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6821218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("number"); 6822218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 6823f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 6824f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #line <number> "filename" 6825218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("line"); 6826218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6827218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("number"); 6828218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6829218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("\""); 6830218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("filename"); 6831218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("\""); 6832218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 6833f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 6834f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #error <message> 6835218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("error"); 6836218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6837218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("message"); 6838218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 6839f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 6840f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #pragma <arguments> 6841218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("pragma"); 6842218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6843218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("arguments"); 6844218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 6845f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 6846f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor if (getLangOptions().ObjC1) { 6847f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #import "header" 6848218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("import"); 6849218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6850218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("\""); 6851218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("header"); 6852218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("\""); 6853218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 6854f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 6855f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #import <header> 6856218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("import"); 6857218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6858218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("<"); 6859218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("header"); 6860218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk(">"); 6861218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 6862f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor } 6863f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 6864f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #include_next "header" 6865218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("include_next"); 6866218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6867218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("\""); 6868218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("header"); 6869218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("\""); 6870218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 6871f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 6872f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #include_next <header> 6873218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("include_next"); 6874218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6875218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk("<"); 6876218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("header"); 6877218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTextChunk(">"); 6878218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 6879f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 6880f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // #warning <message> 6881218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("warning"); 6882218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6883218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("message"); 6884218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 6885f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 6886f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // Note: #ident and #sccs are such crazy anachronisms that we don't provide 6887f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // completions for them. And __include_macros is a Clang-internal extension 6888f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // that we don't want to encourage anyone to use. 6889f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 6890f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor // FIXME: we don't support #assert or #unassert, so don't suggest them. 6891f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor Results.ExitScope(); 6892f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 6893f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 6894721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor CodeCompletionContext::CCC_PreprocessorDirective, 6895f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor Results.data(), Results.size()); 6896f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor} 6897f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 6898f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregorvoid Sema::CodeCompleteInPreprocessorConditionalExclusion(Scope *S) { 6899f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor CodeCompleteOrdinaryName(S, 6900f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall S->getFnParent()? Sema::PCC_RecoveryInFunction 6901f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall : Sema::PCC_Namespace); 6902f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor} 6903f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 6904f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregorvoid Sema::CodeCompletePreprocessorMacroName(bool IsDefinition) { 6905218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 690652779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor IsDefinition? CodeCompletionContext::CCC_MacroName 690752779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor : CodeCompletionContext::CCC_MacroNameUse); 69081fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor if (!IsDefinition && (!CodeCompleter || CodeCompleter->includeMacros())) { 69091fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor // Add just the names of macros, not their arguments. 6910218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder Builder(Results.getAllocator()); 69111fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor Results.EnterNewScope(); 69121fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor for (Preprocessor::macro_iterator M = PP.macro_begin(), 69131fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor MEnd = PP.macro_end(); 69141fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor M != MEnd; ++M) { 6915dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor Builder.AddTypedTextChunk(Builder.getAllocator().CopyString( 6916218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor M->first->getName())); 6917218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 69181fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor } 69191fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor Results.ExitScope(); 69201fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor } else if (IsDefinition) { 69211fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor // FIXME: Can we detect when the user just wrote an include guard above? 69221fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor } 69231fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor 692452779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 69251fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor Results.data(), Results.size()); 69261fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor} 69271fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor 6928f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregorvoid Sema::CodeCompletePreprocessorExpression() { 6929218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Results(*this, CodeCompleter->getAllocator(), 693052779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor CodeCompletionContext::CCC_PreprocessorExpression); 6931f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor 6932f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor if (!CodeCompleter || CodeCompleter->includeMacros()) 6933f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor AddMacroResults(PP, Results); 6934f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor 6935f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor // defined (<macro>) 6936f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor Results.EnterNewScope(); 6937218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor CodeCompletionBuilder Builder(Results.getAllocator()); 6938218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddTypedTextChunk("defined"); 6939218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6940218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6941218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddPlaceholderChunk("macro"); 6942218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Builder.AddChunk(CodeCompletionString::CK_RightParen); 6943218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor Results.AddResult(Builder.TakeString()); 6944f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor Results.ExitScope(); 6945f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor 6946f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 6947f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor CodeCompletionContext::CCC_PreprocessorExpression, 6948f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor Results.data(), Results.size()); 6949f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor} 6950f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor 6951f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregorvoid Sema::CodeCompletePreprocessorMacroArgument(Scope *S, 6952f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor IdentifierInfo *Macro, 6953f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor MacroInfo *MacroInfo, 6954f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor unsigned Argument) { 6955f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor // FIXME: In the future, we could provide "overload" results, much like we 6956f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor // do for function calls. 6957f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor 69585c5f03e4020e90b9760ec547962ba02b029cc359Argyrios Kyrtzidis // Now just ignore this. There will be another code-completion callback 69595c5f03e4020e90b9760ec547962ba02b029cc359Argyrios Kyrtzidis // for the expanded tokens. 6960f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor} 6961f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor 696255817afdf9d453a443262a733f6caf6692dca118Douglas Gregorvoid Sema::CodeCompleteNaturalLanguage() { 696355817afdf9d453a443262a733f6caf6692dca118Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 6964af1c6b532e6e1e944db987f29062e5efce71a573Douglas Gregor CodeCompletionContext::CCC_NaturalLanguage, 696555817afdf9d453a443262a733f6caf6692dca118Douglas Gregor 0, 0); 696655817afdf9d453a443262a733f6caf6692dca118Douglas Gregor} 696755817afdf9d453a443262a733f6caf6692dca118Douglas Gregor 6968dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregorvoid Sema::GatherGlobalCodeCompletions(CodeCompletionAllocator &Allocator, 69695f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVectorImpl<CodeCompletionResult> &Results) { 6970218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor ResultBuilder Builder(*this, Allocator, CodeCompletionContext::CCC_Recovery); 69718071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor if (!CodeCompleter || CodeCompleter->includeGlobals()) { 69728071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompletionDeclConsumer Consumer(Builder, 69738071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor Context.getTranslationUnitDecl()); 69748071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(Context.getTranslationUnitDecl(), LookupAnyName, 69758071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor Consumer); 69768071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor } 697787c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor 697887c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor if (!CodeCompleter || CodeCompleter->includeMacros()) 697987c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor AddMacroResults(PP, Builder); 698087c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor 698187c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor Results.clear(); 698287c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor Results.insert(Results.end(), 698387c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor Builder.data(), Builder.data() + Builder.size()); 698487c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor} 6985