SemaCodeComplete.cpp revision 0cc8404f8cf320da140e560899e1560bce80fe8c
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//===----------------------------------------------------------------------===// 1381b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor#include "Sema.h" 141ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor#include "Lookup.h" 1581b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor#include "clang/Sema/CodeCompleteConsumer.h" 16b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor#include "clang/AST/ExprCXX.h" 1724a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor#include "clang/AST/ExprObjC.h" 183f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor#include "clang/Lex/MacroInfo.h" 193f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor#include "clang/Lex/Preprocessor.h" 2086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor#include "llvm/ADT/SmallPtrSet.h" 216a6840326e9b4ac8e81a5a212165f33743847ab8Douglas Gregor#include "llvm/ADT/StringExtras.h" 2286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor#include <list> 2386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor#include <map> 2486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor#include <vector> 2581b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor 2681b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregorusing namespace clang; 2781b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor 2886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregornamespace { 2986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \brief A container of code-completion results. 3086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor class ResultBuilder { 3186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor public: 3286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \brief The type of a name-lookup filter, which can be provided to the 3386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// name-lookup routines to specify which declarations should be included in 3486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// the result set (when it returns true) and which declarations should be 3586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// filtered out (returns false). 3686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor typedef bool (ResultBuilder::*LookupFilter)(NamedDecl *) const; 3786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 3886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor typedef CodeCompleteConsumer::Result Result; 3986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 4086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor private: 4186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \brief The actual results we have found. 4286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor std::vector<Result> Results; 4386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 4486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \brief A record of all of the declarations we have found and placed 4586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// into the result set, used to ensure that no declaration ever gets into 4686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// the result set twice. 4786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor llvm::SmallPtrSet<Decl*, 16> AllDeclsFound; 4886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 49fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor typedef std::pair<NamedDecl *, unsigned> DeclIndexPair; 50fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 51fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor /// \brief An entry in the shadow map, which is optimized to store 52fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor /// a single (declaration, index) mapping (the common case) but 53fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor /// can also store a list of (declaration, index) mappings. 54fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor class ShadowMapEntry { 55fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor typedef llvm::SmallVector<DeclIndexPair, 4> DeclIndexPairVector; 56fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 57fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor /// \brief Contains either the solitary NamedDecl * or a vector 58fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor /// of (declaration, index) pairs. 59fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor llvm::PointerUnion<NamedDecl *, DeclIndexPairVector*> DeclOrVector; 60fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 61fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor /// \brief When the entry contains a single declaration, this is 62fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor /// the index associated with that entry. 63fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor unsigned SingleDeclIndex; 64fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 65fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor public: 66fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ShadowMapEntry() : DeclOrVector(), SingleDeclIndex(0) { } 67fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 68fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor void Add(NamedDecl *ND, unsigned Index) { 69fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (DeclOrVector.isNull()) { 70fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor // 0 - > 1 elements: just set the single element information. 71fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor DeclOrVector = ND; 72fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor SingleDeclIndex = Index; 73fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return; 74fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 75fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 76fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (NamedDecl *PrevND = DeclOrVector.dyn_cast<NamedDecl *>()) { 77fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor // 1 -> 2 elements: create the vector of results and push in the 78fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor // existing declaration. 79fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor DeclIndexPairVector *Vec = new DeclIndexPairVector; 80fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor Vec->push_back(DeclIndexPair(PrevND, SingleDeclIndex)); 81fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor DeclOrVector = Vec; 82fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 83fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 84fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor // Add the new element to the end of the vector. 85fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor DeclOrVector.get<DeclIndexPairVector*>()->push_back( 86fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor DeclIndexPair(ND, Index)); 87fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 88fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 89fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor void Destroy() { 90fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (DeclIndexPairVector *Vec 91fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor = DeclOrVector.dyn_cast<DeclIndexPairVector *>()) { 92fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor delete Vec; 93fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor DeclOrVector = ((NamedDecl *)0); 94fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 95fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 96fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 97fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor // Iteration. 98fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor class iterator; 99fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor iterator begin() const; 100fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor iterator end() const; 101fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor }; 102fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 10386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \brief A mapping from declaration names to the declarations that have 10486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// this name within a particular scope and their index within the list of 10586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// results. 106fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor typedef llvm::DenseMap<DeclarationName, ShadowMapEntry> ShadowMap; 10786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 10886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \brief The semantic analysis object for which results are being 10986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// produced. 11086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Sema &SemaRef; 11186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 11286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \brief If non-NULL, a filter function used to remove any code-completion 11386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// results that are not desirable. 11486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor LookupFilter Filter; 11545bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor 11645bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor /// \brief Whether we should allow declarations as 11745bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor /// nested-name-specifiers that would otherwise be filtered out. 11845bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor bool AllowNestedNameSpecifiers; 11945bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor 12086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \brief A list of shadow maps, which is used to model name hiding at 12186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// different levels of, e.g., the inheritance hierarchy. 12286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor std::list<ShadowMap> ShadowMaps; 12386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 12486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor public: 12586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor explicit ResultBuilder(Sema &SemaRef, LookupFilter Filter = 0) 12645bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor : SemaRef(SemaRef), Filter(Filter), AllowNestedNameSpecifiers(false) { } 12786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 12886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \brief Set the filter used for code-completion results. 12986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor void setFilter(LookupFilter Filter) { 13086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor this->Filter = Filter; 13186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 13286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 13386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor typedef std::vector<Result>::iterator iterator; 13486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor iterator begin() { return Results.begin(); } 13586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor iterator end() { return Results.end(); } 13686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 13786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Result *data() { return Results.empty()? 0 : &Results.front(); } 13886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor unsigned size() const { return Results.size(); } 13986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool empty() const { return Results.empty(); } 14086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 14145bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor /// \brief Specify whether nested-name-specifiers are allowed. 14245bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor void allowNestedNameSpecifiers(bool Allow = true) { 14345bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor AllowNestedNameSpecifiers = Allow; 14445bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor } 14545bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor 146e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor /// \brief Determine whether the given declaration is at all interesting 147e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor /// as a code-completion result. 14845bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor /// 14945bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor /// \param ND the declaration that we are inspecting. 15045bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor /// 15145bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor /// \param AsNestedNameSpecifier will be set true if this declaration is 15245bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor /// only interesting when it is a nested-name-specifier. 15345bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor bool isInterestingDecl(NamedDecl *ND, bool &AsNestedNameSpecifier) const; 1546660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor 1556660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor /// \brief Check whether the result is hidden by the Hiding declaration. 1566660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor /// 1576660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor /// \returns true if the result is hidden and cannot be found, false if 1586660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor /// the hidden result could still be found. When false, \p R may be 1596660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor /// modified to describe how the result can be found (e.g., via extra 1606660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor /// qualification). 1616660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor bool CheckHiddenResult(Result &R, DeclContext *CurContext, 1626660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor NamedDecl *Hiding); 1636660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor 16486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \brief Add a new result to this result set (if it isn't already in one 16586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// of the shadow maps), or replace an existing result (for, e.g., a 16686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// redeclaration). 167456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor /// 1681ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// \param CurContext the result to add (if it is unique). 169456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor /// 170456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor /// \param R the context in which this result will be named. 171456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor void MaybeAddResult(Result R, DeclContext *CurContext = 0); 17286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 1731ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// \brief Add a new result to this result set, where we already know 1741ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// the hiding declation (if any). 1751ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// 1761ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// \param R the result to add (if it is unique). 1771ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// 1781ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// \param CurContext the context in which this result will be named. 1791ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// 1801ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// \param Hiding the declaration that hides the result. 1810cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor /// 1820cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor /// \param InBaseClass whether the result was found in a base 1830cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor /// class of the searched context. 1840cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor void AddResult(Result R, DeclContext *CurContext, NamedDecl *Hiding, 1850cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor bool InBaseClass); 1861ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 18786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \brief Enter into a new scope. 18886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor void EnterNewScope(); 18986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 19086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \brief Exit from the current scope. 19186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor void ExitScope(); 19286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 19355385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor /// \brief Ignore this declaration, if it is seen again. 19455385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor void Ignore(Decl *D) { AllDeclsFound.insert(D->getCanonicalDecl()); } 19555385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor 19686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \name Name lookup predicates 19786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// 19886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// These predicates can be passed to the name lookup functions to filter the 19986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// results of name lookup. All of the predicates have the same type, so that 20086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// 20186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor //@{ 202791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor bool IsOrdinaryName(NamedDecl *ND) const; 20301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor bool IsOrdinaryNonValueName(NamedDecl *ND) const; 20486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool IsNestedNameSpecifier(NamedDecl *ND) const; 20586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool IsEnum(NamedDecl *ND) const; 20686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool IsClassOrStruct(NamedDecl *ND) const; 20786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool IsUnion(NamedDecl *ND) const; 20886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool IsNamespace(NamedDecl *ND) const; 20986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool IsNamespaceOrAlias(NamedDecl *ND) const; 21086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool IsType(NamedDecl *ND) const; 211eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor bool IsMember(NamedDecl *ND) const; 21286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor //@} 21386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor }; 21486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 21586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 216fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregorclass ResultBuilder::ShadowMapEntry::iterator { 217fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor llvm::PointerUnion<NamedDecl*, const DeclIndexPair*> DeclOrIterator; 218fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor unsigned SingleDeclIndex; 219fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 220fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregorpublic: 221fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor typedef DeclIndexPair value_type; 222fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor typedef value_type reference; 223fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor typedef std::ptrdiff_t difference_type; 224fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor typedef std::input_iterator_tag iterator_category; 225fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 226fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor class pointer { 227fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor DeclIndexPair Value; 228fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 229fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor public: 230fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor pointer(const DeclIndexPair &Value) : Value(Value) { } 231fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 232fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor const DeclIndexPair *operator->() const { 233fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return &Value; 234fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 235fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor }; 236fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 237fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor iterator() : DeclOrIterator((NamedDecl *)0), SingleDeclIndex(0) { } 238fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 239fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor iterator(NamedDecl *SingleDecl, unsigned Index) 240fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor : DeclOrIterator(SingleDecl), SingleDeclIndex(Index) { } 241fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 242fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor iterator(const DeclIndexPair *Iterator) 243fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor : DeclOrIterator(Iterator), SingleDeclIndex(0) { } 244fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 245fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor iterator &operator++() { 246fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (DeclOrIterator.is<NamedDecl *>()) { 247fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor DeclOrIterator = (NamedDecl *)0; 248fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor SingleDeclIndex = 0; 249fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return *this; 250fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 251fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 252fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor const DeclIndexPair *I = DeclOrIterator.get<const DeclIndexPair*>(); 253fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ++I; 254fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor DeclOrIterator = I; 255fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return *this; 256fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 257fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 258fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor iterator operator++(int) { 259fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor iterator tmp(*this); 260fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ++(*this); 261fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return tmp; 262fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 263fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 264fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor reference operator*() const { 265fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (NamedDecl *ND = DeclOrIterator.dyn_cast<NamedDecl *>()) 266fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return reference(ND, SingleDeclIndex); 267fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 268d490f953e812a9bb1729637cc70a6db7d997ced0Douglas Gregor return *DeclOrIterator.get<const DeclIndexPair*>(); 269fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 270fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 271fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor pointer operator->() const { 272fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return pointer(**this); 273fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 274fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 275fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor friend bool operator==(const iterator &X, const iterator &Y) { 276d490f953e812a9bb1729637cc70a6db7d997ced0Douglas Gregor return X.DeclOrIterator.getOpaqueValue() 277d490f953e812a9bb1729637cc70a6db7d997ced0Douglas Gregor == Y.DeclOrIterator.getOpaqueValue() && 278fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor X.SingleDeclIndex == Y.SingleDeclIndex; 279fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 280fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 281fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor friend bool operator!=(const iterator &X, const iterator &Y) { 282d490f953e812a9bb1729637cc70a6db7d997ced0Douglas Gregor return !(X == Y); 283fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 284fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor}; 285fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 286fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas GregorResultBuilder::ShadowMapEntry::iterator 287fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas GregorResultBuilder::ShadowMapEntry::begin() const { 288fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (DeclOrVector.isNull()) 289fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return iterator(); 290fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 291fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (NamedDecl *ND = DeclOrVector.dyn_cast<NamedDecl *>()) 292fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return iterator(ND, SingleDeclIndex); 293fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 294fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return iterator(DeclOrVector.get<DeclIndexPairVector *>()->begin()); 295fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor} 296fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 297fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas GregorResultBuilder::ShadowMapEntry::iterator 298fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas GregorResultBuilder::ShadowMapEntry::end() const { 299fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (DeclOrVector.is<NamedDecl *>() || DeclOrVector.isNull()) 300fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return iterator(); 301fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 302fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return iterator(DeclOrVector.get<DeclIndexPairVector *>()->end()); 303fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor} 304fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 305456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// \brief Compute the qualification required to get from the current context 306456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// (\p CurContext) to the target context (\p TargetContext). 307456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// 308456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// \param Context the AST context in which the qualification will be used. 309456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// 310456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// \param CurContext the context where an entity is being named, which is 311456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// typically based on the current scope. 312456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// 313456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// \param TargetContext the context in which the named entity actually 314456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// resides. 315456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// 316456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// \returns a nested name specifier that refers into the target context, or 317456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// NULL if no qualification is needed. 318456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregorstatic NestedNameSpecifier * 319456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas GregorgetRequiredQualification(ASTContext &Context, 320456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor DeclContext *CurContext, 321456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor DeclContext *TargetContext) { 322456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor llvm::SmallVector<DeclContext *, 4> TargetParents; 323456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor 324456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor for (DeclContext *CommonAncestor = TargetContext; 325456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor CommonAncestor && !CommonAncestor->Encloses(CurContext); 326456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor CommonAncestor = CommonAncestor->getLookupParent()) { 327456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor if (CommonAncestor->isTransparentContext() || 328456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor CommonAncestor->isFunctionOrMethod()) 329456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor continue; 330456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor 331456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor TargetParents.push_back(CommonAncestor); 332456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor } 333456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor 334456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor NestedNameSpecifier *Result = 0; 335456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor while (!TargetParents.empty()) { 336456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor DeclContext *Parent = TargetParents.back(); 337456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor TargetParents.pop_back(); 338456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor 339456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor if (NamespaceDecl *Namespace = dyn_cast<NamespaceDecl>(Parent)) 340456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor Result = NestedNameSpecifier::Create(Context, Result, Namespace); 341456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor else if (TagDecl *TD = dyn_cast<TagDecl>(Parent)) 342456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor Result = NestedNameSpecifier::Create(Context, Result, 343456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor false, 344456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor Context.getTypeDeclType(TD).getTypePtr()); 345456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor else 346456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor assert(Parent->isTranslationUnit()); 3470c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor } 348456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor return Result; 349456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor} 350456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor 35145bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregorbool ResultBuilder::isInterestingDecl(NamedDecl *ND, 35245bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor bool &AsNestedNameSpecifier) const { 35345bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor AsNestedNameSpecifier = false; 35445bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor 355e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor ND = ND->getUnderlyingDecl(); 356e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor unsigned IDNS = ND->getIdentifierNamespace(); 357f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor 358f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor // Skip unnamed entities. 359e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor if (!ND->getDeclName()) 360e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return false; 36186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 36286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Friend declarations and declarations introduced due to friends are never 36386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // added as results. 364e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor if (isa<FriendDecl>(ND) || 36586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor (IDNS & (Decl::IDNS_OrdinaryFriend | Decl::IDNS_TagFriend))) 366e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return false; 367e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 3687628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor // Class template (partial) specializations are never added as results. 369e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor if (isa<ClassTemplateSpecializationDecl>(ND) || 370e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor isa<ClassTemplatePartialSpecializationDecl>(ND)) 371e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return false; 37286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 3737628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor // Using declarations themselves are never added as results. 374e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor if (isa<UsingDecl>(ND)) 375e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return false; 376e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 377e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor // Some declarations have reserved names that we don't want to ever show. 378e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor if (const IdentifierInfo *Id = ND->getIdentifier()) { 37986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // __va_list_tag is a freak of nature. Find it and skip it. 38086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (Id->isStr("__va_list_tag") || Id->isStr("__builtin_va_list")) 381e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return false; 38286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 383f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor // Filter out names reserved for the implementation (C99 7.1.3, 384f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor // C++ [lib.global.names]). Users don't need to see those. 385e013d685c6689ac7ae103ee88acf573422d1ed6aDaniel Dunbar // 386e013d685c6689ac7ae103ee88acf573422d1ed6aDaniel Dunbar // FIXME: Add predicate for this. 387f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor if (Id->getLength() >= 2) { 388e013d685c6689ac7ae103ee88acf573422d1ed6aDaniel Dunbar const char *Name = Id->getNameStart(); 389f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor if (Name[0] == '_' && 390f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor (Name[1] == '_' || (Name[1] >= 'A' && Name[1] <= 'Z'))) 391e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return false; 392f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor } 39386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 394e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 39586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // C++ constructors are never found by name lookup. 396e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor if (isa<CXXConstructorDecl>(ND)) 397e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return false; 39886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 39986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Filter out any unwanted results. 40045bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor if (Filter && !(this->*Filter)(ND)) { 40145bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor // Check whether it is interesting as a nested-name-specifier. 40245bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor if (AllowNestedNameSpecifiers && SemaRef.getLangOptions().CPlusPlus && 40345bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor IsNestedNameSpecifier(ND) && 40445bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor (Filter != &ResultBuilder::IsMember || 40545bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor (isa<CXXRecordDecl>(ND) && 40645bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor cast<CXXRecordDecl>(ND)->isInjectedClassName()))) { 40745bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor AsNestedNameSpecifier = true; 40845bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor return true; 40945bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor } 41045bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor 411e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return false; 41245bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor } 413e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 414e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor // ... then it must be interesting! 415e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return true; 416e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor} 417e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 4186660d845af8edb99098a08cf2539233a3be650b3Douglas Gregorbool ResultBuilder::CheckHiddenResult(Result &R, DeclContext *CurContext, 4196660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor NamedDecl *Hiding) { 4206660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor // In C, there is no way to refer to a hidden name. 4216660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor // FIXME: This isn't true; we can find a tag name hidden by an ordinary 4226660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor // name if we introduce the tag type. 4236660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor if (!SemaRef.getLangOptions().CPlusPlus) 4246660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor return true; 4256660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor 4266660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor DeclContext *HiddenCtx = R.Declaration->getDeclContext()->getLookupContext(); 4276660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor 4286660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor // There is no way to qualify a name declared in a function or method. 4296660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor if (HiddenCtx->isFunctionOrMethod()) 4306660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor return true; 4316660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor 4326660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor if (HiddenCtx == Hiding->getDeclContext()->getLookupContext()) 4336660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor return true; 4346660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor 4356660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor // We can refer to the result with the appropriate qualification. Do it. 4366660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor R.Hidden = true; 4376660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor R.QualifierIsInformative = false; 4386660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor 4396660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor if (!R.Qualifier) 4406660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor R.Qualifier = getRequiredQualification(SemaRef.Context, 4416660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor CurContext, 4426660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor R.Declaration->getDeclContext()); 4436660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor return false; 4446660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor} 4456660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor 446e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregorvoid ResultBuilder::MaybeAddResult(Result R, DeclContext *CurContext) { 447e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor assert(!ShadowMaps.empty() && "Must enter into a results scope"); 448e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 449e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor if (R.Kind != Result::RK_Declaration) { 450e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor // For non-declaration results, just add the result. 451e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor Results.push_back(R); 452e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return; 453e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor } 454e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 455e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor // Look through using declarations. 456e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor if (UsingShadowDecl *Using = dyn_cast<UsingShadowDecl>(R.Declaration)) { 457e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor MaybeAddResult(Result(Using->getTargetDecl(), R.Qualifier), CurContext); 45886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return; 459e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor } 46086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 461e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor Decl *CanonDecl = R.Declaration->getCanonicalDecl(); 462e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor unsigned IDNS = CanonDecl->getIdentifierNamespace(); 463e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 46445bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor bool AsNestedNameSpecifier = false; 46545bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor if (!isInterestingDecl(R.Declaration, AsNestedNameSpecifier)) 466e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return; 467e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 46886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ShadowMap &SMap = ShadowMaps.back(); 469fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ShadowMapEntry::iterator I, IEnd; 470fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ShadowMap::iterator NamePos = SMap.find(R.Declaration->getDeclName()); 471fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (NamePos != SMap.end()) { 472fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor I = NamePos->second.begin(); 473fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor IEnd = NamePos->second.end(); 474fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 475fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 476fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor for (; I != IEnd; ++I) { 477fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor NamedDecl *ND = I->first; 478fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor unsigned Index = I->second; 47986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (ND->getCanonicalDecl() == CanonDecl) { 48086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // This is a redeclaration. Always pick the newer declaration. 48186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Results[Index].Declaration = R.Declaration; 48286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 48386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // We're done. 48486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return; 48586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 48686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 48786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 48886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // This is a new declaration in this scope. However, check whether this 48986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // declaration name is hidden by a similarly-named declaration in an outer 49086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // scope. 49186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor std::list<ShadowMap>::iterator SM, SMEnd = ShadowMaps.end(); 49286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor --SMEnd; 49386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor for (SM = ShadowMaps.begin(); SM != SMEnd; ++SM) { 494fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ShadowMapEntry::iterator I, IEnd; 495fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ShadowMap::iterator NamePos = SM->find(R.Declaration->getDeclName()); 496fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (NamePos != SM->end()) { 497fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor I = NamePos->second.begin(); 498fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor IEnd = NamePos->second.end(); 499fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 500fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor for (; I != IEnd; ++I) { 50186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // A tag declaration does not hide a non-tag declaration. 502fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (I->first->getIdentifierNamespace() == Decl::IDNS_Tag && 50386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor (IDNS & (Decl::IDNS_Member | Decl::IDNS_Ordinary | 50486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Decl::IDNS_ObjCProtocol))) 50586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor continue; 50686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 50786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Protocols are in distinct namespaces from everything else. 508fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (((I->first->getIdentifierNamespace() & Decl::IDNS_ObjCProtocol) 50986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor || (IDNS & Decl::IDNS_ObjCProtocol)) && 510fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor I->first->getIdentifierNamespace() != IDNS) 51186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor continue; 51286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 51386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // The newly-added result is hidden by an entry in the shadow map. 5146660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor if (CheckHiddenResult(R, CurContext, I->first)) 51586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return; 51686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 51786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor break; 51886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 51986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 52086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 52186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Make sure that any given declaration only shows up in the result set once. 52286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!AllDeclsFound.insert(CanonDecl)) 52386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return; 52486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 525eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor // If the filter is for nested-name-specifiers, then this result starts a 526eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor // nested-name-specifier. 52745bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor if (AsNestedNameSpecifier) 528eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor R.StartsNestedNameSpecifier = true; 529eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor 5300563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor // If this result is supposed to have an informative qualifier, add one. 531eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor if (R.QualifierIsInformative && !R.Qualifier && 532eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor !R.StartsNestedNameSpecifier) { 5330563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor DeclContext *Ctx = R.Declaration->getDeclContext(); 5340563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor if (NamespaceDecl *Namespace = dyn_cast<NamespaceDecl>(Ctx)) 5350563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor R.Qualifier = NestedNameSpecifier::Create(SemaRef.Context, 0, Namespace); 5360563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor else if (TagDecl *Tag = dyn_cast<TagDecl>(Ctx)) 5370563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor R.Qualifier = NestedNameSpecifier::Create(SemaRef.Context, 0, false, 5380563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor SemaRef.Context.getTypeDeclType(Tag).getTypePtr()); 5390563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor else 5400563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor R.QualifierIsInformative = false; 5410563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor } 542eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor 54386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Insert this result into the set of results and into the current shadow 54486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // map. 545fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor SMap[R.Declaration->getDeclName()].Add(R.Declaration, Results.size()); 54686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Results.push_back(R); 54786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 54886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 5491ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregorvoid ResultBuilder::AddResult(Result R, DeclContext *CurContext, 5500cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor NamedDecl *Hiding, bool InBaseClass = false) { 5511ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor assert(R.Kind == Result::RK_Declaration && 5521ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor "Only declaration results are supported"); 5531ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 5541ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor // Look through using declarations. 5551ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor if (UsingShadowDecl *Using = dyn_cast<UsingShadowDecl>(R.Declaration)) { 5561ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor AddResult(Result(Using->getTargetDecl(), R.Qualifier), CurContext, Hiding); 5571ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor return; 5581ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor } 5591ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 56045bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor bool AsNestedNameSpecifier = false; 56145bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor if (!isInterestingDecl(R.Declaration, AsNestedNameSpecifier)) 5621ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor return; 5631ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 5641ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor if (Hiding && CheckHiddenResult(R, CurContext, Hiding)) 5651ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor return; 5661ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 5671ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor // Make sure that any given declaration only shows up in the result set once. 5681ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor if (!AllDeclsFound.insert(R.Declaration->getCanonicalDecl())) 5691ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor return; 5701ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 5711ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor // If the filter is for nested-name-specifiers, then this result starts a 5721ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor // nested-name-specifier. 57345bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor if (AsNestedNameSpecifier) 5741ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor R.StartsNestedNameSpecifier = true; 5750cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor else if (Filter == &ResultBuilder::IsMember && !R.Qualifier && InBaseClass && 5760cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor isa<CXXRecordDecl>(R.Declaration->getDeclContext() 5770cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor ->getLookupContext())) 5780cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor R.QualifierIsInformative = true; 5790cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor 5801ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor // If this result is supposed to have an informative qualifier, add one. 5811ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor if (R.QualifierIsInformative && !R.Qualifier && 5821ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor !R.StartsNestedNameSpecifier) { 5831ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor DeclContext *Ctx = R.Declaration->getDeclContext(); 5841ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor if (NamespaceDecl *Namespace = dyn_cast<NamespaceDecl>(Ctx)) 5851ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor R.Qualifier = NestedNameSpecifier::Create(SemaRef.Context, 0, Namespace); 5861ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor else if (TagDecl *Tag = dyn_cast<TagDecl>(Ctx)) 5871ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor R.Qualifier = NestedNameSpecifier::Create(SemaRef.Context, 0, false, 58845bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor SemaRef.Context.getTypeDeclType(Tag).getTypePtr()); 5891ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor else 5901ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor R.QualifierIsInformative = false; 5911ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor } 5921ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 5931ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor // Insert this result into the set of results. 5941ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor Results.push_back(R); 5951ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor} 5961ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 59786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Enter into a new scope. 59886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorvoid ResultBuilder::EnterNewScope() { 59986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ShadowMaps.push_back(ShadowMap()); 60086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 60186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 60286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Exit from the current scope. 60386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorvoid ResultBuilder::ExitScope() { 604fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor for (ShadowMap::iterator E = ShadowMaps.back().begin(), 605fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor EEnd = ShadowMaps.back().end(); 606fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor E != EEnd; 607fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ++E) 608fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor E->second.Destroy(); 609fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 61086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ShadowMaps.pop_back(); 61186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 61286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 613791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor/// \brief Determines whether this given declaration will be found by 614791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor/// ordinary name lookup. 615791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregorbool ResultBuilder::IsOrdinaryName(NamedDecl *ND) const { 616791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor unsigned IDNS = Decl::IDNS_Ordinary; 617791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus) 618791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor IDNS |= Decl::IDNS_Tag; 6191ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor else if (SemaRef.getLangOptions().ObjC1 && isa<ObjCIvarDecl>(ND)) 6201ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor return true; 6211ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 622791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor return ND->getIdentifierNamespace() & IDNS; 623791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor} 624791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor 62501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor/// \brief Determines whether this given declaration will be found by 62601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor/// ordinary name lookup. 62701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregorbool ResultBuilder::IsOrdinaryNonValueName(NamedDecl *ND) const { 62801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor unsigned IDNS = Decl::IDNS_Ordinary; 62901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus) 63001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor IDNS |= Decl::IDNS_Tag; 63101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 63201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor return (ND->getIdentifierNamespace() & IDNS) && 63301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor !isa<ValueDecl>(ND) && !isa<FunctionTemplateDecl>(ND); 63401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor} 63501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 63686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Determines whether the given declaration is suitable as the 63786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// start of a C++ nested-name-specifier, e.g., a class or namespace. 63886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsNestedNameSpecifier(NamedDecl *ND) const { 63986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Allow us to find class templates, too. 64086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (ClassTemplateDecl *ClassTemplate = dyn_cast<ClassTemplateDecl>(ND)) 64186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ND = ClassTemplate->getTemplatedDecl(); 64286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 64386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return SemaRef.isAcceptableNestedNameSpecifier(ND); 64486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 64586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 64686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Determines whether the given declaration is an enumeration. 64786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsEnum(NamedDecl *ND) const { 64886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return isa<EnumDecl>(ND); 64986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 65086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 65186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Determines whether the given declaration is a class or struct. 65286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsClassOrStruct(NamedDecl *ND) const { 65386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Allow us to find class templates, too. 65486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (ClassTemplateDecl *ClassTemplate = dyn_cast<ClassTemplateDecl>(ND)) 65586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ND = ClassTemplate->getTemplatedDecl(); 65686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 65786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (RecordDecl *RD = dyn_cast<RecordDecl>(ND)) 65886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return RD->getTagKind() == TagDecl::TK_class || 65986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor RD->getTagKind() == TagDecl::TK_struct; 66086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 66186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return false; 66286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 66386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 66486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Determines whether the given declaration is a union. 66586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsUnion(NamedDecl *ND) const { 66686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Allow us to find class templates, too. 66786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (ClassTemplateDecl *ClassTemplate = dyn_cast<ClassTemplateDecl>(ND)) 66886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ND = ClassTemplate->getTemplatedDecl(); 66986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 67086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (RecordDecl *RD = dyn_cast<RecordDecl>(ND)) 67186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return RD->getTagKind() == TagDecl::TK_union; 67286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 67386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return false; 67486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 67586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 67686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Determines whether the given declaration is a namespace. 67786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsNamespace(NamedDecl *ND) const { 67886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return isa<NamespaceDecl>(ND); 67986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 68086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 68186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Determines whether the given declaration is a namespace or 68286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// namespace alias. 68386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsNamespaceOrAlias(NamedDecl *ND) const { 68486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return isa<NamespaceDecl>(ND) || isa<NamespaceAliasDecl>(ND); 68586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 68686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 6877628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor/// \brief Determines whether the given declaration is a type. 68886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsType(NamedDecl *ND) const { 68986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return isa<TypeDecl>(ND); 69086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 69186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 6927628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor/// \brief Determines which members of a class should be visible via 6937628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor/// "." or "->". Only value declarations, nested name specifiers, and 6947628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor/// using declarations thereof should show up. 695eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregorbool ResultBuilder::IsMember(NamedDecl *ND) const { 6967628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor if (UsingShadowDecl *Using = dyn_cast<UsingShadowDecl>(ND)) 6977628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor ND = Using->getTargetDecl(); 6987628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor 699ce82196076cd15f5ecfa029fcda8b58dc0146cf1Douglas Gregor return isa<ValueDecl>(ND) || isa<FunctionTemplateDecl>(ND) || 700ce82196076cd15f5ecfa029fcda8b58dc0146cf1Douglas Gregor isa<ObjCPropertyDecl>(ND); 701eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor} 702eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor 7031ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregornamespace { 7041ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// \brief Visible declaration consumer that adds a code-completion result 7051ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// for each visible declaration. 7061ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor class CodeCompletionDeclConsumer : public VisibleDeclConsumer { 7071ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor ResultBuilder &Results; 7081ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor DeclContext *CurContext; 7091ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 7101ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor public: 7111ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor CodeCompletionDeclConsumer(ResultBuilder &Results, DeclContext *CurContext) 7121ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor : Results(Results), CurContext(CurContext) { } 7131ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 7140cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor virtual void FoundDecl(NamedDecl *ND, NamedDecl *Hiding, bool InBaseClass) { 7150cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor Results.AddResult(ND, CurContext, Hiding, InBaseClass); 7161ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor } 7171ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor }; 7181ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor} 7191ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 72086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Add type specifiers for the current language as keyword results. 721bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddTypeSpecifierResults(const LangOptions &LangOpts, 72286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ResultBuilder &Results) { 72386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor typedef CodeCompleteConsumer::Result Result; 724bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("short")); 725bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("long")); 726bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("signed")); 727bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("unsigned")); 728bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("void")); 729bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("char")); 730bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("int")); 731bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("float")); 732bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("double")); 733bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("enum")); 734bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("struct")); 735bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("union")); 736bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("const")); 737bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("volatile")); 73801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 73986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (LangOpts.C99) { 74086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // C99-specific 741bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("_Complex")); 742bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("_Imaginary")); 743bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("_Bool")); 744bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("restrict")); 74586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 74686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 74786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (LangOpts.CPlusPlus) { 74886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // C++-specific 749bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("bool")); 750bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("class")); 751bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("wchar_t")); 75286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 75301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // typename qualified-id 75401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor CodeCompletionString *Pattern = new CodeCompletionString; 75501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("typename"); 75601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 75701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("qualified-id"); 758bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 75901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 76086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (LangOpts.CPlusPlus0x) { 761bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("auto")); 762bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("char16_t")); 763bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("char32_t")); 764bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("decltype")); 76586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 76686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 76786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 76886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // GNU extensions 76986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (LangOpts.GNUMode) { 77086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // FIXME: Enable when we actually support decimal floating point. 771bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor // Results.MaybeAddResult(Result("_Decimal32")); 772bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor // Results.MaybeAddResult(Result("_Decimal64")); 773bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor // Results.MaybeAddResult(Result("_Decimal128")); 77401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 77501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor CodeCompletionString *Pattern = new CodeCompletionString; 77601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("typeof"); 77701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 77801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("expression-or-type"); 77901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 780bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 78101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 78201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor} 78301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 78401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregorstatic void AddStorageSpecifiers(Action::CodeCompletionContext CCC, 78501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor const LangOptions &LangOpts, 78601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor ResultBuilder &Results) { 78701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor typedef CodeCompleteConsumer::Result Result; 78801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Note: we don't suggest either "auto" or "register", because both 78901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // are pointless as storage specifiers. Elsewhere, we suggest "auto" 79001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // in C++0x as a type specifier. 791bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("extern")); 792bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("static")); 79301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor} 79401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 79501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregorstatic void AddFunctionSpecifiers(Action::CodeCompletionContext CCC, 79601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor const LangOptions &LangOpts, 79701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor ResultBuilder &Results) { 79801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor typedef CodeCompleteConsumer::Result Result; 79901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor switch (CCC) { 80001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case Action::CCC_Class: 80101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case Action::CCC_MemberTemplate: 80201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (LangOpts.CPlusPlus) { 803bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("explicit")); 804bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("friend")); 805bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("mutable")); 806bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("virtual")); 80701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 80801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Fall through 80901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 810b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor case Action::CCC_ObjCInterface: 811b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor case Action::CCC_ObjCImplementation: 81201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case Action::CCC_Namespace: 81301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case Action::CCC_Template: 81401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (LangOpts.CPlusPlus || LangOpts.C99) 815bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("inline")); 81601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 81701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 818c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor case Action::CCC_ObjCInstanceVariableList: 81901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case Action::CCC_Expression: 82001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case Action::CCC_Statement: 82101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case Action::CCC_ForInit: 82201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case Action::CCC_Condition: 82301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 82401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 82501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor} 82601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 827bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCExpressionResults(ResultBuilder &Results, bool NeedAt); 828bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCStatementResults(ResultBuilder &Results, bool NeedAt); 829bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCVisibilityResults(const LangOptions &LangOpts, 830c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor ResultBuilder &Results, 831c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor bool NeedAt); 832bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCImplementationResults(const LangOptions &LangOpts, 833b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor ResultBuilder &Results, 834b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor bool NeedAt); 835bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCInterfaceResults(const LangOptions &LangOpts, 836b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor ResultBuilder &Results, 837b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor bool NeedAt); 838bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCTopLevelResults(ResultBuilder &Results, bool NeedAt); 839b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 84001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor/// \brief Add language constructs that show up for "ordinary" names. 84101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregorstatic void AddOrdinaryNameResults(Action::CodeCompletionContext CCC, 84201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Scope *S, 84301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Sema &SemaRef, 84401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor ResultBuilder &Results) { 84501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor typedef CodeCompleteConsumer::Result Result; 84601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor switch (CCC) { 84701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case Action::CCC_Namespace: 84801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus) { 84901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // namespace <identifier> { } 85001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor CodeCompletionString *Pattern = new CodeCompletionString; 85101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("namespace"); 85201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 85301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("identifier"); 85401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftBrace); 85501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("declarations"); 85601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_VerticalSpace); 85701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightBrace); 858bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 85901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 86001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // namespace identifier = identifier ; 86101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 86201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("namespace"); 86301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 86401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("identifier"); 86501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_Equal); 86601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("identifier"); 86701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_SemiColon); 868bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 86901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 87001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Using directives 87101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 87201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("using"); 87301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 87401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTextChunk("namespace"); 87501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 87601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("identifier"); 87701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_SemiColon); 878bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 87901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 88001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // asm(string-literal) 88101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 88201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("asm"); 88301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 88401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("string-literal"); 88501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 88601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_SemiColon); 887bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 88801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 88901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Explicit template instantiation 89001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 89101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("template"); 89201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 89301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("declaration"); 89401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_SemiColon); 895bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 89601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 897b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 898b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor if (SemaRef.getLangOptions().ObjC1) 899bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCTopLevelResults(Results, true); 900b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 90101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Fall through 90201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 90301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case Action::CCC_Class: 904bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("typedef")); 90501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus) { 90601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Using declaration 90701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor CodeCompletionString *Pattern = new CodeCompletionString; 90801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("using"); 90901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 91001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("qualified-id"); 91101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_SemiColon); 912bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 91301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 91401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // using typename qualified-id; (only in a dependent context) 91501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (SemaRef.CurContext->isDependentContext()) { 91601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 91701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("using"); 91801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 91901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTextChunk("typename"); 92001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 92101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("qualified-id"); 92201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_SemiColon); 923bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 92401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 92501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 92601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (CCC == Action::CCC_Class) { 92701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // public: 92801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 92901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("public"); 93001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_Colon); 931bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 93201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 93301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // protected: 93401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 93501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("protected"); 93601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_Colon); 937bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 93801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 93901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // private: 94001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 94101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("private"); 94201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_Colon); 943bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 94401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 94501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 94601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Fall through 94701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 94801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case Action::CCC_Template: 94901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case Action::CCC_MemberTemplate: 95001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus) { 95101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // template < parameters > 95201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor CodeCompletionString *Pattern = new CodeCompletionString; 95301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("template"); 95401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftAngle); 95501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("parameters"); 95601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightAngle); 957bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 95801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 95901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 960bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddStorageSpecifiers(CCC, SemaRef.getLangOptions(), Results); 961bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddFunctionSpecifiers(CCC, SemaRef.getLangOptions(), Results); 96201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 96301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 964b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor case Action::CCC_ObjCInterface: 965bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCInterfaceResults(SemaRef.getLangOptions(), Results, true); 966bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddStorageSpecifiers(CCC, SemaRef.getLangOptions(), Results); 967bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddFunctionSpecifiers(CCC, SemaRef.getLangOptions(), Results); 968b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor break; 969b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 970b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor case Action::CCC_ObjCImplementation: 971bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCImplementationResults(SemaRef.getLangOptions(), Results, true); 972bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddStorageSpecifiers(CCC, SemaRef.getLangOptions(), Results); 973bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddFunctionSpecifiers(CCC, SemaRef.getLangOptions(), Results); 974b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor break; 975b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 976c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor case Action::CCC_ObjCInstanceVariableList: 977bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCVisibilityResults(SemaRef.getLangOptions(), Results, true); 978c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor break; 979c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor 98001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case Action::CCC_Statement: { 981bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("typedef")); 98201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 98301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor CodeCompletionString *Pattern = 0; 98401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus) { 98501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 98601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("try"); 98701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftBrace); 98801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("statements"); 98901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_VerticalSpace); 99001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightBrace); 99101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTextChunk("catch"); 99201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 99301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("declaration"); 99401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 99501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftBrace); 99601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("statements"); 99701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_VerticalSpace); 99801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightBrace); 999bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 100001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 1001b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor if (SemaRef.getLangOptions().ObjC1) 1002bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCStatementResults(Results, true); 1003b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 100401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // if (condition) { statements } 100501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 100601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("if"); 100701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 100801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus) 100901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("condition"); 101001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor else 101101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("expression"); 101201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 101301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftBrace); 101401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("statements"); 101501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_VerticalSpace); 101601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightBrace); 1017bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 101801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 101901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // switch (condition) { } 102001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 102101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("switch"); 102201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 102301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus) 102401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("condition"); 102501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor else 102601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("expression"); 102701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 102801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftBrace); 102901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_VerticalSpace); 103001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightBrace); 1031bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 103201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 103301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Switch-specific statements. 103401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (!SemaRef.getSwitchStack().empty()) { 103501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // case expression: 103601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 103701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("case"); 103801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("expression"); 103901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_Colon); 1040bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 104101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 104201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // default: 104301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 104401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("default"); 104501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_Colon); 1046bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 104701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 104801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 104901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor /// while (condition) { statements } 105001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 105101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("while"); 105201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 105301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus) 105401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("condition"); 105501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor else 105601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("expression"); 105701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 105801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftBrace); 105901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("statements"); 106001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_VerticalSpace); 106101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightBrace); 1062bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 106301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 106401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // do { statements } while ( expression ); 106501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 106601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("do"); 106701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftBrace); 106801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("statements"); 106901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_VerticalSpace); 107001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightBrace); 107101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTextChunk("while"); 107201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 107301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("expression"); 107401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 107501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_SemiColon); 1076bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 107701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 107801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // for ( for-init-statement ; condition ; expression ) { statements } 107901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 108001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("for"); 108101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 108201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus || SemaRef.getLangOptions().C99) 108301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("init-statement"); 108401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor else 108501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("init-expression"); 108601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_SemiColon); 108701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("condition"); 108801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_SemiColon); 108901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("inc-expression"); 109001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 109101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftBrace); 109201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("statements"); 109301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_VerticalSpace); 109401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightBrace); 1095bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 109601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 109701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (S->getContinueParent()) { 109801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // continue ; 109901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 110001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("continue"); 110101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_SemiColon); 1102bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 110301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 110401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 110501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (S->getBreakParent()) { 110601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // break ; 110701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 110801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("break"); 110901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_SemiColon); 1110bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 111101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 111201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 111301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // "return expression ;" or "return ;", depending on whether we 111401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // know the function is void or not. 111501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor bool isVoid = false; 111601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (FunctionDecl *Function = dyn_cast<FunctionDecl>(SemaRef.CurContext)) 111701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor isVoid = Function->getResultType()->isVoidType(); 111801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor else if (ObjCMethodDecl *Method 111901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor = dyn_cast<ObjCMethodDecl>(SemaRef.CurContext)) 112001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor isVoid = Method->getResultType()->isVoidType(); 112101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor else if (SemaRef.CurBlock && !SemaRef.CurBlock->ReturnType.isNull()) 112201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor isVoid = SemaRef.CurBlock->ReturnType->isVoidType(); 112301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 112401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("return"); 112501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (!isVoid) 112601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("expression"); 112701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_SemiColon); 1128bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 112901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 113001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // goto identifier ; 113101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 113201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("goto"); 113301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 113401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("identifier"); 113501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_SemiColon); 1136bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 113701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 113801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Using directives 113901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 114001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("using"); 114101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 114201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTextChunk("namespace"); 114301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 114401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("identifier"); 114501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_SemiColon); 1146bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 114701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 114801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 114901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Fall through (for statement expressions). 115001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case Action::CCC_ForInit: 115101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case Action::CCC_Condition: 1152bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddStorageSpecifiers(CCC, SemaRef.getLangOptions(), Results); 115301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Fall through: conditions and statements can have expressions. 115401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 115501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case Action::CCC_Expression: { 115601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor CodeCompletionString *Pattern = 0; 115701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus) { 115801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // 'this', if we're in a non-static member function. 115901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(SemaRef.CurContext)) 116001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (!Method->isStatic()) 1161bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("this")); 116201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 116301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // true, false 1164bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("true")); 1165bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("false")); 116601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 116701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // dynamic_cast < type-id > ( expression ) 116801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 116901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("dynamic_cast"); 117001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftAngle); 117101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("type-id"); 117201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightAngle); 117301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 117401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("expression"); 117501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 1176bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 117701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 117801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // static_cast < type-id > ( expression ) 117901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 118001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("static_cast"); 118101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftAngle); 118201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("type-id"); 118301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightAngle); 118401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 118501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("expression"); 118601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 1187bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 118801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 118901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // reinterpret_cast < type-id > ( expression ) 119001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 119101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("reinterpret_cast"); 119201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftAngle); 119301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("type-id"); 119401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightAngle); 119501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 119601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("expression"); 119701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 1198bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 119901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 120001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // const_cast < type-id > ( expression ) 120101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 120201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("const_cast"); 120301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftAngle); 120401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("type-id"); 120501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightAngle); 120601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 120701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("expression"); 120801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 1209bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 121001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 121101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // typeid ( expression-or-type ) 121201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 121301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("typeid"); 121401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 121501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("expression-or-type"); 121601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 1217bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 121801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 121901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // new T ( ... ) 122001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 122101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("new"); 122201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 122301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("type-id"); 122401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 122501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("expressions"); 122601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 1227bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 122801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 122901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // new T [ ] ( ... ) 123001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 123101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("new"); 123201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 123301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("type-id"); 123401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftBracket); 123501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("size"); 123601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightBracket); 123701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 123801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("expressions"); 123901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 1240bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 124101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 124201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // delete expression 124301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 124401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("delete"); 124501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 124601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("expression"); 1247bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 124801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 124901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // delete [] expression 125001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 125101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("delete"); 125201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftBracket); 125301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightBracket); 125401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 125501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("expression"); 1256bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 125701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 125801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // throw expression 125901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 126001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("throw"); 126101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 126201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("expression"); 1263bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 126401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 126501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 126601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (SemaRef.getLangOptions().ObjC1) { 126701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Add "super", if we're in an Objective-C class with a superclass. 126801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (ObjCMethodDecl *Method = SemaRef.getCurMethodDecl()) 126901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (Method->getClassInterface()->getSuperClass()) 1270bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("super")); 1271b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 1272bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCExpressionResults(Results, true); 127301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 127401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 127501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // sizeof expression 127601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 127701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("sizeof"); 127801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 127901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("expression-or-type"); 128001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 1281bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 128201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 128386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 128401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 128501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1286bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddTypeSpecifierResults(SemaRef.getLangOptions(), Results); 128701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 128801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus) 1289bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("operator")); 129086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 129186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 1292ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor/// \brief If the given declaration has an associated type, add it as a result 1293ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor/// type chunk. 1294ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregorstatic void AddResultTypeChunk(ASTContext &Context, 1295ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor NamedDecl *ND, 1296ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor CodeCompletionString *Result) { 1297ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor if (!ND) 1298ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor return; 1299ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor 1300ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor // Determine the type of the declaration (if it has a type). 1301ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor QualType T; 1302ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor if (FunctionDecl *Function = dyn_cast<FunctionDecl>(ND)) 1303ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor T = Function->getResultType(); 1304ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor else if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(ND)) 1305ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor T = Method->getResultType(); 1306ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor else if (FunctionTemplateDecl *FunTmpl = dyn_cast<FunctionTemplateDecl>(ND)) 1307ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor T = FunTmpl->getTemplatedDecl()->getResultType(); 1308ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor else if (EnumConstantDecl *Enumerator = dyn_cast<EnumConstantDecl>(ND)) 1309ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor T = Context.getTypeDeclType(cast<TypeDecl>(Enumerator->getDeclContext())); 1310ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor else if (isa<UnresolvedUsingValueDecl>(ND)) { 1311ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor /* Do nothing: ignore unresolved using declarations*/ 1312ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor } else if (ValueDecl *Value = dyn_cast<ValueDecl>(ND)) 1313ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor T = Value->getType(); 1314ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor else if (ObjCPropertyDecl *Property = dyn_cast<ObjCPropertyDecl>(ND)) 1315ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor T = Property->getType(); 1316ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor 1317ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor if (T.isNull() || Context.hasSameType(T, Context.DependentTy)) 1318ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor return; 1319ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor 1320ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor std::string TypeStr; 1321ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor T.getAsStringInternal(TypeStr, Context.PrintingPolicy); 1322ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor Result->AddResultTypeChunk(TypeStr); 1323ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor} 1324ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor 132586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Add function parameter chunks to the given code completion string. 132686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorstatic void AddFunctionParameterChunks(ASTContext &Context, 132786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor FunctionDecl *Function, 132886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor CodeCompletionString *Result) { 13290c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor typedef CodeCompletionString::Chunk Chunk; 13300c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 133186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor CodeCompletionString *CCStr = Result; 133286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 133386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor for (unsigned P = 0, N = Function->getNumParams(); P != N; ++P) { 133486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ParmVarDecl *Param = Function->getParamDecl(P); 133586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 133686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (Param->hasDefaultArg()) { 133786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // When we see an optional default argument, put that argument and 133886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // the remaining default arguments into a new, optional string. 133986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor CodeCompletionString *Opt = new CodeCompletionString; 134086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor CCStr->AddOptionalChunk(std::auto_ptr<CodeCompletionString>(Opt)); 134186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor CCStr = Opt; 134286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 134386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 134486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (P != 0) 13450c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor CCStr->AddChunk(Chunk(CodeCompletionString::CK_Comma)); 134686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 134786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Format the placeholder string. 134886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor std::string PlaceholderStr; 134986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (Param->getIdentifier()) 135086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr = Param->getIdentifier()->getName(); 135186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 135286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Param->getType().getAsStringInternal(PlaceholderStr, 135386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Context.PrintingPolicy); 135486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 135586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add the placeholder string. 1356660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer CCStr->AddPlaceholderChunk(PlaceholderStr); 135786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 1358b3d4525c65cf456d3f1f4338afdcac83afc7be02Douglas Gregor 1359b3d4525c65cf456d3f1f4338afdcac83afc7be02Douglas Gregor if (const FunctionProtoType *Proto 1360b3d4525c65cf456d3f1f4338afdcac83afc7be02Douglas Gregor = Function->getType()->getAs<FunctionProtoType>()) 1361b3d4525c65cf456d3f1f4338afdcac83afc7be02Douglas Gregor if (Proto->isVariadic()) 1362b3d4525c65cf456d3f1f4338afdcac83afc7be02Douglas Gregor CCStr->AddPlaceholderChunk(", ..."); 136386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 136486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 136586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Add template parameter chunks to the given code completion string. 136686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorstatic void AddTemplateParameterChunks(ASTContext &Context, 136786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor TemplateDecl *Template, 136886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor CodeCompletionString *Result, 136986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor unsigned MaxParameters = 0) { 13700c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor typedef CodeCompletionString::Chunk Chunk; 13710c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 137286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor CodeCompletionString *CCStr = Result; 137386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool FirstParameter = true; 137486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 137586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor TemplateParameterList *Params = Template->getTemplateParameters(); 137686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor TemplateParameterList::iterator PEnd = Params->end(); 137786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (MaxParameters) 137886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PEnd = Params->begin() + MaxParameters; 137986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor for (TemplateParameterList::iterator P = Params->begin(); P != PEnd; ++P) { 138086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool HasDefaultArg = false; 138186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor std::string PlaceholderStr; 138286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(*P)) { 138386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (TTP->wasDeclaredWithTypename()) 138486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr = "typename"; 138586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor else 138686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr = "class"; 138786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 138886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (TTP->getIdentifier()) { 138986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr += ' '; 139086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr += TTP->getIdentifier()->getName(); 139186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 139286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 139386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor HasDefaultArg = TTP->hasDefaultArgument(); 139486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } else if (NonTypeTemplateParmDecl *NTTP 139586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor = dyn_cast<NonTypeTemplateParmDecl>(*P)) { 139686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (NTTP->getIdentifier()) 139786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr = NTTP->getIdentifier()->getName(); 139886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NTTP->getType().getAsStringInternal(PlaceholderStr, 139986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Context.PrintingPolicy); 140086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor HasDefaultArg = NTTP->hasDefaultArgument(); 140186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } else { 140286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor assert(isa<TemplateTemplateParmDecl>(*P)); 140386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor TemplateTemplateParmDecl *TTP = cast<TemplateTemplateParmDecl>(*P); 140486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 140586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Since putting the template argument list into the placeholder would 140686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // be very, very long, we just use an abbreviation. 140786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr = "template<...> class"; 140886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (TTP->getIdentifier()) { 140986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr += ' '; 141086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr += TTP->getIdentifier()->getName(); 141186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 141286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 141386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor HasDefaultArg = TTP->hasDefaultArgument(); 141486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 141586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 141686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (HasDefaultArg) { 141786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // When we see an optional default argument, put that argument and 141886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // the remaining default arguments into a new, optional string. 141986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor CodeCompletionString *Opt = new CodeCompletionString; 142086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor CCStr->AddOptionalChunk(std::auto_ptr<CodeCompletionString>(Opt)); 142186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor CCStr = Opt; 142286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 142386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 142486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (FirstParameter) 142586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor FirstParameter = false; 142686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor else 14270c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor CCStr->AddChunk(Chunk(CodeCompletionString::CK_Comma)); 142886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 142986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add the placeholder string. 1430660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer CCStr->AddPlaceholderChunk(PlaceholderStr); 143186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 143286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 143386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 1434b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor/// \brief Add a qualifier to the given code-completion string, if the 1435b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor/// provided nested-name-specifier is non-NULL. 1436a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregorstatic void 1437a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas GregorAddQualifierToCompletionString(CodeCompletionString *Result, 1438a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor NestedNameSpecifier *Qualifier, 1439a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor bool QualifierIsInformative, 1440a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor ASTContext &Context) { 1441b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor if (!Qualifier) 1442b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor return; 1443b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor 1444b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor std::string PrintedNNS; 1445b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor { 1446b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor llvm::raw_string_ostream OS(PrintedNNS); 1447b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor Qualifier->print(OS, Context.PrintingPolicy); 1448b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor } 14490563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor if (QualifierIsInformative) 1450660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer Result->AddInformativeChunk(PrintedNNS); 14510563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor else 1452660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer Result->AddTextChunk(PrintedNNS); 1453b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor} 1454b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor 1455a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregorstatic void AddFunctionTypeQualsToCompletionString(CodeCompletionString *Result, 1456a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor FunctionDecl *Function) { 1457a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor const FunctionProtoType *Proto 1458a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor = Function->getType()->getAs<FunctionProtoType>(); 1459a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor if (!Proto || !Proto->getTypeQuals()) 1460a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor return; 1461a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor 1462a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor std::string QualsStr; 1463a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor if (Proto->getTypeQuals() & Qualifiers::Const) 1464a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor QualsStr += " const"; 1465a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor if (Proto->getTypeQuals() & Qualifiers::Volatile) 1466a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor QualsStr += " volatile"; 1467a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor if (Proto->getTypeQuals() & Qualifiers::Restrict) 1468a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor QualsStr += " restrict"; 1469a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor Result->AddInformativeChunk(QualsStr); 1470a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor} 1471a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor 147286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief If possible, create a new code completion string for the given 147386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// result. 147486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// 147586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \returns Either a new, heap-allocated code completion string describing 147686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// how to use this result, or NULL to indicate that the string or name of the 147786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// result is all that is needed. 147886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas GregorCodeCompletionString * 147986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas GregorCodeCompleteConsumer::Result::CreateCodeCompletionString(Sema &S) { 14800c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor typedef CodeCompletionString::Chunk Chunk; 14810c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 14822b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor if (Kind == RK_Pattern) 14832b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor return Pattern->Clone(); 14842b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 14852b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor CodeCompletionString *Result = new CodeCompletionString; 14862b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 14872b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor if (Kind == RK_Keyword) { 14882b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor Result->AddTypedTextChunk(Keyword); 14892b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor return Result; 14902b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor } 149186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 14923f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor if (Kind == RK_Macro) { 14933f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor MacroInfo *MI = S.PP.getMacroInfo(Macro); 14942b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor assert(MI && "Not a macro?"); 14952b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 14962b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor Result->AddTypedTextChunk(Macro->getName()); 14972b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 14982b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor if (!MI->isFunctionLike()) 14992b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor return Result; 15003f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor 15013f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor // Format a function-like macro with placeholders for the arguments. 15020c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_LeftParen)); 15033f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor for (MacroInfo::arg_iterator A = MI->arg_begin(), AEnd = MI->arg_end(); 15043f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor A != AEnd; ++A) { 15053f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor if (A != MI->arg_begin()) 15060c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_Comma)); 15073f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor 15083f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor if (!MI->isVariadic() || A != AEnd - 1) { 15093f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor // Non-variadic argument. 1510660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer Result->AddPlaceholderChunk((*A)->getName()); 15113f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor continue; 15123f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor } 15133f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor 15143f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor // Variadic argument; cope with the different between GNU and C99 15153f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor // variadic macros, providing a single placeholder for the rest of the 15163f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor // arguments. 15173f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor if ((*A)->isStr("__VA_ARGS__")) 15183f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor Result->AddPlaceholderChunk("..."); 15193f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor else { 15203f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor std::string Arg = (*A)->getName(); 15213f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor Arg += "..."; 1522660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer Result->AddPlaceholderChunk(Arg); 15233f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor } 15243f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor } 15250c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_RightParen)); 15263f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor return Result; 15273f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor } 15283f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor 15293f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor assert(Kind == RK_Declaration && "Missed a macro kind?"); 153086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NamedDecl *ND = Declaration; 153186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 15320c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor if (StartsNestedNameSpecifier) { 1533660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer Result->AddTypedTextChunk(ND->getNameAsString()); 15340c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddTextChunk("::"); 15350c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor return Result; 15360c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor } 15370c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 1538ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor AddResultTypeChunk(S.Context, ND, Result); 1539ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor 154086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (FunctionDecl *Function = dyn_cast<FunctionDecl>(ND)) { 15410563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative, 15420563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor S.Context); 1543660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer Result->AddTypedTextChunk(Function->getNameAsString()); 15440c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_LeftParen)); 154586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor AddFunctionParameterChunks(S.Context, Function, Result); 15460c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_RightParen)); 1547a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor AddFunctionTypeQualsToCompletionString(Result, Function); 154886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return Result; 154986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 155086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 155186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (FunctionTemplateDecl *FunTmpl = dyn_cast<FunctionTemplateDecl>(ND)) { 15520563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative, 15530563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor S.Context); 155486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor FunctionDecl *Function = FunTmpl->getTemplatedDecl(); 1555660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer Result->AddTypedTextChunk(Function->getNameAsString()); 155686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 155786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Figure out which template parameters are deduced (or have default 155886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // arguments). 155986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor llvm::SmallVector<bool, 16> Deduced; 156086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor S.MarkDeducedTemplateParameters(FunTmpl, Deduced); 156186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor unsigned LastDeducibleArgument; 156286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor for (LastDeducibleArgument = Deduced.size(); LastDeducibleArgument > 0; 156386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor --LastDeducibleArgument) { 156486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!Deduced[LastDeducibleArgument - 1]) { 156586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // C++0x: Figure out if the template argument has a default. If so, 156686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // the user doesn't need to type this argument. 156786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // FIXME: We need to abstract template parameters better! 156886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool HasDefaultArg = false; 156986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NamedDecl *Param = FunTmpl->getTemplateParameters()->getParam( 157086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor LastDeducibleArgument - 1); 157186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(Param)) 157286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor HasDefaultArg = TTP->hasDefaultArgument(); 157386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor else if (NonTypeTemplateParmDecl *NTTP 157486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor = dyn_cast<NonTypeTemplateParmDecl>(Param)) 157586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor HasDefaultArg = NTTP->hasDefaultArgument(); 157686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor else { 157786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor assert(isa<TemplateTemplateParmDecl>(Param)); 157886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor HasDefaultArg 15790c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor = cast<TemplateTemplateParmDecl>(Param)->hasDefaultArgument(); 158086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 158186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 158286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!HasDefaultArg) 158386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor break; 158486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 158586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 158686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 158786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (LastDeducibleArgument) { 158886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Some of the function template arguments cannot be deduced from a 158986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // function call, so we introduce an explicit template argument list 159086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // containing all of the arguments up to the first deducible argument. 15910c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_LeftAngle)); 159286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor AddTemplateParameterChunks(S.Context, FunTmpl, Result, 159386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor LastDeducibleArgument); 15940c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_RightAngle)); 159586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 159686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 159786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add the function parameters 15980c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_LeftParen)); 159986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor AddFunctionParameterChunks(S.Context, Function, Result); 16000c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_RightParen)); 1601a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor AddFunctionTypeQualsToCompletionString(Result, Function); 160286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return Result; 160386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 160486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 160586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (TemplateDecl *Template = dyn_cast<TemplateDecl>(ND)) { 16060563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative, 16070563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor S.Context); 1608660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer Result->AddTypedTextChunk(Template->getNameAsString()); 16090c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_LeftAngle)); 161086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor AddTemplateParameterChunks(S.Context, Template, Result); 16110c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_RightAngle)); 161286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return Result; 161386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 161486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 16159630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(ND)) { 16169630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor Selector Sel = Method->getSelector(); 16179630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor if (Sel.isUnarySelector()) { 16189630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor Result->AddTypedTextChunk(Sel.getIdentifierInfoForSlot(0)->getName()); 16199630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor return Result; 16209630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor } 16219630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor 1622d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor std::string SelName = Sel.getIdentifierInfoForSlot(0)->getName().str(); 1623d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor SelName += ':'; 1624d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor if (StartParameter == 0) 1625d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor Result->AddTypedTextChunk(SelName); 1626d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor else { 1627d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor Result->AddInformativeChunk(SelName); 1628d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor 1629d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor // If there is only one parameter, and we're past it, add an empty 1630d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor // typed-text chunk since there is nothing to type. 1631d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor if (Method->param_size() == 1) 1632d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor Result->AddTypedTextChunk(""); 1633d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor } 16349630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor unsigned Idx = 0; 16359630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor for (ObjCMethodDecl::param_iterator P = Method->param_begin(), 16369630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor PEnd = Method->param_end(); 16379630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor P != PEnd; (void)++P, ++Idx) { 16389630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor if (Idx > 0) { 1639d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor std::string Keyword; 1640d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor if (Idx > StartParameter) 1641834389b87451b24618513b907b4dfb5b00d211f3Douglas Gregor Result->AddChunk(CodeCompletionString::CK_HorizontalSpace); 16429630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor if (IdentifierInfo *II = Sel.getIdentifierInfoForSlot(Idx)) 16439630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor Keyword += II->getName().str(); 16449630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor Keyword += ":"; 16454ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (Idx < StartParameter || AllParametersAreInformative) { 1646d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor Result->AddInformativeChunk(Keyword); 1647d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor } else if (Idx == StartParameter) 1648d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor Result->AddTypedTextChunk(Keyword); 1649d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor else 1650d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor Result->AddTextChunk(Keyword); 16519630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor } 1652d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor 1653d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor // If we're before the starting parameter, skip the placeholder. 1654d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor if (Idx < StartParameter) 1655d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor continue; 16569630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor 16579630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor std::string Arg; 16589630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor (*P)->getType().getAsStringInternal(Arg, S.Context.PrintingPolicy); 16599630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor Arg = "(" + Arg + ")"; 16609630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor if (IdentifierInfo *II = (*P)->getIdentifier()) 16619630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor Arg += II->getName().str(); 16624ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (AllParametersAreInformative) 16634ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Result->AddInformativeChunk(Arg); 16644ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor else 16654ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Result->AddPlaceholderChunk(Arg); 16669630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor } 16679630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor 16682a17af0c7e05500e25d4cc71341f1f232085ebeaDouglas Gregor if (Method->isVariadic()) { 16692a17af0c7e05500e25d4cc71341f1f232085ebeaDouglas Gregor if (AllParametersAreInformative) 16702a17af0c7e05500e25d4cc71341f1f232085ebeaDouglas Gregor Result->AddInformativeChunk(", ..."); 16712a17af0c7e05500e25d4cc71341f1f232085ebeaDouglas Gregor else 16722a17af0c7e05500e25d4cc71341f1f232085ebeaDouglas Gregor Result->AddPlaceholderChunk(", ..."); 16732a17af0c7e05500e25d4cc71341f1f232085ebeaDouglas Gregor } 16742a17af0c7e05500e25d4cc71341f1f232085ebeaDouglas Gregor 16759630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor return Result; 16769630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor } 16779630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor 16782b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor if (Qualifier) 16790563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative, 16800563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor S.Context); 16812b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 16822b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor Result->AddTypedTextChunk(ND->getNameAsString()); 16832b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor return Result; 168486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 168586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 168686d802e03a267af79663990c39865c67e0645238Douglas GregorCodeCompletionString * 168786d802e03a267af79663990c39865c67e0645238Douglas GregorCodeCompleteConsumer::OverloadCandidate::CreateSignatureString( 168886d802e03a267af79663990c39865c67e0645238Douglas Gregor unsigned CurrentArg, 168986d802e03a267af79663990c39865c67e0645238Douglas Gregor Sema &S) const { 16900c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor typedef CodeCompletionString::Chunk Chunk; 16910c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 169286d802e03a267af79663990c39865c67e0645238Douglas Gregor CodeCompletionString *Result = new CodeCompletionString; 169386d802e03a267af79663990c39865c67e0645238Douglas Gregor FunctionDecl *FDecl = getFunction(); 1694ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor AddResultTypeChunk(S.Context, FDecl, Result); 169586d802e03a267af79663990c39865c67e0645238Douglas Gregor const FunctionProtoType *Proto 169686d802e03a267af79663990c39865c67e0645238Douglas Gregor = dyn_cast<FunctionProtoType>(getFunctionType()); 169786d802e03a267af79663990c39865c67e0645238Douglas Gregor if (!FDecl && !Proto) { 169886d802e03a267af79663990c39865c67e0645238Douglas Gregor // Function without a prototype. Just give the return type and a 169986d802e03a267af79663990c39865c67e0645238Douglas Gregor // highlighted ellipsis. 170086d802e03a267af79663990c39865c67e0645238Douglas Gregor const FunctionType *FT = getFunctionType(); 170186d802e03a267af79663990c39865c67e0645238Douglas Gregor Result->AddTextChunk( 1702660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer FT->getResultType().getAsString(S.Context.PrintingPolicy)); 17030c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_LeftParen)); 17040c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_CurrentParameter, "...")); 17050c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_RightParen)); 170686d802e03a267af79663990c39865c67e0645238Douglas Gregor return Result; 170786d802e03a267af79663990c39865c67e0645238Douglas Gregor } 170886d802e03a267af79663990c39865c67e0645238Douglas Gregor 170986d802e03a267af79663990c39865c67e0645238Douglas Gregor if (FDecl) 1710660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer Result->AddTextChunk(FDecl->getNameAsString()); 171186d802e03a267af79663990c39865c67e0645238Douglas Gregor else 171286d802e03a267af79663990c39865c67e0645238Douglas Gregor Result->AddTextChunk( 1713660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer Proto->getResultType().getAsString(S.Context.PrintingPolicy)); 171486d802e03a267af79663990c39865c67e0645238Douglas Gregor 17150c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_LeftParen)); 171686d802e03a267af79663990c39865c67e0645238Douglas Gregor unsigned NumParams = FDecl? FDecl->getNumParams() : Proto->getNumArgs(); 171786d802e03a267af79663990c39865c67e0645238Douglas Gregor for (unsigned I = 0; I != NumParams; ++I) { 171886d802e03a267af79663990c39865c67e0645238Douglas Gregor if (I) 17190c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_Comma)); 172086d802e03a267af79663990c39865c67e0645238Douglas Gregor 172186d802e03a267af79663990c39865c67e0645238Douglas Gregor std::string ArgString; 172286d802e03a267af79663990c39865c67e0645238Douglas Gregor QualType ArgType; 172386d802e03a267af79663990c39865c67e0645238Douglas Gregor 172486d802e03a267af79663990c39865c67e0645238Douglas Gregor if (FDecl) { 172586d802e03a267af79663990c39865c67e0645238Douglas Gregor ArgString = FDecl->getParamDecl(I)->getNameAsString(); 172686d802e03a267af79663990c39865c67e0645238Douglas Gregor ArgType = FDecl->getParamDecl(I)->getOriginalType(); 172786d802e03a267af79663990c39865c67e0645238Douglas Gregor } else { 172886d802e03a267af79663990c39865c67e0645238Douglas Gregor ArgType = Proto->getArgType(I); 172986d802e03a267af79663990c39865c67e0645238Douglas Gregor } 173086d802e03a267af79663990c39865c67e0645238Douglas Gregor 173186d802e03a267af79663990c39865c67e0645238Douglas Gregor ArgType.getAsStringInternal(ArgString, S.Context.PrintingPolicy); 173286d802e03a267af79663990c39865c67e0645238Douglas Gregor 173386d802e03a267af79663990c39865c67e0645238Douglas Gregor if (I == CurrentArg) 17340c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_CurrentParameter, 1735660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer ArgString)); 173686d802e03a267af79663990c39865c67e0645238Douglas Gregor else 1737660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer Result->AddTextChunk(ArgString); 173886d802e03a267af79663990c39865c67e0645238Douglas Gregor } 173986d802e03a267af79663990c39865c67e0645238Douglas Gregor 174086d802e03a267af79663990c39865c67e0645238Douglas Gregor if (Proto && Proto->isVariadic()) { 17410c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_Comma)); 174286d802e03a267af79663990c39865c67e0645238Douglas Gregor if (CurrentArg < NumParams) 174386d802e03a267af79663990c39865c67e0645238Douglas Gregor Result->AddTextChunk("..."); 174486d802e03a267af79663990c39865c67e0645238Douglas Gregor else 17450c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_CurrentParameter, "...")); 174686d802e03a267af79663990c39865c67e0645238Douglas Gregor } 17470c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_RightParen)); 174886d802e03a267af79663990c39865c67e0645238Douglas Gregor 174986d802e03a267af79663990c39865c67e0645238Douglas Gregor return Result; 175086d802e03a267af79663990c39865c67e0645238Douglas Gregor} 175186d802e03a267af79663990c39865c67e0645238Douglas Gregor 175286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregornamespace { 175386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor struct SortCodeCompleteResult { 175486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor typedef CodeCompleteConsumer::Result Result; 175586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 17566a6840326e9b4ac8e81a5a212165f33743847ab8Douglas Gregor bool isEarlierDeclarationName(DeclarationName X, DeclarationName Y) const { 17572b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor Selector XSel = X.getObjCSelector(); 17582b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor Selector YSel = Y.getObjCSelector(); 17592b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor if (!XSel.isNull() && !YSel.isNull()) { 17602b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor // We are comparing two selectors. 17612b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor unsigned N = std::min(XSel.getNumArgs(), YSel.getNumArgs()); 17622b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor if (N == 0) 17632b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor ++N; 17642b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor for (unsigned I = 0; I != N; ++I) { 17652b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor IdentifierInfo *XId = XSel.getIdentifierInfoForSlot(I); 17662b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor IdentifierInfo *YId = YSel.getIdentifierInfoForSlot(I); 17672b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor if (!XId || !YId) 17682b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor return XId && !YId; 17692b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor 17702b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor switch (XId->getName().compare_lower(YId->getName())) { 17712b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor case -1: return true; 17722b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor case 1: return false; 17732b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor default: break; 17742b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor } 17752b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor } 17762b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor 17772b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor return XSel.getNumArgs() < YSel.getNumArgs(); 17782b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor } 17792b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor 17802b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor // For non-selectors, order by kind. 17812b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor if (X.getNameKind() != Y.getNameKind()) 17826a6840326e9b4ac8e81a5a212165f33743847ab8Douglas Gregor return X.getNameKind() < Y.getNameKind(); 17836a6840326e9b4ac8e81a5a212165f33743847ab8Douglas Gregor 17842b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor // Order identifiers by comparison of their lowercased names. 17852b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor if (IdentifierInfo *XId = X.getAsIdentifierInfo()) 17862b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor return XId->getName().compare_lower( 17872b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor Y.getAsIdentifierInfo()->getName()) < 0; 17882b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor 17892b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor // Order overloaded operators by the order in which they appear 17902b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor // in our list of operators. 17912b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor if (OverloadedOperatorKind XOp = X.getCXXOverloadedOperator()) 17922b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor return XOp < Y.getCXXOverloadedOperator(); 17932b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor 17942b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor // Order C++0x user-defined literal operators lexically by their 17952b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor // lowercased suffixes. 17962b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor if (IdentifierInfo *XLit = X.getCXXLiteralIdentifier()) 17972b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor return XLit->getName().compare_lower( 17982b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor Y.getCXXLiteralIdentifier()->getName()) < 0; 17992b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor 18002b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor // The only stable ordering we have is to turn the name into a 18012b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor // string and then compare the lower-case strings. This is 18022b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor // inefficient, but thankfully does not happen too often. 18030e7049fc6f2cc13d1236630782b702f11f6aaf9fBenjamin Kramer return llvm::StringRef(X.getAsString()).compare_lower( 18040e7049fc6f2cc13d1236630782b702f11f6aaf9fBenjamin Kramer Y.getAsString()) < 0; 18056a6840326e9b4ac8e81a5a212165f33743847ab8Douglas Gregor } 18066a6840326e9b4ac8e81a5a212165f33743847ab8Douglas Gregor 1807ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor /// \brief Retrieve the name that should be used to order a result. 1808ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor /// 1809ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor /// If the name needs to be constructed as a string, that string will be 1810ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor /// saved into Saved and the returned StringRef will refer to it. 1811ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor static llvm::StringRef getOrderedName(const Result &R, 1812ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor std::string &Saved) { 1813ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor switch (R.Kind) { 1814ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor case Result::RK_Keyword: 1815ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor return R.Keyword; 1816ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor 1817ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor case Result::RK_Pattern: 1818ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor return R.Pattern->getTypedText(); 1819ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor 1820ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor case Result::RK_Macro: 1821ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor return R.Macro->getName(); 1822ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor 1823ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor case Result::RK_Declaration: 1824ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor // Handle declarations below. 1825ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor break; 182654f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor } 1827ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor 1828ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor DeclarationName Name = R.Declaration->getDeclName(); 182954f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor 1830ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor // If the name is a simple identifier (by far the common case), or a 1831ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor // zero-argument selector, just return a reference to that identifier. 1832ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor if (IdentifierInfo *Id = Name.getAsIdentifierInfo()) 1833ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor return Id->getName(); 1834ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor if (Name.isObjCZeroArgSelector()) 1835ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor if (IdentifierInfo *Id 1836ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor = Name.getObjCSelector().getIdentifierInfoForSlot(0)) 1837ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor return Id->getName(); 1838ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor 1839ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor Saved = Name.getAsString(); 1840ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor return Saved; 1841ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor } 1842ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor 1843ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor bool operator()(const Result &X, const Result &Y) const { 1844ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor std::string XSaved, YSaved; 1845ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor llvm::StringRef XStr = getOrderedName(X, XSaved); 1846ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor llvm::StringRef YStr = getOrderedName(Y, YSaved); 1847ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor int cmp = XStr.compare_lower(YStr); 1848ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor if (cmp) 1849ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor return cmp < 0; 185086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 185186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Non-hidden names precede hidden names. 185286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (X.Hidden != Y.Hidden) 185386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return !X.Hidden; 185486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 1855eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor // Non-nested-name-specifiers precede nested-name-specifiers. 1856eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor if (X.StartsNestedNameSpecifier != Y.StartsNestedNameSpecifier) 1857eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor return !X.StartsNestedNameSpecifier; 1858eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor 185986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return false; 186086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 186186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor }; 186286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 186386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 1864bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddMacroResults(Preprocessor &PP, ResultBuilder &Results) { 18653f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor Results.EnterNewScope(); 18660c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor for (Preprocessor::macro_iterator M = PP.macro_begin(), 18670c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor MEnd = PP.macro_end(); 18683f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor M != MEnd; ++M) 1869bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(M->first); 18703f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor Results.ExitScope(); 18713f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor} 18723f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor 18733a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbarstatic void HandleCodeCompleteResults(Sema *S, 18743a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar CodeCompleteConsumer *CodeCompleter, 18753a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar CodeCompleteConsumer::Result *Results, 18763a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar unsigned NumResults) { 187786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor std::stable_sort(Results, Results + NumResults, SortCodeCompleteResult()); 187886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 187986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (CodeCompleter) 18803a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar CodeCompleter->ProcessCodeCompleteResults(*S, Results, NumResults); 188154f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor 188254f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor for (unsigned I = 0; I != NumResults; ++I) 188354f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor Results[I].Destroy(); 188486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 188586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 188601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregorvoid Sema::CodeCompleteOrdinaryName(Scope *S, 188701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor CodeCompletionContext CompletionContext) { 18882a7925c4abe45650f3ab27be09468e3a3a98084aDouglas Gregor typedef CodeCompleteConsumer::Result Result; 188901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor ResultBuilder Results(*this); 189001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 189101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Determine how to filter results, e.g., so that the names of 189201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // values (functions, enumerators, function templates, etc.) are 189301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // only allowed where we can have an expression. 189401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor switch (CompletionContext) { 189501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CCC_Namespace: 189601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CCC_Class: 1897b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor case CCC_ObjCInterface: 1898b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor case CCC_ObjCImplementation: 1899c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor case CCC_ObjCInstanceVariableList: 190001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CCC_Template: 190101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CCC_MemberTemplate: 190201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Results.setFilter(&ResultBuilder::IsOrdinaryNonValueName); 190301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 190401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 190501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CCC_Expression: 190601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CCC_Statement: 190701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CCC_ForInit: 190801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CCC_Condition: 190901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Results.setFilter(&ResultBuilder::IsOrdinaryName); 191001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 191101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 191201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 19131ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 19141ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer); 19152a7925c4abe45650f3ab27be09468e3a3a98084aDouglas Gregor 19162a7925c4abe45650f3ab27be09468e3a3a98084aDouglas Gregor Results.EnterNewScope(); 1917bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddOrdinaryNameResults(CompletionContext, S, *this, Results); 19182a7925c4abe45650f3ab27be09468e3a3a98084aDouglas Gregor Results.ExitScope(); 19192a7925c4abe45650f3ab27be09468e3a3a98084aDouglas Gregor 19200c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor if (CodeCompleter->includeMacros()) 1921bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddMacroResults(PP, Results); 19223a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 1923791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor} 1924791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor 192595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregorstatic void AddObjCProperties(ObjCContainerDecl *Container, 1926322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor bool AllowCategories, 192795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor DeclContext *CurContext, 192895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor ResultBuilder &Results) { 192995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor typedef CodeCompleteConsumer::Result Result; 193095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 193195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Add properties in this container. 193295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor for (ObjCContainerDecl::prop_iterator P = Container->prop_begin(), 193395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor PEnd = Container->prop_end(); 193495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor P != PEnd; 193595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor ++P) 193695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor Results.MaybeAddResult(Result(*P, 0), CurContext); 193795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 193895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Add properties in referenced protocols. 193995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) { 194095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor for (ObjCProtocolDecl::protocol_iterator P = Protocol->protocol_begin(), 194195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor PEnd = Protocol->protocol_end(); 194295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor P != PEnd; ++P) 1943322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor AddObjCProperties(*P, AllowCategories, CurContext, Results); 194495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } else if (ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container)){ 1945322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor if (AllowCategories) { 1946322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Look through categories. 1947322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor for (ObjCCategoryDecl *Category = IFace->getCategoryList(); 1948322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Category; Category = Category->getNextClassCategory()) 1949322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor AddObjCProperties(Category, AllowCategories, CurContext, Results); 1950322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor } 195195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 195295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Look through protocols. 195395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor for (ObjCInterfaceDecl::protocol_iterator I = IFace->protocol_begin(), 195495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor E = IFace->protocol_end(); 195595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor I != E; ++I) 1956322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor AddObjCProperties(*I, AllowCategories, CurContext, Results); 195795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 195895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Look in the superclass. 195995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (IFace->getSuperClass()) 1960322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor AddObjCProperties(IFace->getSuperClass(), AllowCategories, CurContext, 1961322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Results); 196295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } else if (const ObjCCategoryDecl *Category 196395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor = dyn_cast<ObjCCategoryDecl>(Container)) { 196495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Look through protocols. 196595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor for (ObjCInterfaceDecl::protocol_iterator P = Category->protocol_begin(), 196695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor PEnd = Category->protocol_end(); 196795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor P != PEnd; ++P) 1968322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor AddObjCProperties(*P, AllowCategories, CurContext, Results); 196995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } 197095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor} 197195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 197281b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregorvoid Sema::CodeCompleteMemberReferenceExpr(Scope *S, ExprTy *BaseE, 197381b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor SourceLocation OpLoc, 197481b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor bool IsArrow) { 197581b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor if (!BaseE || !CodeCompleter) 197681b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor return; 197781b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor 197886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor typedef CodeCompleteConsumer::Result Result; 197986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 198081b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor Expr *Base = static_cast<Expr *>(BaseE); 198181b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor QualType BaseType = Base->getType(); 198286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 198386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (IsArrow) { 198486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (const PointerType *Ptr = BaseType->getAs<PointerType>()) 198586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor BaseType = Ptr->getPointeeType(); 198686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor else if (BaseType->isObjCObjectPointerType()) 198786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /*Do nothing*/ ; 198886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor else 198986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return; 199086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 199186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 1992eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor ResultBuilder Results(*this, &ResultBuilder::IsMember); 199395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor Results.EnterNewScope(); 199495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (const RecordType *Record = BaseType->getAs<RecordType>()) { 199595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Access to a C/C++ class, struct, or union. 199645bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor Results.allowNestedNameSpecifiers(); 19970cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 19980cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor LookupVisibleDecls(Record->getDecl(), LookupMemberName, Consumer); 19993a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar 200095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (getLangOptions().CPlusPlus) { 200195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (!Results.empty()) { 200295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // The "template" keyword can follow "->" or "." in the grammar. 200395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // However, we only want to suggest the template keyword if something 200495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // is dependent. 200595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor bool IsDependent = BaseType->isDependentType(); 200695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (!IsDependent) { 200795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor for (Scope *DepScope = S; DepScope; DepScope = DepScope->getParent()) 200895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (DeclContext *Ctx = (DeclContext *)DepScope->getEntity()) { 200995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor IsDependent = Ctx->isDependentContext(); 201095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor break; 201195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } 201295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } 20133a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar 201495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (IsDependent) 2015bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("template")); 201686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 201795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } 201895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } else if (!IsArrow && BaseType->getAsObjCInterfacePointerType()) { 201995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Objective-C property reference. 202095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 202195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Add property results based on our interface. 202295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor const ObjCObjectPointerType *ObjCPtr 202395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor = BaseType->getAsObjCInterfacePointerType(); 202495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor assert(ObjCPtr && "Non-NULL pointer guaranteed above!"); 2025322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor AddObjCProperties(ObjCPtr->getInterfaceDecl(), true, CurContext, Results); 202695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 202795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Add properties from the protocols in a qualified interface. 202895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor for (ObjCObjectPointerType::qual_iterator I = ObjCPtr->qual_begin(), 202995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor E = ObjCPtr->qual_end(); 203095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor I != E; ++I) 2031322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor AddObjCProperties(*I, true, CurContext, Results); 203295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } else if ((IsArrow && BaseType->isObjCObjectPointerType()) || 203395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor (!IsArrow && BaseType->isObjCInterfaceType())) { 203495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Objective-C instance variable access. 203595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor ObjCInterfaceDecl *Class = 0; 203695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (const ObjCObjectPointerType *ObjCPtr 203795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor = BaseType->getAs<ObjCObjectPointerType>()) 203895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor Class = ObjCPtr->getInterfaceDecl(); 203995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor else 204095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor Class = BaseType->getAs<ObjCInterfaceType>()->getDecl(); 204195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 204295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Add all ivars from this class and its superclasses. 204395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor for (; Class; Class = Class->getSuperClass()) { 204495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor for (ObjCInterfaceDecl::ivar_iterator IVar = Class->ivar_begin(), 204595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor IVarEnd = Class->ivar_end(); 204695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor IVar != IVarEnd; ++IVar) 204795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor Results.MaybeAddResult(Result(*IVar, 0), CurContext); 204886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 204986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 205095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 205195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // FIXME: How do we cope with isa? 205295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 205395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor Results.ExitScope(); 20543a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar 20553a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar // Add macros 20563a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar if (CodeCompleter->includeMacros()) 2057bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddMacroResults(PP, Results); 20583a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar 20593a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar // Hand off the results found for code completion. 20603a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 206181b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor} 206281b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor 2063374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregorvoid Sema::CodeCompleteTag(Scope *S, unsigned TagSpec) { 2064374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor if (!CodeCompleter) 2065374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor return; 2066374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor 206786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor typedef CodeCompleteConsumer::Result Result; 206886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ResultBuilder::LookupFilter Filter = 0; 2069374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor switch ((DeclSpec::TST)TagSpec) { 2070374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor case DeclSpec::TST_enum: 207186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Filter = &ResultBuilder::IsEnum; 2072374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor break; 2073374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor 2074374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor case DeclSpec::TST_union: 207586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Filter = &ResultBuilder::IsUnion; 2076374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor break; 2077374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor 2078374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor case DeclSpec::TST_struct: 2079374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor case DeclSpec::TST_class: 208086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Filter = &ResultBuilder::IsClassOrStruct; 2081374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor break; 2082374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor 2083374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor default: 2084374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor assert(false && "Unknown type specifier kind in CodeCompleteTag"); 2085374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor return; 2086374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor } 208786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 208886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ResultBuilder Results(*this, Filter); 208945bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor Results.allowNestedNameSpecifiers(); 20905d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 20915d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor LookupVisibleDecls(S, LookupTagName, Consumer); 209286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 20930c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor if (CodeCompleter->includeMacros()) 2094bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddMacroResults(PP, Results); 20953a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 2096374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor} 2097374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor 20983e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregorvoid Sema::CodeCompleteCase(Scope *S) { 20993e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor if (getSwitchStack().empty() || !CodeCompleter) 21003e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor return; 21013e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 21023e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor SwitchStmt *Switch = getSwitchStack().back(); 21033e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor if (!Switch->getCond()->getType()->isEnumeralType()) 21043e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor return; 21053e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 21063e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // Code-complete the cases of a switch statement over an enumeration type 21073e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // by providing the list of 21083e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor EnumDecl *Enum = Switch->getCond()->getType()->getAs<EnumType>()->getDecl(); 21093e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 21103e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // Determine which enumerators we have already seen in the switch statement. 21113e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // FIXME: Ideally, we would also be able to look *past* the code-completion 21123e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // token, in case we are code-completing in the middle of the switch and not 21133e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // at the end. However, we aren't able to do so at the moment. 21143e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor llvm::SmallPtrSet<EnumConstantDecl *, 8> EnumeratorsSeen; 2115b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor NestedNameSpecifier *Qualifier = 0; 21163e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor for (SwitchCase *SC = Switch->getSwitchCaseList(); SC; 21173e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor SC = SC->getNextSwitchCase()) { 21183e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor CaseStmt *Case = dyn_cast<CaseStmt>(SC); 21193e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor if (!Case) 21203e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor continue; 21213e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 21223e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor Expr *CaseVal = Case->getLHS()->IgnoreParenCasts(); 21233e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(CaseVal)) 21243e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor if (EnumConstantDecl *Enumerator 21253e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor = dyn_cast<EnumConstantDecl>(DRE->getDecl())) { 21263e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // We look into the AST of the case statement to determine which 21273e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // enumerator was named. Alternatively, we could compute the value of 21283e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // the integral constant expression, then compare it against the 21293e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // values of each enumerator. However, value-based approach would not 21303e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // work as well with C++ templates where enumerators declared within a 21313e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // template are type- and value-dependent. 21323e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor EnumeratorsSeen.insert(Enumerator); 21333e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 2134b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // If this is a qualified-id, keep track of the nested-name-specifier 2135b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // so that we can reproduce it as part of code completion, e.g., 21363e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // 21373e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // switch (TagD.getKind()) { 21383e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // case TagDecl::TK_enum: 21393e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // break; 21403e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // case XXX 21413e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // 2142b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // At the XXX, our completions are TagDecl::TK_union, 21433e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // TagDecl::TK_struct, and TagDecl::TK_class, rather than TK_union, 21443e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // TK_struct, and TK_class. 2145a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor Qualifier = DRE->getQualifier(); 21463e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor } 21473e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor } 21483e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 2149b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor if (getLangOptions().CPlusPlus && !Qualifier && EnumeratorsSeen.empty()) { 2150b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // If there are no prior enumerators in C++, check whether we have to 2151b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // qualify the names of the enumerators that we suggest, because they 2152b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // may not be visible in this scope. 2153b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor Qualifier = getRequiredQualification(Context, CurContext, 2154b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor Enum->getDeclContext()); 2155b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor 2156b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // FIXME: Scoped enums need to start with "EnumDecl" as the context! 2157b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor } 2158b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor 21593e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // Add any enumerators that have not yet been mentioned. 21603e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor ResultBuilder Results(*this); 21613e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor Results.EnterNewScope(); 21623e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor for (EnumDecl::enumerator_iterator E = Enum->enumerator_begin(), 21633e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor EEnd = Enum->enumerator_end(); 21643e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor E != EEnd; ++E) { 21653e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor if (EnumeratorsSeen.count(*E)) 21663e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor continue; 21673e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 2168bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(CodeCompleteConsumer::Result(*E, Qualifier)); 21693e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor } 21703e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor Results.ExitScope(); 21713e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 21720c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor if (CodeCompleter->includeMacros()) 2173bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddMacroResults(PP, Results); 21743a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 21753e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor} 21763e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 21779c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregornamespace { 21789c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor struct IsBetterOverloadCandidate { 21799c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor Sema &S; 21809c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 21819c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor public: 21829c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor explicit IsBetterOverloadCandidate(Sema &S) : S(S) { } 21839c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 21849c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor bool 21859c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor operator()(const OverloadCandidate &X, const OverloadCandidate &Y) const { 21869c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor return S.isBetterOverloadCandidate(X, Y); 21879c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor } 21889c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor }; 21899c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor} 21909c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 21919c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregorvoid Sema::CodeCompleteCall(Scope *S, ExprTy *FnIn, 21929c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor ExprTy **ArgsIn, unsigned NumArgs) { 21939c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor if (!CodeCompleter) 21949c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor return; 2195ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor 2196ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor // When we're code-completing for a call, we fall back to ordinary 2197ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor // name code-completion whenever we can't produce specific 2198ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor // results. We may want to revisit this strategy in the future, 2199ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor // e.g., by merging the two kinds of results. 2200ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor 22019c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor Expr *Fn = (Expr *)FnIn; 22029c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor Expr **Args = (Expr **)ArgsIn; 2203ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor 22049c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor // Ignore type-dependent call expressions entirely. 22059c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor if (Fn->isTypeDependent() || 2206ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor Expr::hasAnyTypeDependentArguments(Args, NumArgs)) { 220701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor CodeCompleteOrdinaryName(S, CCC_Expression); 22089c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor return; 2209ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor } 22109c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 22113b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall // Build an overload candidate set based on the functions we find. 22123b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall OverloadCandidateSet CandidateSet; 22133b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall 22149c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor // FIXME: What if we're calling something that isn't a function declaration? 22159c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor // FIXME: What if we're calling a pseudo-destructor? 22169c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor // FIXME: What if we're calling a member function? 22179c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 22183b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall Expr *NakedFn = Fn->IgnoreParenCasts(); 22193b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(NakedFn)) 22203b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall AddOverloadedCallCandidates(ULE, Args, NumArgs, CandidateSet, 22213b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall /*PartialOverloading=*/ true); 22223b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall else if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(NakedFn)) { 22233b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall FunctionDecl *FDecl = dyn_cast<FunctionDecl>(DRE->getDecl()); 22243b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall if (FDecl) 22253b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall AddOverloadCandidate(FDecl, Args, NumArgs, CandidateSet, 22263b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall false, false, /*PartialOverloading*/ true); 22273b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall } 22289c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 22299c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor // Sort the overload candidate set by placing the best overloads first. 22309c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor std::stable_sort(CandidateSet.begin(), CandidateSet.end(), 22319c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor IsBetterOverloadCandidate(*this)); 22329c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 22339c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor // Add the remaining viable overload candidates as code-completion reslults. 22340594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor typedef CodeCompleteConsumer::OverloadCandidate ResultCandidate; 22350594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor llvm::SmallVector<ResultCandidate, 8> Results; 223690756300f3c8beea14b7ae0c229405981e2870c2Anders Carlsson 22379c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor for (OverloadCandidateSet::iterator Cand = CandidateSet.begin(), 22389c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor CandEnd = CandidateSet.end(); 22399c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor Cand != CandEnd; ++Cand) { 22409c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor if (Cand->Viable) 22410594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor Results.push_back(ResultCandidate(Cand->Function)); 22429c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor } 2243ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor 2244ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor if (Results.empty()) 224501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor CodeCompleteOrdinaryName(S, CCC_Expression); 2246ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor else 2247ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor CodeCompleter->ProcessOverloadCandidates(*this, NumArgs, Results.data(), 2248ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor Results.size()); 22499c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor} 22509c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 225181b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregorvoid Sema::CodeCompleteQualifiedId(Scope *S, const CXXScopeSpec &SS, 225281b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor bool EnteringContext) { 225381b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor if (!SS.getScopeRep() || !CodeCompleter) 225481b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor return; 225581b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor 225686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor DeclContext *Ctx = computeDeclContext(SS, EnteringContext); 225786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!Ctx) 225886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return; 2259d1cd31aeb806077340be94e32429f3192cf139b0Douglas Gregor 2260d1cd31aeb806077340be94e32429f3192cf139b0Douglas Gregor // Try to instantiate any non-dependent declaration contexts before 2261d1cd31aeb806077340be94e32429f3192cf139b0Douglas Gregor // we look in them. 2262d1cd31aeb806077340be94e32429f3192cf139b0Douglas Gregor if (!isDependentScopeSpecifier(SS) && RequireCompleteDeclContext(SS)) 2263d1cd31aeb806077340be94e32429f3192cf139b0Douglas Gregor return; 2264d1cd31aeb806077340be94e32429f3192cf139b0Douglas Gregor 226586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ResultBuilder Results(*this); 2266def9107059d460ada5f0eb3d58189c59122e3c3fDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 2267def9107059d460ada5f0eb3d58189c59122e3c3fDouglas Gregor LookupVisibleDecls(Ctx, LookupOrdinaryName, Consumer); 226886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 226986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // The "template" keyword can follow "::" in the grammar, but only 227086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // put it into the grammar if the nested-name-specifier is dependent. 227186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NestedNameSpecifier *NNS = (NestedNameSpecifier *)SS.getScopeRep(); 227286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!Results.empty() && NNS->isDependent()) 2273bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult("template"); 227486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 22750c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor if (CodeCompleter->includeMacros()) 2276bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddMacroResults(PP, Results); 22773a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 227881b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor} 227949f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 228049f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregorvoid Sema::CodeCompleteUsing(Scope *S) { 228149f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor if (!CodeCompleter) 228249f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor return; 228349f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 228486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ResultBuilder Results(*this, &ResultBuilder::IsNestedNameSpecifier); 22858e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.EnterNewScope(); 228686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 228786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // If we aren't in class scope, we could see the "namespace" keyword. 228886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!S->isClassScope()) 2289bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(CodeCompleteConsumer::Result("namespace")); 229086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 229186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // After "using", we can see anything that would start a 229286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // nested-name-specifier. 22935d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 22945d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer); 22958e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.ExitScope(); 229686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 22970c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor if (CodeCompleter->includeMacros()) 2298bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddMacroResults(PP, Results); 22993a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 230049f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor} 230149f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 230249f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregorvoid Sema::CodeCompleteUsingDirective(Scope *S) { 230349f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor if (!CodeCompleter) 230449f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor return; 230549f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 230686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // After "using namespace", we expect to see a namespace name or namespace 230786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // alias. 230886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ResultBuilder Results(*this, &ResultBuilder::IsNamespaceOrAlias); 23098e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.EnterNewScope(); 23105d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 23115d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer); 23128e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.ExitScope(); 23130c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor if (CodeCompleter->includeMacros()) 2314bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddMacroResults(PP, Results); 23153a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 231649f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor} 231749f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 231849f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregorvoid Sema::CodeCompleteNamespaceDecl(Scope *S) { 231949f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor if (!CodeCompleter) 232049f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor return; 232149f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 232286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ResultBuilder Results(*this, &ResultBuilder::IsNamespace); 232386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor DeclContext *Ctx = (DeclContext *)S->getEntity(); 232486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!S->getParent()) 232586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Ctx = Context.getTranslationUnitDecl(); 232686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 232786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (Ctx && Ctx->isFileContext()) { 232886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // We only want to see those namespaces that have already been defined 232986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // within this scope, because its likely that the user is creating an 233086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // extended namespace declaration. Keep track of the most recent 233186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // definition of each namespace. 233286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor std::map<NamespaceDecl *, NamespaceDecl *> OrigToLatest; 233386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor for (DeclContext::specific_decl_iterator<NamespaceDecl> 233486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NS(Ctx->decls_begin()), NSEnd(Ctx->decls_end()); 233586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NS != NSEnd; ++NS) 233686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor OrigToLatest[NS->getOriginalNamespace()] = *NS; 233786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 233886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add the most recent definition (or extended definition) of each 233986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // namespace to the list of results. 23408e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.EnterNewScope(); 234186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor for (std::map<NamespaceDecl *, NamespaceDecl *>::iterator 234286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NS = OrigToLatest.begin(), NSEnd = OrigToLatest.end(); 234386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NS != NSEnd; ++NS) 2344456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor Results.MaybeAddResult(CodeCompleteConsumer::Result(NS->second, 0), 2345456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor CurContext); 23468e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.ExitScope(); 234786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 234886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 23490c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor if (CodeCompleter->includeMacros()) 2350bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddMacroResults(PP, Results); 23513a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 235249f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor} 235349f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 235449f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregorvoid Sema::CodeCompleteNamespaceAliasDecl(Scope *S) { 235549f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor if (!CodeCompleter) 235649f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor return; 235749f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 235886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // After "namespace", we expect to see a namespace or alias. 235986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ResultBuilder Results(*this, &ResultBuilder::IsNamespaceOrAlias); 23605d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 23615d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer); 23620c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor if (CodeCompleter->includeMacros()) 2363bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddMacroResults(PP, Results); 23643a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 236549f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor} 236649f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 2367ed8d322b4086b8b1e1f78b21389cabb23457dcb3Douglas Gregorvoid Sema::CodeCompleteOperatorName(Scope *S) { 2368ed8d322b4086b8b1e1f78b21389cabb23457dcb3Douglas Gregor if (!CodeCompleter) 2369ed8d322b4086b8b1e1f78b21389cabb23457dcb3Douglas Gregor return; 237086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 237186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor typedef CodeCompleteConsumer::Result Result; 237286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ResultBuilder Results(*this, &ResultBuilder::IsType); 23738e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.EnterNewScope(); 237486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 237586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add the names of overloadable operators. 237686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 237786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (std::strcmp(Spelling, "?")) \ 2378bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Spelling)); 237986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor#include "clang/Basic/OperatorKinds.def" 238086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 238186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add any type names visible from the current scope 238245bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor Results.allowNestedNameSpecifiers(); 23835d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 23845d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer); 238586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 238686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add any type specifiers 2387bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddTypeSpecifierResults(getLangOptions(), Results); 23888e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.ExitScope(); 2389ed8d322b4086b8b1e1f78b21389cabb23457dcb3Douglas Gregor 23900c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor if (CodeCompleter->includeMacros()) 2391bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddMacroResults(PP, Results); 23923a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 2393c464ae8444edb6d07ea49b7a0eae1674c0fa1bb8Douglas Gregor} 2394c464ae8444edb6d07ea49b7a0eae1674c0fa1bb8Douglas Gregor 2395b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor// Macro that expands to @Keyword or Keyword, depending on whether NeedAt is 2396b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor// true or false. 2397b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor#define OBJC_AT_KEYWORD_NAME(NeedAt,Keyword) NeedAt? "@" #Keyword : #Keyword 2398bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCImplementationResults(const LangOptions &LangOpts, 2399b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor ResultBuilder &Results, 2400b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor bool NeedAt) { 2401c464ae8444edb6d07ea49b7a0eae1674c0fa1bb8Douglas Gregor typedef CodeCompleteConsumer::Result Result; 2402b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // Since we have an implementation, we can end it. 2403bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,end))); 2404b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 2405b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor CodeCompletionString *Pattern = 0; 2406b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor if (LangOpts.ObjC2) { 2407b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @dynamic 2408c464ae8444edb6d07ea49b7a0eae1674c0fa1bb8Douglas Gregor Pattern = new CodeCompletionString; 2409b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,dynamic)); 2410834389b87451b24618513b907b4dfb5b00d211f3Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 2411b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddPlaceholderChunk("property"); 2412bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 2413b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 2414b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @synthesize 2415c464ae8444edb6d07ea49b7a0eae1674c0fa1bb8Douglas Gregor Pattern = new CodeCompletionString; 2416b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,synthesize)); 2417834389b87451b24618513b907b4dfb5b00d211f3Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 2418b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddPlaceholderChunk("property"); 2419bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 2420b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor } 2421b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor} 2422c464ae8444edb6d07ea49b7a0eae1674c0fa1bb8Douglas Gregor 2423bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCInterfaceResults(const LangOptions &LangOpts, 2424b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor ResultBuilder &Results, 2425b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor bool NeedAt) { 2426b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor typedef CodeCompleteConsumer::Result Result; 2427b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 2428b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // Since we have an interface or protocol, we can end it. 2429bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,end))); 2430b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 2431b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor if (LangOpts.ObjC2) { 2432b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @property 2433bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,property))); 2434b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 2435b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @required 2436bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,required))); 2437b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 2438b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @optional 2439bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,optional))); 2440b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor } 2441b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor} 2442834389b87451b24618513b907b4dfb5b00d211f3Douglas Gregor 2443bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCTopLevelResults(ResultBuilder &Results, bool NeedAt) { 2444b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor typedef CodeCompleteConsumer::Result Result; 2445b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor CodeCompletionString *Pattern = 0; 2446b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 2447b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @class name ; 2448b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern = new CodeCompletionString; 2449b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,class)); 2450b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 2451b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddPlaceholderChunk("identifier"); 2452b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_SemiColon); 2453bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 2454b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 2455b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @interface name 2456b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // FIXME: Could introduce the whole pattern, including superclasses and 2457b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // such. 2458b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern = new CodeCompletionString; 2459b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,interface)); 2460b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 2461b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddPlaceholderChunk("class"); 2462bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 2463b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 2464b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @protocol name 2465b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern = new CodeCompletionString; 2466b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,protocol)); 2467b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 2468b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddPlaceholderChunk("protocol"); 2469bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 2470b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 2471b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @implementation name 2472b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern = new CodeCompletionString; 2473b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,implementation)); 2474b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 2475b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddPlaceholderChunk("class"); 2476bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 2477b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 2478b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @compatibility_alias name 2479b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern = new CodeCompletionString; 2480b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,compatibility_alias)); 2481b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 2482b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddPlaceholderChunk("alias"); 2483b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 2484b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddPlaceholderChunk("class"); 2485bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 2486b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor} 2487834389b87451b24618513b907b4dfb5b00d211f3Douglas Gregor 2488b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregorvoid Sema::CodeCompleteObjCAtDirective(Scope *S, DeclPtrTy ObjCImpDecl, 2489b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor bool InInterface) { 2490b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor typedef CodeCompleteConsumer::Result Result; 2491b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor ResultBuilder Results(*this); 2492b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Results.EnterNewScope(); 2493b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor if (ObjCImpDecl) 2494bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCImplementationResults(getLangOptions(), Results, false); 2495b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor else if (InInterface) 2496bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCInterfaceResults(getLangOptions(), Results, false); 2497b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor else 2498bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCTopLevelResults(Results, false); 2499c464ae8444edb6d07ea49b7a0eae1674c0fa1bb8Douglas Gregor Results.ExitScope(); 2500c464ae8444edb6d07ea49b7a0eae1674c0fa1bb8Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 25019a0c85e640a08174569a303db22981612f05d385Douglas Gregor} 25029a0c85e640a08174569a303db22981612f05d385Douglas Gregor 2503bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCExpressionResults(ResultBuilder &Results, bool NeedAt) { 25049a0c85e640a08174569a303db22981612f05d385Douglas Gregor typedef CodeCompleteConsumer::Result Result; 25059a0c85e640a08174569a303db22981612f05d385Douglas Gregor CodeCompletionString *Pattern = 0; 25069a0c85e640a08174569a303db22981612f05d385Douglas Gregor 25079a0c85e640a08174569a303db22981612f05d385Douglas Gregor // @encode ( type-name ) 25089a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern = new CodeCompletionString; 2509b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,encode)); 25109a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 25119a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddPlaceholderChunk("type-name"); 25129a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 2513bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 25149a0c85e640a08174569a303db22981612f05d385Douglas Gregor 25159a0c85e640a08174569a303db22981612f05d385Douglas Gregor // @protocol ( protocol-name ) 25169a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern = new CodeCompletionString; 2517b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,protocol)); 25189a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 25199a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddPlaceholderChunk("protocol-name"); 25209a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 2521bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 25229a0c85e640a08174569a303db22981612f05d385Douglas Gregor 25239a0c85e640a08174569a303db22981612f05d385Douglas Gregor // @selector ( selector ) 25249a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern = new CodeCompletionString; 2525b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,selector)); 25269a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 25279a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddPlaceholderChunk("selector"); 25289a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 2529bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 25309a0c85e640a08174569a303db22981612f05d385Douglas Gregor} 25319a0c85e640a08174569a303db22981612f05d385Douglas Gregor 2532bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCStatementResults(ResultBuilder &Results, bool NeedAt) { 25339a0c85e640a08174569a303db22981612f05d385Douglas Gregor typedef CodeCompleteConsumer::Result Result; 25349a0c85e640a08174569a303db22981612f05d385Douglas Gregor CodeCompletionString *Pattern = 0; 2535b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 25369a0c85e640a08174569a303db22981612f05d385Douglas Gregor // @try { statements } @catch ( declaration ) { statements } @finally 25379a0c85e640a08174569a303db22981612f05d385Douglas Gregor // { statements } 25389a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern = new CodeCompletionString; 2539b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,try)); 25409a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftBrace); 25419a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddPlaceholderChunk("statements"); 25429a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightBrace); 25439a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddTextChunk("@catch"); 25449a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 25459a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddPlaceholderChunk("parameter"); 25469a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 25479a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftBrace); 25489a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddPlaceholderChunk("statements"); 25499a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightBrace); 25509a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddTextChunk("@finally"); 25519a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftBrace); 25529a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddPlaceholderChunk("statements"); 25539a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightBrace); 2554bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 2555b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 25569a0c85e640a08174569a303db22981612f05d385Douglas Gregor // @throw 25579a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern = new CodeCompletionString; 2558b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,throw)); 2559834389b87451b24618513b907b4dfb5b00d211f3Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 25609a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddPlaceholderChunk("expression"); 2561834389b87451b24618513b907b4dfb5b00d211f3Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_SemiColon); 2562bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 2563b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 25649a0c85e640a08174569a303db22981612f05d385Douglas Gregor // @synchronized ( expression ) { statements } 25659a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern = new CodeCompletionString; 2566b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,synchronized)); 2567834389b87451b24618513b907b4dfb5b00d211f3Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 25689a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 25699a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddPlaceholderChunk("expression"); 25709a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 25719a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftBrace); 25729a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddPlaceholderChunk("statements"); 25739a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightBrace); 2574bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 2575b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor} 25769a0c85e640a08174569a303db22981612f05d385Douglas Gregor 2577bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCVisibilityResults(const LangOptions &LangOpts, 2578c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor ResultBuilder &Results, 2579c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor bool NeedAt) { 2580b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor typedef CodeCompleteConsumer::Result Result; 2581bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,private))); 2582bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,protected))); 2583bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,public))); 2584c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor if (LangOpts.ObjC2) 2585bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,package))); 2586c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor} 2587c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor 2588c38c3e1e726630458154534227d74eda833d26a0Douglas Gregorvoid Sema::CodeCompleteObjCAtVisibility(Scope *S) { 2589c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor ResultBuilder Results(*this); 2590c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor Results.EnterNewScope(); 2591bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCVisibilityResults(getLangOptions(), Results, false); 2592c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor Results.ExitScope(); 2593c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 2594c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor} 2595c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor 2596c38c3e1e726630458154534227d74eda833d26a0Douglas Gregorvoid Sema::CodeCompleteObjCAtStatement(Scope *S) { 2597b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor ResultBuilder Results(*this); 2598b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Results.EnterNewScope(); 2599bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCStatementResults(Results, false); 2600bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCExpressionResults(Results, false); 26019a0c85e640a08174569a303db22981612f05d385Douglas Gregor Results.ExitScope(); 26029a0c85e640a08174569a303db22981612f05d385Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 26039a0c85e640a08174569a303db22981612f05d385Douglas Gregor} 26049a0c85e640a08174569a303db22981612f05d385Douglas Gregor 26059a0c85e640a08174569a303db22981612f05d385Douglas Gregorvoid Sema::CodeCompleteObjCAtExpression(Scope *S) { 26069a0c85e640a08174569a303db22981612f05d385Douglas Gregor ResultBuilder Results(*this); 26079a0c85e640a08174569a303db22981612f05d385Douglas Gregor Results.EnterNewScope(); 2608bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCExpressionResults(Results, false); 26099a0c85e640a08174569a303db22981612f05d385Douglas Gregor Results.ExitScope(); 26109a0c85e640a08174569a303db22981612f05d385Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 2611ed8d322b4086b8b1e1f78b21389cabb23457dcb3Douglas Gregor} 261249f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 2613988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor/// \brief Determine whether the addition of the given flag to an Objective-C 2614988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor/// property's attributes will cause a conflict. 2615988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregorstatic bool ObjCPropertyFlagConflicts(unsigned Attributes, unsigned NewFlag) { 2616988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor // Check if we've already added this flag. 2617988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (Attributes & NewFlag) 2618988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor return true; 2619988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor 2620988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor Attributes |= NewFlag; 2621988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor 2622988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor // Check for collisions with "readonly". 2623988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if ((Attributes & ObjCDeclSpec::DQ_PR_readonly) && 2624988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor (Attributes & (ObjCDeclSpec::DQ_PR_readwrite | 2625988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor ObjCDeclSpec::DQ_PR_assign | 2626988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor ObjCDeclSpec::DQ_PR_copy | 2627988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor ObjCDeclSpec::DQ_PR_retain))) 2628988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor return true; 2629988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor 2630988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor // Check for more than one of { assign, copy, retain }. 2631988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor unsigned AssignCopyRetMask = Attributes & (ObjCDeclSpec::DQ_PR_assign | 2632988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor ObjCDeclSpec::DQ_PR_copy | 2633988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor ObjCDeclSpec::DQ_PR_retain); 2634988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (AssignCopyRetMask && 2635988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor AssignCopyRetMask != ObjCDeclSpec::DQ_PR_assign && 2636988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor AssignCopyRetMask != ObjCDeclSpec::DQ_PR_copy && 2637988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor AssignCopyRetMask != ObjCDeclSpec::DQ_PR_retain) 2638988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor return true; 2639988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor 2640988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor return false; 2641988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor} 2642988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor 2643a93b108e025ef2480fa867cc533e7781a40a639bDouglas Gregorvoid Sema::CodeCompleteObjCPropertyFlags(Scope *S, ObjCDeclSpec &ODS) { 2644ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff if (!CodeCompleter) 2645ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff return; 2646d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor 2647ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff unsigned Attributes = ODS.getPropertyAttributes(); 2648ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff 2649ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff typedef CodeCompleteConsumer::Result Result; 2650ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff ResultBuilder Results(*this); 2651ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff Results.EnterNewScope(); 2652988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_readonly)) 2653bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(CodeCompleteConsumer::Result("readonly")); 2654988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_assign)) 2655bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(CodeCompleteConsumer::Result("assign")); 2656988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_readwrite)) 2657bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(CodeCompleteConsumer::Result("readwrite")); 2658988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_retain)) 2659bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(CodeCompleteConsumer::Result("retain")); 2660988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_copy)) 2661bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(CodeCompleteConsumer::Result("copy")); 2662988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_nonatomic)) 2663bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(CodeCompleteConsumer::Result("nonatomic")); 2664988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_setter)) { 266554f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor CodeCompletionString *Setter = new CodeCompletionString; 266654f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor Setter->AddTypedTextChunk("setter"); 266754f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor Setter->AddTextChunk(" = "); 266854f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor Setter->AddPlaceholderChunk("method"); 2669bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(CodeCompleteConsumer::Result(Setter)); 267054f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor } 2671988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_getter)) { 267254f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor CodeCompletionString *Getter = new CodeCompletionString; 267354f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor Getter->AddTypedTextChunk("getter"); 267454f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor Getter->AddTextChunk(" = "); 267554f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor Getter->AddPlaceholderChunk("method"); 2676bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(CodeCompleteConsumer::Result(Getter)); 267754f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor } 2678ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff Results.ExitScope(); 26793a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 2680ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff} 2681c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff 26824ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor/// \brief Descripts the kind of Objective-C method that we want to find 26834ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor/// via code completion. 26844ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregorenum ObjCMethodKind { 26854ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor MK_Any, //< Any kind of method, provided it means other specified criteria. 26864ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor MK_ZeroArgSelector, //< Zero-argument (unary) selector. 26874ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor MK_OneArgSelector //< One-argument selector. 26884ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor}; 26894ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 26904ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregorstatic bool isAcceptableObjCMethod(ObjCMethodDecl *Method, 26914ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor ObjCMethodKind WantKind, 26924ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor IdentifierInfo **SelIdents, 26934ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor unsigned NumSelIdents) { 26944ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Selector Sel = Method->getSelector(); 26954ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (NumSelIdents > Sel.getNumArgs()) 26964ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor return false; 26974ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 26984ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor switch (WantKind) { 26994ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor case MK_Any: break; 27004ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor case MK_ZeroArgSelector: return Sel.isUnarySelector(); 27014ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor case MK_OneArgSelector: return Sel.getNumArgs() == 1; 27024ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor } 27034ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 27044ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor for (unsigned I = 0; I != NumSelIdents; ++I) 27054ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (SelIdents[I] != Sel.getIdentifierInfoForSlot(I)) 27064ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor return false; 27074ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 27084ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor return true; 27094ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor} 27104ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 271136ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// \brief Add all of the Objective-C methods in the given Objective-C 271236ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// container to the set of results. 271336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// 271436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// The container will be a class, protocol, category, or implementation of 271536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// any of the above. This mether will recurse to include methods from 271636ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// the superclasses of classes along with their categories, protocols, and 271736ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// implementations. 271836ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// 271936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// \param Container the container in which we'll look to find methods. 272036ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// 272136ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// \param WantInstance whether to add instance methods (only); if false, this 272236ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// routine will add factory methods (only). 272336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// 272436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// \param CurContext the context in which we're performing the lookup that 272536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// finds methods. 272636ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// 272736ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// \param Results the structure into which we'll add results. 272836ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregorstatic void AddObjCMethods(ObjCContainerDecl *Container, 272936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor bool WantInstanceMethods, 27304ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor ObjCMethodKind WantKind, 2731d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor IdentifierInfo **SelIdents, 2732d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor unsigned NumSelIdents, 273336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor DeclContext *CurContext, 273436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor ResultBuilder &Results) { 273536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor typedef CodeCompleteConsumer::Result Result; 273636ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor for (ObjCContainerDecl::method_iterator M = Container->meth_begin(), 273736ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor MEnd = Container->meth_end(); 273836ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor M != MEnd; ++M) { 2739d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor if ((*M)->isInstanceMethod() == WantInstanceMethods) { 2740d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor // Check whether the selector identifiers we've been given are a 2741d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor // subset of the identifiers for this particular method. 27424ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (!isAcceptableObjCMethod(*M, WantKind, SelIdents, NumSelIdents)) 2743d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor continue; 27444ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 2745d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor Result R = Result(*M, 0); 2746d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor R.StartParameter = NumSelIdents; 27474ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor R.AllParametersAreInformative = (WantKind != MK_Any); 2748d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor Results.MaybeAddResult(R, CurContext); 2749d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor } 275036ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor } 275136ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 275236ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container); 275336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor if (!IFace) 275436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor return; 275536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 275636ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add methods in protocols. 275736ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor const ObjCList<ObjCProtocolDecl> &Protocols= IFace->getReferencedProtocols(); 275836ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 275936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor E = Protocols.end(); 276036ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor I != E; ++I) 27614ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents, NumSelIdents, 2762d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor CurContext, Results); 276336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 276436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add methods in categories. 276536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor for (ObjCCategoryDecl *CatDecl = IFace->getCategoryList(); CatDecl; 276636ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor CatDecl = CatDecl->getNextClassCategory()) { 27674ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(CatDecl, WantInstanceMethods, WantKind, SelIdents, 27684ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor NumSelIdents, CurContext, Results); 276936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 277036ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add a categories protocol methods. 277136ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor const ObjCList<ObjCProtocolDecl> &Protocols 277236ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor = CatDecl->getReferencedProtocols(); 277336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 277436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor E = Protocols.end(); 277536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor I != E; ++I) 27764ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents, 27774ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor NumSelIdents, CurContext, Results); 277836ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 277936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add methods in category implementations. 278036ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor if (ObjCCategoryImplDecl *Impl = CatDecl->getImplementation()) 27814ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(Impl, WantInstanceMethods, WantKind, SelIdents, 27824ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor NumSelIdents, CurContext, Results); 278336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor } 278436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 278536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add methods in superclass. 278636ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor if (IFace->getSuperClass()) 27874ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(IFace->getSuperClass(), WantInstanceMethods, WantKind, 27884ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor SelIdents, NumSelIdents, CurContext, Results); 278936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 279036ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add methods in our implementation, if any. 279136ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor if (ObjCImplementationDecl *Impl = IFace->getImplementation()) 27924ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(Impl, WantInstanceMethods, WantKind, SelIdents, 27934ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor NumSelIdents, CurContext, Results); 27944ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor} 27954ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 27964ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 27974ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregorvoid Sema::CodeCompleteObjCPropertyGetter(Scope *S, DeclPtrTy ClassDecl, 27984ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor DeclPtrTy *Methods, 27994ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor unsigned NumMethods) { 28004ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor typedef CodeCompleteConsumer::Result Result; 28014ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 28024ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor // Try to find the interface where getters might live. 28034ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor ObjCInterfaceDecl *Class 28044ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor = dyn_cast_or_null<ObjCInterfaceDecl>(ClassDecl.getAs<Decl>()); 28054ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (!Class) { 28064ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (ObjCCategoryDecl *Category 28074ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor = dyn_cast_or_null<ObjCCategoryDecl>(ClassDecl.getAs<Decl>())) 28084ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Class = Category->getClassInterface(); 28094ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 28104ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (!Class) 28114ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor return; 28124ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor } 28134ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 28144ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor // Find all of the potential getters. 28154ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor ResultBuilder Results(*this); 28164ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Results.EnterNewScope(); 28174ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 28184ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor // FIXME: We need to do this because Objective-C methods don't get 28194ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor // pushed into DeclContexts early enough. Argh! 28204ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor for (unsigned I = 0; I != NumMethods; ++I) { 28214ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (ObjCMethodDecl *Method 28224ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor = dyn_cast_or_null<ObjCMethodDecl>(Methods[I].getAs<Decl>())) 28234ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (Method->isInstanceMethod() && 28244ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor isAcceptableObjCMethod(Method, MK_ZeroArgSelector, 0, 0)) { 28254ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Result R = Result(Method, 0); 28264ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor R.AllParametersAreInformative = true; 28274ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Results.MaybeAddResult(R, CurContext); 28284ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor } 28294ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor } 28304ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 28314ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(Class, true, MK_ZeroArgSelector, 0, 0, CurContext, Results); 28324ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Results.ExitScope(); 28334ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter,Results.data(),Results.size()); 28344ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor} 28354ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 28364ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregorvoid Sema::CodeCompleteObjCPropertySetter(Scope *S, DeclPtrTy ObjCImplDecl, 28374ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor DeclPtrTy *Methods, 28384ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor unsigned NumMethods) { 28394ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor typedef CodeCompleteConsumer::Result Result; 28404ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 28414ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor // Try to find the interface where setters might live. 28424ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor ObjCInterfaceDecl *Class 28434ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor = dyn_cast_or_null<ObjCInterfaceDecl>(ObjCImplDecl.getAs<Decl>()); 28444ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (!Class) { 28454ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (ObjCCategoryDecl *Category 28464ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor = dyn_cast_or_null<ObjCCategoryDecl>(ObjCImplDecl.getAs<Decl>())) 28474ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Class = Category->getClassInterface(); 28484ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 28494ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (!Class) 28504ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor return; 28514ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor } 28524ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 28534ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor // Find all of the potential getters. 28544ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor ResultBuilder Results(*this); 28554ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Results.EnterNewScope(); 28564ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 28574ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor // FIXME: We need to do this because Objective-C methods don't get 28584ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor // pushed into DeclContexts early enough. Argh! 28594ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor for (unsigned I = 0; I != NumMethods; ++I) { 28604ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (ObjCMethodDecl *Method 28614ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor = dyn_cast_or_null<ObjCMethodDecl>(Methods[I].getAs<Decl>())) 28624ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (Method->isInstanceMethod() && 28634ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor isAcceptableObjCMethod(Method, MK_OneArgSelector, 0, 0)) { 28644ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Result R = Result(Method, 0); 28654ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor R.AllParametersAreInformative = true; 28664ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Results.MaybeAddResult(R, CurContext); 28674ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor } 28684ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor } 28694ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 28704ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(Class, true, MK_OneArgSelector, 0, 0, CurContext, Results); 28714ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 28724ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Results.ExitScope(); 28734ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter,Results.data(),Results.size()); 287436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor} 287536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 287660b01cc44855d62979f76dc4cdffa4277f321049Douglas Gregorvoid Sema::CodeCompleteObjCClassMessage(Scope *S, IdentifierInfo *FName, 2877d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor SourceLocation FNameLoc, 2878d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor IdentifierInfo **SelIdents, 2879d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor unsigned NumSelIdents) { 2880c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff typedef CodeCompleteConsumer::Result Result; 288124a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor ObjCInterfaceDecl *CDecl = 0; 288224a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor 288324a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor if (FName->isStr("super")) { 288424a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor // We're sending a message to "super". 288524a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) { 288624a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor // Figure out which interface we're in. 288724a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor CDecl = CurMethod->getClassInterface(); 288824a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor if (!CDecl) 288924a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor return; 289024a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor 289124a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor // Find the superclass of this class. 289224a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor CDecl = CDecl->getSuperClass(); 289324a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor if (!CDecl) 289424a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor return; 289524a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor 289624a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor if (CurMethod->isInstanceMethod()) { 289724a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor // We are inside an instance method, which means that the message 289824a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor // send [super ...] is actually calling an instance method on the 289924a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor // current object. Build the super expression and handle this like 290024a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor // an instance method. 290124a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor QualType SuperTy = Context.getObjCInterfaceType(CDecl); 290224a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor SuperTy = Context.getObjCObjectPointerType(SuperTy); 290324a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor OwningExprResult Super 290460b01cc44855d62979f76dc4cdffa4277f321049Douglas Gregor = Owned(new (Context) ObjCSuperExpr(FNameLoc, SuperTy)); 2905d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor return CodeCompleteObjCInstanceMessage(S, (Expr *)Super.get(), 2906d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor SelIdents, NumSelIdents); 290724a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor } 290824a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor 290924a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor // Okay, we're calling a factory method in our superclass. 291024a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor } 291124a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor } 291224a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor 291324a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor // If the given name refers to an interface type, retrieve the 291424a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor // corresponding declaration. 291524a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor if (!CDecl) 291660b01cc44855d62979f76dc4cdffa4277f321049Douglas Gregor if (TypeTy *Ty = getTypeName(*FName, FNameLoc, S, 0, false)) { 291724a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor QualType T = GetTypeFromParser(Ty, 0); 291824a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor if (!T.isNull()) 291924a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor if (const ObjCInterfaceType *Interface = T->getAs<ObjCInterfaceType>()) 292024a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor CDecl = Interface->getDecl(); 292124a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor } 292224a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor 292324a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor if (!CDecl && FName->isStr("super")) { 292424a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor // "super" may be the name of a variable, in which case we are 292524a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor // probably calling an instance method. 2926f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall CXXScopeSpec SS; 2927f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall UnqualifiedId id; 2928f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall id.setIdentifier(FName, FNameLoc); 2929f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall OwningExprResult Super = ActOnIdExpression(S, SS, id, false, false); 2930d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor return CodeCompleteObjCInstanceMessage(S, (Expr *)Super.get(), 2931d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor SelIdents, NumSelIdents); 293224a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor } 293324a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor 293436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add all of the factory methods in this Objective-C class, its protocols, 293536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // superclasses, categories, implementation, etc. 2936c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff ResultBuilder Results(*this); 2937c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff Results.EnterNewScope(); 29384ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(CDecl, false, MK_Any, SelIdents, NumSelIdents, CurContext, 29394ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Results); 2940c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff Results.ExitScope(); 294136ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 2942c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff // This also suppresses remaining diagnostics. 29433a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 2944c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff} 2945c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff 2946d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregorvoid Sema::CodeCompleteObjCInstanceMessage(Scope *S, ExprTy *Receiver, 2947d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor IdentifierInfo **SelIdents, 2948d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor unsigned NumSelIdents) { 2949c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff typedef CodeCompleteConsumer::Result Result; 2950c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff 2951c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff Expr *RecExpr = static_cast<Expr *>(Receiver); 2952c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff 295336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // If necessary, apply function/array conversion to the receiver. 295436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // C99 6.7.5.3p[7,8]. 295536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor DefaultFunctionArrayConversion(RecExpr); 295636ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor QualType ReceiverType = RecExpr->getType(); 2957c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff 295836ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor if (ReceiverType->isObjCIdType() || ReceiverType->isBlockPointerType()) { 295936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // FIXME: We're messaging 'id'. Do we actually want to look up every method 296036ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // in the universe? 296136ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor return; 296236ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor } 296336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 296436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Build the set of methods we can see. 296536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor ResultBuilder Results(*this); 296636ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor Results.EnterNewScope(); 296736ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 2968f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // Handle messages to Class. This really isn't a message to an instance 2969f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // method, so we treat it the same way we would treat a message send to a 2970f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // class method. 2971f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor if (ReceiverType->isObjCClassType() || 2972f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor ReceiverType->isObjCQualifiedClassType()) { 2973f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) { 2974f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor if (ObjCInterfaceDecl *ClassDecl = CurMethod->getClassInterface()) 29754ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(ClassDecl, false, MK_Any, SelIdents, NumSelIdents, 29764ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor CurContext, Results); 2977f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor } 2978f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor } 2979f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // Handle messages to a qualified ID ("id<foo>"). 2980f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor else if (const ObjCObjectPointerType *QualID 2981f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor = ReceiverType->getAsObjCQualifiedIdType()) { 2982f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // Search protocols for instance methods. 2983f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor for (ObjCObjectPointerType::qual_iterator I = QualID->qual_begin(), 2984f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor E = QualID->qual_end(); 2985f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor I != E; ++I) 29864ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(*I, true, MK_Any, SelIdents, NumSelIdents, CurContext, 29874ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Results); 2988f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor } 2989f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // Handle messages to a pointer to interface type. 2990f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor else if (const ObjCObjectPointerType *IFacePtr 2991f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor = ReceiverType->getAsObjCInterfacePointerType()) { 2992f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // Search the class, its superclasses, etc., for instance methods. 29934ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(IFacePtr->getInterfaceDecl(), true, MK_Any, SelIdents, 29944ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor NumSelIdents, CurContext, Results); 2995f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor 2996f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // Search protocols for instance methods. 2997f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor for (ObjCObjectPointerType::qual_iterator I = IFacePtr->qual_begin(), 2998f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor E = IFacePtr->qual_end(); 2999f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor I != E; ++I) 30004ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(*I, true, MK_Any, SelIdents, NumSelIdents, CurContext, 30014ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Results); 3002f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor } 300336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 3004f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor Results.ExitScope(); 30053a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 3006c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff} 300755385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor 300855385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor/// \brief Add all of the protocol declarations that we find in the given 300955385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor/// (translation unit) context. 301055385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregorstatic void AddProtocolResults(DeclContext *Ctx, DeclContext *CurContext, 3011083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor bool OnlyForwardDeclarations, 301255385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor ResultBuilder &Results) { 301355385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor typedef CodeCompleteConsumer::Result Result; 301455385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor 301555385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor for (DeclContext::decl_iterator D = Ctx->decls_begin(), 301655385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor DEnd = Ctx->decls_end(); 301755385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor D != DEnd; ++D) { 301855385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor // Record any protocols we find. 301955385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor if (ObjCProtocolDecl *Proto = dyn_cast<ObjCProtocolDecl>(*D)) 3020083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor if (!OnlyForwardDeclarations || Proto->isForwardDecl()) 3021083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor Results.MaybeAddResult(Result(Proto, 0), CurContext); 302255385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor 302355385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor // Record any forward-declared protocols we find. 302455385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor if (ObjCForwardProtocolDecl *Forward 302555385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor = dyn_cast<ObjCForwardProtocolDecl>(*D)) { 302655385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor for (ObjCForwardProtocolDecl::protocol_iterator 302755385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor P = Forward->protocol_begin(), 302855385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor PEnd = Forward->protocol_end(); 302955385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor P != PEnd; ++P) 3030083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor if (!OnlyForwardDeclarations || (*P)->isForwardDecl()) 3031083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor Results.MaybeAddResult(Result(*P, 0), CurContext); 303255385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor } 303355385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor } 303455385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor} 303555385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor 303655385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregorvoid Sema::CodeCompleteObjCProtocolReferences(IdentifierLocPair *Protocols, 303755385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor unsigned NumProtocols) { 303855385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor ResultBuilder Results(*this); 303955385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor Results.EnterNewScope(); 304055385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor 304155385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor // Tell the result set to ignore all of the protocols we have 304255385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor // already seen. 304355385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor for (unsigned I = 0; I != NumProtocols; ++I) 304455385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor if (ObjCProtocolDecl *Protocol = LookupProtocol(Protocols[I].first)) 304555385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor Results.Ignore(Protocol); 304655385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor 304755385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor // Add all protocols. 3048083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor AddProtocolResults(Context.getTranslationUnitDecl(), CurContext, false, 3049083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor Results); 3050083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor 3051083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor Results.ExitScope(); 3052083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 3053083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor} 3054083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor 3055083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregorvoid Sema::CodeCompleteObjCProtocolDecl(Scope *) { 3056083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor ResultBuilder Results(*this); 3057083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor Results.EnterNewScope(); 3058083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor 3059083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor // Add all protocols. 3060083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor AddProtocolResults(Context.getTranslationUnitDecl(), CurContext, true, 3061083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor Results); 306255385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor 306355385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor Results.ExitScope(); 306455385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 306555385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor} 30663b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 30673b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor/// \brief Add all of the Objective-C interface declarations that we find in 30683b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor/// the given (translation unit) context. 30693b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregorstatic void AddInterfaceResults(DeclContext *Ctx, DeclContext *CurContext, 30703b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor bool OnlyForwardDeclarations, 30713b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor bool OnlyUnimplemented, 30723b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor ResultBuilder &Results) { 30733b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor typedef CodeCompleteConsumer::Result Result; 30743b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 30753b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor for (DeclContext::decl_iterator D = Ctx->decls_begin(), 30763b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor DEnd = Ctx->decls_end(); 30773b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor D != DEnd; ++D) { 30783b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor // Record any interfaces we find. 30793b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor if (ObjCInterfaceDecl *Class = dyn_cast<ObjCInterfaceDecl>(*D)) 30803b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor if ((!OnlyForwardDeclarations || Class->isForwardDecl()) && 30813b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor (!OnlyUnimplemented || !Class->getImplementation())) 30823b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.MaybeAddResult(Result(Class, 0), CurContext); 30833b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 30843b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor // Record any forward-declared interfaces we find. 30853b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor if (ObjCClassDecl *Forward = dyn_cast<ObjCClassDecl>(*D)) { 30863b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor for (ObjCClassDecl::iterator C = Forward->begin(), CEnd = Forward->end(); 30873b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor C != CEnd; ++C) 30883b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor if ((!OnlyForwardDeclarations || C->getInterface()->isForwardDecl()) && 30893b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor (!OnlyUnimplemented || !C->getInterface()->getImplementation())) 30903b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.MaybeAddResult(Result(C->getInterface(), 0), CurContext); 30913b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor } 30923b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor } 30933b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor} 30943b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 30953b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregorvoid Sema::CodeCompleteObjCInterfaceDecl(Scope *S) { 30963b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor ResultBuilder Results(*this); 30973b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.EnterNewScope(); 30983b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 30993b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor // Add all classes. 31003b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, true, 31013b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor false, Results); 31023b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 31033b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.ExitScope(); 31043b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 31053b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor} 31063b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 31073b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregorvoid Sema::CodeCompleteObjCSuperclass(Scope *S, IdentifierInfo *ClassName) { 31083b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor ResultBuilder Results(*this); 31093b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.EnterNewScope(); 31103b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 31113b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor // Make sure that we ignore the class we're currently defining. 31123b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor NamedDecl *CurClass 31133b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor = LookupSingleName(TUScope, ClassName, LookupOrdinaryName); 311433ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor if (CurClass && isa<ObjCInterfaceDecl>(CurClass)) 31153b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.Ignore(CurClass); 31163b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 31173b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor // Add all classes. 31183b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false, 31193b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor false, Results); 31203b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 31213b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.ExitScope(); 31223b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 31233b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor} 31243b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 31253b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregorvoid Sema::CodeCompleteObjCImplementationDecl(Scope *S) { 31263b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor ResultBuilder Results(*this); 31273b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.EnterNewScope(); 31283b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 31293b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor // Add all unimplemented classes. 31303b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false, 31313b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor true, Results); 31323b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 31333b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.ExitScope(); 31343b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 31353b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor} 313633ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 313733ced0b8550f3e7169f326944731ee02e9338659Douglas Gregorvoid Sema::CodeCompleteObjCInterfaceCategory(Scope *S, 313833ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor IdentifierInfo *ClassName) { 313933ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor typedef CodeCompleteConsumer::Result Result; 314033ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 314133ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor ResultBuilder Results(*this); 314233ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 314333ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // Ignore any categories we find that have already been implemented by this 314433ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // interface. 314533ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor llvm::SmallPtrSet<IdentifierInfo *, 16> CategoryNames; 314633ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor NamedDecl *CurClass 314733ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor = LookupSingleName(TUScope, ClassName, LookupOrdinaryName); 314833ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor if (ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurClass)) 314933ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor for (ObjCCategoryDecl *Category = Class->getCategoryList(); Category; 315033ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Category = Category->getNextClassCategory()) 315133ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor CategoryNames.insert(Category->getIdentifier()); 315233ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 315333ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // Add all of the categories we know about. 315433ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Results.EnterNewScope(); 315533ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor TranslationUnitDecl *TU = Context.getTranslationUnitDecl(); 315633ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor for (DeclContext::decl_iterator D = TU->decls_begin(), 315733ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor DEnd = TU->decls_end(); 315833ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor D != DEnd; ++D) 315933ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(*D)) 316033ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor if (CategoryNames.insert(Category->getIdentifier())) 316133ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Results.MaybeAddResult(Result(Category, 0), CurContext); 316233ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Results.ExitScope(); 316333ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 316433ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 316533ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor} 316633ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 316733ced0b8550f3e7169f326944731ee02e9338659Douglas Gregorvoid Sema::CodeCompleteObjCImplementationCategory(Scope *S, 316833ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor IdentifierInfo *ClassName) { 316933ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor typedef CodeCompleteConsumer::Result Result; 317033ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 317133ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // Find the corresponding interface. If we couldn't find the interface, the 317233ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // program itself is ill-formed. However, we'll try to be helpful still by 317333ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // providing the list of all of the categories we know about. 317433ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor NamedDecl *CurClass 317533ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor = LookupSingleName(TUScope, ClassName, LookupOrdinaryName); 317633ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurClass); 317733ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor if (!Class) 317833ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor return CodeCompleteObjCInterfaceCategory(S, ClassName); 317933ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 318033ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor ResultBuilder Results(*this); 318133ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 318233ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // Add all of the categories that have have corresponding interface 318333ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // declarations in this class and any of its superclasses, except for 318433ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // already-implemented categories in the class itself. 318533ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor llvm::SmallPtrSet<IdentifierInfo *, 16> CategoryNames; 318633ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Results.EnterNewScope(); 318733ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor bool IgnoreImplemented = true; 318833ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor while (Class) { 318933ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor for (ObjCCategoryDecl *Category = Class->getCategoryList(); Category; 319033ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Category = Category->getNextClassCategory()) 319133ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor if ((!IgnoreImplemented || !Category->getImplementation()) && 319233ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor CategoryNames.insert(Category->getIdentifier())) 319333ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Results.MaybeAddResult(Result(Category, 0), CurContext); 319433ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 319533ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Class = Class->getSuperClass(); 319633ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor IgnoreImplemented = false; 319733ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor } 319833ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Results.ExitScope(); 319933ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 320033ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 320133ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor} 3202322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 3203424b2a546dbd09cf70d43087771c7fff851ca158Douglas Gregorvoid Sema::CodeCompleteObjCPropertyDefinition(Scope *S, DeclPtrTy ObjCImpDecl) { 3204322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor typedef CodeCompleteConsumer::Result Result; 3205322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor ResultBuilder Results(*this); 3206322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 3207322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Figure out where this @synthesize lives. 3208322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor ObjCContainerDecl *Container 3209322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor = dyn_cast_or_null<ObjCContainerDecl>(ObjCImpDecl.getAs<Decl>()); 3210322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor if (!Container || 3211322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor (!isa<ObjCImplementationDecl>(Container) && 3212322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor !isa<ObjCCategoryImplDecl>(Container))) 3213322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor return; 3214322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 3215322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Ignore any properties that have already been implemented. 3216322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor for (DeclContext::decl_iterator D = Container->decls_begin(), 3217322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor DEnd = Container->decls_end(); 3218322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor D != DEnd; ++D) 3219322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor if (ObjCPropertyImplDecl *PropertyImpl = dyn_cast<ObjCPropertyImplDecl>(*D)) 3220322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Results.Ignore(PropertyImpl->getPropertyDecl()); 3221322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 3222322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Add any properties that we find. 3223322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Results.EnterNewScope(); 3224322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor if (ObjCImplementationDecl *ClassImpl 3225322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor = dyn_cast<ObjCImplementationDecl>(Container)) 3226322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor AddObjCProperties(ClassImpl->getClassInterface(), false, CurContext, 3227322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Results); 3228322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor else 3229322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor AddObjCProperties(cast<ObjCCategoryImplDecl>(Container)->getCategoryDecl(), 3230322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor false, CurContext, Results); 3231322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Results.ExitScope(); 3232322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 3233322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 3234322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor} 3235322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 3236322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregorvoid Sema::CodeCompleteObjCPropertySynthesizeIvar(Scope *S, 3237322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor IdentifierInfo *PropertyName, 3238322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor DeclPtrTy ObjCImpDecl) { 3239322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor typedef CodeCompleteConsumer::Result Result; 3240322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor ResultBuilder Results(*this); 3241322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 3242322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Figure out where this @synthesize lives. 3243322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor ObjCContainerDecl *Container 3244322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor = dyn_cast_or_null<ObjCContainerDecl>(ObjCImpDecl.getAs<Decl>()); 3245322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor if (!Container || 3246322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor (!isa<ObjCImplementationDecl>(Container) && 3247322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor !isa<ObjCCategoryImplDecl>(Container))) 3248322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor return; 3249322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 3250322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Figure out which interface we're looking into. 3251322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor ObjCInterfaceDecl *Class = 0; 3252322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor if (ObjCImplementationDecl *ClassImpl 3253322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor = dyn_cast<ObjCImplementationDecl>(Container)) 3254322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Class = ClassImpl->getClassInterface(); 3255322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor else 3256322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Class = cast<ObjCCategoryImplDecl>(Container)->getCategoryDecl() 3257322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor ->getClassInterface(); 3258322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 3259322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Add all of the instance variables in this class and its superclasses. 3260322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Results.EnterNewScope(); 3261322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor for(; Class; Class = Class->getSuperClass()) { 3262322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // FIXME: We could screen the type of each ivar for compatibility with 3263322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // the property, but is that being too paternal? 3264322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor for (ObjCInterfaceDecl::ivar_iterator IVar = Class->ivar_begin(), 3265322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor IVarEnd = Class->ivar_end(); 3266322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor IVar != IVarEnd; ++IVar) 3267322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Results.MaybeAddResult(Result(*IVar, 0), CurContext); 3268322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor } 3269322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Results.ExitScope(); 3270322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 3271322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 3272322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor} 3273