SemaCodeComplete.cpp revision 84139d6ef8967cfdb70d37378a7a65cc4827d44d
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 187a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor /// \brief Add a new non-declaration result to this result set. 188a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor void AddResult(Result R); 189a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor 19086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \brief Enter into a new scope. 19186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor void EnterNewScope(); 19286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 19386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \brief Exit from the current scope. 19486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor void ExitScope(); 19586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 19655385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor /// \brief Ignore this declaration, if it is seen again. 19755385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor void Ignore(Decl *D) { AllDeclsFound.insert(D->getCanonicalDecl()); } 19855385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor 19986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \name Name lookup predicates 20086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// 20186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// These predicates can be passed to the name lookup functions to filter the 20286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// results of name lookup. All of the predicates have the same type, so that 20386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// 20486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor //@{ 205791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor bool IsOrdinaryName(NamedDecl *ND) const; 20601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor bool IsOrdinaryNonValueName(NamedDecl *ND) const; 20786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool IsNestedNameSpecifier(NamedDecl *ND) const; 20886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool IsEnum(NamedDecl *ND) const; 20986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool IsClassOrStruct(NamedDecl *ND) const; 21086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool IsUnion(NamedDecl *ND) const; 21186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool IsNamespace(NamedDecl *ND) const; 21286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool IsNamespaceOrAlias(NamedDecl *ND) const; 21386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool IsType(NamedDecl *ND) const; 214eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor bool IsMember(NamedDecl *ND) const; 21580f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor bool IsObjCIvar(NamedDecl *ND) const; 21686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor //@} 21786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor }; 21886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 21986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 220fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregorclass ResultBuilder::ShadowMapEntry::iterator { 221fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor llvm::PointerUnion<NamedDecl*, const DeclIndexPair*> DeclOrIterator; 222fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor unsigned SingleDeclIndex; 223fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 224fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregorpublic: 225fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor typedef DeclIndexPair value_type; 226fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor typedef value_type reference; 227fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor typedef std::ptrdiff_t difference_type; 228fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor typedef std::input_iterator_tag iterator_category; 229fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 230fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor class pointer { 231fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor DeclIndexPair Value; 232fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 233fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor public: 234fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor pointer(const DeclIndexPair &Value) : Value(Value) { } 235fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 236fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor const DeclIndexPair *operator->() const { 237fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return &Value; 238fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 239fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor }; 240fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 241fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor iterator() : DeclOrIterator((NamedDecl *)0), SingleDeclIndex(0) { } 242fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 243fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor iterator(NamedDecl *SingleDecl, unsigned Index) 244fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor : DeclOrIterator(SingleDecl), SingleDeclIndex(Index) { } 245fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 246fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor iterator(const DeclIndexPair *Iterator) 247fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor : DeclOrIterator(Iterator), SingleDeclIndex(0) { } 248fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 249fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor iterator &operator++() { 250fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (DeclOrIterator.is<NamedDecl *>()) { 251fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor DeclOrIterator = (NamedDecl *)0; 252fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor SingleDeclIndex = 0; 253fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return *this; 254fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 255fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 256fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor const DeclIndexPair *I = DeclOrIterator.get<const DeclIndexPair*>(); 257fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ++I; 258fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor DeclOrIterator = I; 259fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return *this; 260fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 261fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 262fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor iterator operator++(int) { 263fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor iterator tmp(*this); 264fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ++(*this); 265fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return tmp; 266fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 267fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 268fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor reference operator*() const { 269fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (NamedDecl *ND = DeclOrIterator.dyn_cast<NamedDecl *>()) 270fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return reference(ND, SingleDeclIndex); 271fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 272d490f953e812a9bb1729637cc70a6db7d997ced0Douglas Gregor return *DeclOrIterator.get<const DeclIndexPair*>(); 273fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 274fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 275fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor pointer operator->() const { 276fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return pointer(**this); 277fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 278fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 279fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor friend bool operator==(const iterator &X, const iterator &Y) { 280d490f953e812a9bb1729637cc70a6db7d997ced0Douglas Gregor return X.DeclOrIterator.getOpaqueValue() 281d490f953e812a9bb1729637cc70a6db7d997ced0Douglas Gregor == Y.DeclOrIterator.getOpaqueValue() && 282fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor X.SingleDeclIndex == Y.SingleDeclIndex; 283fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 284fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 285fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor friend bool operator!=(const iterator &X, const iterator &Y) { 286d490f953e812a9bb1729637cc70a6db7d997ced0Douglas Gregor return !(X == Y); 287fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 288fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor}; 289fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 290fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas GregorResultBuilder::ShadowMapEntry::iterator 291fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas GregorResultBuilder::ShadowMapEntry::begin() const { 292fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (DeclOrVector.isNull()) 293fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return iterator(); 294fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 295fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (NamedDecl *ND = DeclOrVector.dyn_cast<NamedDecl *>()) 296fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return iterator(ND, SingleDeclIndex); 297fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 298fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return iterator(DeclOrVector.get<DeclIndexPairVector *>()->begin()); 299fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor} 300fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 301fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas GregorResultBuilder::ShadowMapEntry::iterator 302fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas GregorResultBuilder::ShadowMapEntry::end() const { 303fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (DeclOrVector.is<NamedDecl *>() || DeclOrVector.isNull()) 304fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return iterator(); 305fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 306fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return iterator(DeclOrVector.get<DeclIndexPairVector *>()->end()); 307fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor} 308fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 309456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// \brief Compute the qualification required to get from the current context 310456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// (\p CurContext) to the target context (\p TargetContext). 311456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// 312456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// \param Context the AST context in which the qualification will be used. 313456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// 314456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// \param CurContext the context where an entity is being named, which is 315456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// typically based on the current scope. 316456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// 317456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// \param TargetContext the context in which the named entity actually 318456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// resides. 319456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// 320456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// \returns a nested name specifier that refers into the target context, or 321456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// NULL if no qualification is needed. 322456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregorstatic NestedNameSpecifier * 323456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas GregorgetRequiredQualification(ASTContext &Context, 324456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor DeclContext *CurContext, 325456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor DeclContext *TargetContext) { 326456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor llvm::SmallVector<DeclContext *, 4> TargetParents; 327456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor 328456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor for (DeclContext *CommonAncestor = TargetContext; 329456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor CommonAncestor && !CommonAncestor->Encloses(CurContext); 330456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor CommonAncestor = CommonAncestor->getLookupParent()) { 331456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor if (CommonAncestor->isTransparentContext() || 332456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor CommonAncestor->isFunctionOrMethod()) 333456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor continue; 334456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor 335456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor TargetParents.push_back(CommonAncestor); 336456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor } 337456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor 338456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor NestedNameSpecifier *Result = 0; 339456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor while (!TargetParents.empty()) { 340456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor DeclContext *Parent = TargetParents.back(); 341456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor TargetParents.pop_back(); 342456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor 343456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor if (NamespaceDecl *Namespace = dyn_cast<NamespaceDecl>(Parent)) 344456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor Result = NestedNameSpecifier::Create(Context, Result, Namespace); 345456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor else if (TagDecl *TD = dyn_cast<TagDecl>(Parent)) 346456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor Result = NestedNameSpecifier::Create(Context, Result, 347456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor false, 348456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor Context.getTypeDeclType(TD).getTypePtr()); 349456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor else 350456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor assert(Parent->isTranslationUnit()); 3510c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor } 352456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor return Result; 353456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor} 354456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor 35545bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregorbool ResultBuilder::isInterestingDecl(NamedDecl *ND, 35645bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor bool &AsNestedNameSpecifier) const { 35745bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor AsNestedNameSpecifier = false; 35845bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor 359e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor ND = ND->getUnderlyingDecl(); 360e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor unsigned IDNS = ND->getIdentifierNamespace(); 361f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor 362f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor // Skip unnamed entities. 363e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor if (!ND->getDeclName()) 364e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return false; 36586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 36686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Friend declarations and declarations introduced due to friends are never 36786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // added as results. 36892b7f70c924cbf4514e9e434cea7def51ab49860John McCall if (IDNS & (Decl::IDNS_OrdinaryFriend | Decl::IDNS_TagFriend)) 369e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return false; 370e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 3717628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor // Class template (partial) specializations are never added as results. 372e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor if (isa<ClassTemplateSpecializationDecl>(ND) || 373e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor isa<ClassTemplatePartialSpecializationDecl>(ND)) 374e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return false; 37586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 3767628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor // Using declarations themselves are never added as results. 377e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor if (isa<UsingDecl>(ND)) 378e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return false; 379e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 380e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor // Some declarations have reserved names that we don't want to ever show. 381e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor if (const IdentifierInfo *Id = ND->getIdentifier()) { 38286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // __va_list_tag is a freak of nature. Find it and skip it. 38386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (Id->isStr("__va_list_tag") || Id->isStr("__builtin_va_list")) 384e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return false; 38586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 386f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor // Filter out names reserved for the implementation (C99 7.1.3, 387f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor // C++ [lib.global.names]). Users don't need to see those. 388e013d685c6689ac7ae103ee88acf573422d1ed6aDaniel Dunbar // 389e013d685c6689ac7ae103ee88acf573422d1ed6aDaniel Dunbar // FIXME: Add predicate for this. 390f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor if (Id->getLength() >= 2) { 391e013d685c6689ac7ae103ee88acf573422d1ed6aDaniel Dunbar const char *Name = Id->getNameStart(); 392f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor if (Name[0] == '_' && 393f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor (Name[1] == '_' || (Name[1] >= 'A' && Name[1] <= 'Z'))) 394e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return false; 395f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor } 39686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 397e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 39886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // C++ constructors are never found by name lookup. 399e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor if (isa<CXXConstructorDecl>(ND)) 400e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return false; 40186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 40286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Filter out any unwanted results. 40345bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor if (Filter && !(this->*Filter)(ND)) { 40445bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor // Check whether it is interesting as a nested-name-specifier. 40545bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor if (AllowNestedNameSpecifiers && SemaRef.getLangOptions().CPlusPlus && 40645bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor IsNestedNameSpecifier(ND) && 40745bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor (Filter != &ResultBuilder::IsMember || 40845bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor (isa<CXXRecordDecl>(ND) && 40945bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor cast<CXXRecordDecl>(ND)->isInjectedClassName()))) { 41045bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor AsNestedNameSpecifier = true; 41145bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor return true; 41245bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor } 41345bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor 414e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return false; 41545bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor } 416e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 417e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor // ... then it must be interesting! 418e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return true; 419e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor} 420e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 4216660d845af8edb99098a08cf2539233a3be650b3Douglas Gregorbool ResultBuilder::CheckHiddenResult(Result &R, DeclContext *CurContext, 4226660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor NamedDecl *Hiding) { 4236660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor // In C, there is no way to refer to a hidden name. 4246660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor // FIXME: This isn't true; we can find a tag name hidden by an ordinary 4256660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor // name if we introduce the tag type. 4266660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor if (!SemaRef.getLangOptions().CPlusPlus) 4276660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor return true; 4286660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor 4296660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor DeclContext *HiddenCtx = R.Declaration->getDeclContext()->getLookupContext(); 4306660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor 4316660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor // There is no way to qualify a name declared in a function or method. 4326660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor if (HiddenCtx->isFunctionOrMethod()) 4336660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor return true; 4346660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor 4356660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor if (HiddenCtx == Hiding->getDeclContext()->getLookupContext()) 4366660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor return true; 4376660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor 4386660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor // We can refer to the result with the appropriate qualification. Do it. 4396660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor R.Hidden = true; 4406660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor R.QualifierIsInformative = false; 4416660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor 4426660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor if (!R.Qualifier) 4436660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor R.Qualifier = getRequiredQualification(SemaRef.Context, 4446660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor CurContext, 4456660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor R.Declaration->getDeclContext()); 4466660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor return false; 4476660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor} 4486660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor 449e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregorvoid ResultBuilder::MaybeAddResult(Result R, DeclContext *CurContext) { 450e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor assert(!ShadowMaps.empty() && "Must enter into a results scope"); 451e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 452e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor if (R.Kind != Result::RK_Declaration) { 453e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor // For non-declaration results, just add the result. 454e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor Results.push_back(R); 455e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return; 456e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor } 457e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 458e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor // Look through using declarations. 459e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor if (UsingShadowDecl *Using = dyn_cast<UsingShadowDecl>(R.Declaration)) { 460e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor MaybeAddResult(Result(Using->getTargetDecl(), R.Qualifier), CurContext); 46186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return; 462e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor } 46386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 464e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor Decl *CanonDecl = R.Declaration->getCanonicalDecl(); 465e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor unsigned IDNS = CanonDecl->getIdentifierNamespace(); 466e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 46745bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor bool AsNestedNameSpecifier = false; 46845bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor if (!isInterestingDecl(R.Declaration, AsNestedNameSpecifier)) 469e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return; 470e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 47186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ShadowMap &SMap = ShadowMaps.back(); 472fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ShadowMapEntry::iterator I, IEnd; 473fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ShadowMap::iterator NamePos = SMap.find(R.Declaration->getDeclName()); 474fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (NamePos != SMap.end()) { 475fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor I = NamePos->second.begin(); 476fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor IEnd = NamePos->second.end(); 477fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 478fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 479fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor for (; I != IEnd; ++I) { 480fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor NamedDecl *ND = I->first; 481fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor unsigned Index = I->second; 48286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (ND->getCanonicalDecl() == CanonDecl) { 48386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // This is a redeclaration. Always pick the newer declaration. 48486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Results[Index].Declaration = R.Declaration; 48586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 48686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // We're done. 48786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return; 48886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 48986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 49086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 49186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // This is a new declaration in this scope. However, check whether this 49286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // declaration name is hidden by a similarly-named declaration in an outer 49386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // scope. 49486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor std::list<ShadowMap>::iterator SM, SMEnd = ShadowMaps.end(); 49586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor --SMEnd; 49686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor for (SM = ShadowMaps.begin(); SM != SMEnd; ++SM) { 497fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ShadowMapEntry::iterator I, IEnd; 498fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ShadowMap::iterator NamePos = SM->find(R.Declaration->getDeclName()); 499fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (NamePos != SM->end()) { 500fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor I = NamePos->second.begin(); 501fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor IEnd = NamePos->second.end(); 502fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 503fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor for (; I != IEnd; ++I) { 50486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // A tag declaration does not hide a non-tag declaration. 505fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (I->first->getIdentifierNamespace() == Decl::IDNS_Tag && 50686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor (IDNS & (Decl::IDNS_Member | Decl::IDNS_Ordinary | 50786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Decl::IDNS_ObjCProtocol))) 50886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor continue; 50986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 51086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Protocols are in distinct namespaces from everything else. 511fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (((I->first->getIdentifierNamespace() & Decl::IDNS_ObjCProtocol) 51286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor || (IDNS & Decl::IDNS_ObjCProtocol)) && 513fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor I->first->getIdentifierNamespace() != IDNS) 51486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor continue; 51586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 51686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // The newly-added result is hidden by an entry in the shadow map. 5176660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor if (CheckHiddenResult(R, CurContext, I->first)) 51886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return; 51986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 52086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor break; 52186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 52286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 52386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 52486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Make sure that any given declaration only shows up in the result set once. 52586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!AllDeclsFound.insert(CanonDecl)) 52686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return; 52786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 528eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor // If the filter is for nested-name-specifiers, then this result starts a 529eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor // nested-name-specifier. 53045bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor if (AsNestedNameSpecifier) 531eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor R.StartsNestedNameSpecifier = true; 532eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor 5330563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor // If this result is supposed to have an informative qualifier, add one. 534eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor if (R.QualifierIsInformative && !R.Qualifier && 535eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor !R.StartsNestedNameSpecifier) { 5360563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor DeclContext *Ctx = R.Declaration->getDeclContext(); 5370563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor if (NamespaceDecl *Namespace = dyn_cast<NamespaceDecl>(Ctx)) 5380563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor R.Qualifier = NestedNameSpecifier::Create(SemaRef.Context, 0, Namespace); 5390563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor else if (TagDecl *Tag = dyn_cast<TagDecl>(Ctx)) 5400563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor R.Qualifier = NestedNameSpecifier::Create(SemaRef.Context, 0, false, 5410563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor SemaRef.Context.getTypeDeclType(Tag).getTypePtr()); 5420563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor else 5430563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor R.QualifierIsInformative = false; 5440563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor } 545eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor 54686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Insert this result into the set of results and into the current shadow 54786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // map. 548fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor SMap[R.Declaration->getDeclName()].Add(R.Declaration, Results.size()); 54986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Results.push_back(R); 55086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 55186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 5521ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregorvoid ResultBuilder::AddResult(Result R, DeclContext *CurContext, 5530cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor NamedDecl *Hiding, bool InBaseClass = false) { 554a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor if (R.Kind != Result::RK_Declaration) { 555a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor // For non-declaration results, just add the result. 556a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.push_back(R); 557a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor return; 558a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor } 559a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor 5601ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor // Look through using declarations. 5611ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor if (UsingShadowDecl *Using = dyn_cast<UsingShadowDecl>(R.Declaration)) { 5621ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor AddResult(Result(Using->getTargetDecl(), R.Qualifier), CurContext, Hiding); 5631ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor return; 5641ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor } 5651ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 56645bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor bool AsNestedNameSpecifier = false; 56745bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor if (!isInterestingDecl(R.Declaration, AsNestedNameSpecifier)) 5681ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor return; 5691ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 5701ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor if (Hiding && CheckHiddenResult(R, CurContext, Hiding)) 5711ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor return; 5721ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 5731ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor // Make sure that any given declaration only shows up in the result set once. 5741ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor if (!AllDeclsFound.insert(R.Declaration->getCanonicalDecl())) 5751ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor return; 5761ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 5771ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor // If the filter is for nested-name-specifiers, then this result starts a 5781ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor // nested-name-specifier. 57945bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor if (AsNestedNameSpecifier) 5801ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor R.StartsNestedNameSpecifier = true; 5810cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor else if (Filter == &ResultBuilder::IsMember && !R.Qualifier && InBaseClass && 5820cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor isa<CXXRecordDecl>(R.Declaration->getDeclContext() 5830cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor ->getLookupContext())) 5840cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor R.QualifierIsInformative = true; 5850cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor 5861ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor // If this result is supposed to have an informative qualifier, add one. 5871ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor if (R.QualifierIsInformative && !R.Qualifier && 5881ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor !R.StartsNestedNameSpecifier) { 5891ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor DeclContext *Ctx = R.Declaration->getDeclContext(); 5901ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor if (NamespaceDecl *Namespace = dyn_cast<NamespaceDecl>(Ctx)) 5911ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor R.Qualifier = NestedNameSpecifier::Create(SemaRef.Context, 0, Namespace); 5921ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor else if (TagDecl *Tag = dyn_cast<TagDecl>(Ctx)) 5931ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor R.Qualifier = NestedNameSpecifier::Create(SemaRef.Context, 0, false, 59445bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor SemaRef.Context.getTypeDeclType(Tag).getTypePtr()); 5951ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor else 5961ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor R.QualifierIsInformative = false; 5971ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor } 5981ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 5991ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor // Insert this result into the set of results. 6001ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor Results.push_back(R); 6011ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor} 6021ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 603a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregorvoid ResultBuilder::AddResult(Result R) { 604a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor assert(R.Kind != Result::RK_Declaration && 605a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor "Declaration results need more context"); 606a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.push_back(R); 607a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor} 608a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor 60986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Enter into a new scope. 61086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorvoid ResultBuilder::EnterNewScope() { 61186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ShadowMaps.push_back(ShadowMap()); 61286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 61386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 61486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Exit from the current scope. 61586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorvoid ResultBuilder::ExitScope() { 616fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor for (ShadowMap::iterator E = ShadowMaps.back().begin(), 617fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor EEnd = ShadowMaps.back().end(); 618fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor E != EEnd; 619fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ++E) 620fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor E->second.Destroy(); 621fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 62286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ShadowMaps.pop_back(); 62386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 62486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 625791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor/// \brief Determines whether this given declaration will be found by 626791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor/// ordinary name lookup. 627791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregorbool ResultBuilder::IsOrdinaryName(NamedDecl *ND) const { 628791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor unsigned IDNS = Decl::IDNS_Ordinary; 629791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus) 630791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor IDNS |= Decl::IDNS_Tag; 6311ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor else if (SemaRef.getLangOptions().ObjC1 && isa<ObjCIvarDecl>(ND)) 6321ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor return true; 6331ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 634791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor return ND->getIdentifierNamespace() & IDNS; 635791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor} 636791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor 63701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor/// \brief Determines whether this given declaration will be found by 63801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor/// ordinary name lookup. 63901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregorbool ResultBuilder::IsOrdinaryNonValueName(NamedDecl *ND) const { 64001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor unsigned IDNS = Decl::IDNS_Ordinary; 64101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus) 64201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor IDNS |= Decl::IDNS_Tag; 64301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 64401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor return (ND->getIdentifierNamespace() & IDNS) && 64501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor !isa<ValueDecl>(ND) && !isa<FunctionTemplateDecl>(ND); 64601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor} 64701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 64886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Determines whether the given declaration is suitable as the 64986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// start of a C++ nested-name-specifier, e.g., a class or namespace. 65086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsNestedNameSpecifier(NamedDecl *ND) const { 65186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Allow us to find class templates, too. 65286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (ClassTemplateDecl *ClassTemplate = dyn_cast<ClassTemplateDecl>(ND)) 65386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ND = ClassTemplate->getTemplatedDecl(); 65486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 65586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return SemaRef.isAcceptableNestedNameSpecifier(ND); 65686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 65786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 65886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Determines whether the given declaration is an enumeration. 65986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsEnum(NamedDecl *ND) const { 66086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return isa<EnumDecl>(ND); 66186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 66286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 66386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Determines whether the given declaration is a class or struct. 66486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsClassOrStruct(NamedDecl *ND) const { 66586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Allow us to find class templates, too. 66686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (ClassTemplateDecl *ClassTemplate = dyn_cast<ClassTemplateDecl>(ND)) 66786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ND = ClassTemplate->getTemplatedDecl(); 66886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 66986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (RecordDecl *RD = dyn_cast<RecordDecl>(ND)) 67086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return RD->getTagKind() == TagDecl::TK_class || 67186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor RD->getTagKind() == TagDecl::TK_struct; 67286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 67386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return false; 67486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 67586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 67686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Determines whether the given declaration is a union. 67786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsUnion(NamedDecl *ND) const { 67886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Allow us to find class templates, too. 67986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (ClassTemplateDecl *ClassTemplate = dyn_cast<ClassTemplateDecl>(ND)) 68086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ND = ClassTemplate->getTemplatedDecl(); 68186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 68286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (RecordDecl *RD = dyn_cast<RecordDecl>(ND)) 68386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return RD->getTagKind() == TagDecl::TK_union; 68486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 68586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return false; 68686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 68786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 68886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Determines whether the given declaration is a namespace. 68986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsNamespace(NamedDecl *ND) const { 69086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return isa<NamespaceDecl>(ND); 69186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 69286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 69386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Determines whether the given declaration is a namespace or 69486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// namespace alias. 69586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsNamespaceOrAlias(NamedDecl *ND) const { 69686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return isa<NamespaceDecl>(ND) || isa<NamespaceAliasDecl>(ND); 69786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 69886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 6997628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor/// \brief Determines whether the given declaration is a type. 70086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsType(NamedDecl *ND) const { 70186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return isa<TypeDecl>(ND); 70286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 70386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 7047628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor/// \brief Determines which members of a class should be visible via 7057628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor/// "." or "->". Only value declarations, nested name specifiers, and 7067628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor/// using declarations thereof should show up. 707eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregorbool ResultBuilder::IsMember(NamedDecl *ND) const { 7087628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor if (UsingShadowDecl *Using = dyn_cast<UsingShadowDecl>(ND)) 7097628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor ND = Using->getTargetDecl(); 7107628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor 711ce82196076cd15f5ecfa029fcda8b58dc0146cf1Douglas Gregor return isa<ValueDecl>(ND) || isa<FunctionTemplateDecl>(ND) || 712ce82196076cd15f5ecfa029fcda8b58dc0146cf1Douglas Gregor isa<ObjCPropertyDecl>(ND); 713eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor} 714eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor 71580f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor/// \rief Determines whether the given declaration is an Objective-C 71680f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor/// instance variable. 71780f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregorbool ResultBuilder::IsObjCIvar(NamedDecl *ND) const { 71880f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor return isa<ObjCIvarDecl>(ND); 71980f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor} 72080f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor 7211ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregornamespace { 7221ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// \brief Visible declaration consumer that adds a code-completion result 7231ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// for each visible declaration. 7241ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor class CodeCompletionDeclConsumer : public VisibleDeclConsumer { 7251ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor ResultBuilder &Results; 7261ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor DeclContext *CurContext; 7271ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 7281ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor public: 7291ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor CodeCompletionDeclConsumer(ResultBuilder &Results, DeclContext *CurContext) 7301ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor : Results(Results), CurContext(CurContext) { } 7311ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 7320cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor virtual void FoundDecl(NamedDecl *ND, NamedDecl *Hiding, bool InBaseClass) { 7330cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor Results.AddResult(ND, CurContext, Hiding, InBaseClass); 7341ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor } 7351ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor }; 7361ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor} 7371ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 73886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Add type specifiers for the current language as keyword results. 739bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddTypeSpecifierResults(const LangOptions &LangOpts, 74086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ResultBuilder &Results) { 74186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor typedef CodeCompleteConsumer::Result Result; 742a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("short")); 743a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("long")); 744a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("signed")); 745a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("unsigned")); 746a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("void")); 747a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("char")); 748a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("int")); 749a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("float")); 750a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("double")); 751a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("enum")); 752a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("struct")); 753a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("union")); 754a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("const")); 755a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("volatile")); 75601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 75786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (LangOpts.C99) { 75886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // C99-specific 759a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("_Complex")); 760a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("_Imaginary")); 761a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("_Bool")); 762a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("restrict")); 76386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 76486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 76586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (LangOpts.CPlusPlus) { 76686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // C++-specific 767a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("bool")); 768a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("class")); 769a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("wchar_t")); 77086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 77101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // typename qualified-id 77201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor CodeCompletionString *Pattern = new CodeCompletionString; 77301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("typename"); 77401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 77501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("qualified-id"); 776a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 77701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 77886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (LangOpts.CPlusPlus0x) { 779a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("auto")); 780a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("char16_t")); 781a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("char32_t")); 782a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("decltype")); 78386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 78486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 78586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 78686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // GNU extensions 78786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (LangOpts.GNUMode) { 78886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // FIXME: Enable when we actually support decimal floating point. 789a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor // Results.AddResult(Result("_Decimal32")); 790a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor // Results.AddResult(Result("_Decimal64")); 791a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor // Results.AddResult(Result("_Decimal128")); 79201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 79301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor CodeCompletionString *Pattern = new CodeCompletionString; 79401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("typeof"); 79501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 79601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("expression-or-type"); 79701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 798a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 79901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 80001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor} 80101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 80201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregorstatic void AddStorageSpecifiers(Action::CodeCompletionContext CCC, 80301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor const LangOptions &LangOpts, 80401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor ResultBuilder &Results) { 80501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor typedef CodeCompleteConsumer::Result Result; 80601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Note: we don't suggest either "auto" or "register", because both 80701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // are pointless as storage specifiers. Elsewhere, we suggest "auto" 80801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // in C++0x as a type specifier. 809a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("extern")); 810a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("static")); 81101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor} 81201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 81301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregorstatic void AddFunctionSpecifiers(Action::CodeCompletionContext CCC, 81401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor const LangOptions &LangOpts, 81501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor ResultBuilder &Results) { 81601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor typedef CodeCompleteConsumer::Result Result; 81701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor switch (CCC) { 81801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case Action::CCC_Class: 81901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case Action::CCC_MemberTemplate: 82001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (LangOpts.CPlusPlus) { 821a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("explicit")); 822a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("friend")); 823a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("mutable")); 824a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("virtual")); 82501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 82601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Fall through 82701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 828b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor case Action::CCC_ObjCInterface: 829b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor case Action::CCC_ObjCImplementation: 83001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case Action::CCC_Namespace: 83101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case Action::CCC_Template: 83201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (LangOpts.CPlusPlus || LangOpts.C99) 833a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("inline")); 83401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 83501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 836c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor case Action::CCC_ObjCInstanceVariableList: 83701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case Action::CCC_Expression: 83801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case Action::CCC_Statement: 83901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case Action::CCC_ForInit: 84001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case Action::CCC_Condition: 84101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 84201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 84301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor} 84401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 845bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCExpressionResults(ResultBuilder &Results, bool NeedAt); 846bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCStatementResults(ResultBuilder &Results, bool NeedAt); 847bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCVisibilityResults(const LangOptions &LangOpts, 848c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor ResultBuilder &Results, 849c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor bool NeedAt); 850bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCImplementationResults(const LangOptions &LangOpts, 851b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor ResultBuilder &Results, 852b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor bool NeedAt); 853bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCInterfaceResults(const LangOptions &LangOpts, 854b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor ResultBuilder &Results, 855b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor bool NeedAt); 856bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCTopLevelResults(ResultBuilder &Results, bool NeedAt); 857b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 85801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor/// \brief Add language constructs that show up for "ordinary" names. 85901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregorstatic void AddOrdinaryNameResults(Action::CodeCompletionContext CCC, 86001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Scope *S, 86101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Sema &SemaRef, 86201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor ResultBuilder &Results) { 86301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor typedef CodeCompleteConsumer::Result Result; 86401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor switch (CCC) { 86501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case Action::CCC_Namespace: 86601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus) { 86701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // namespace <identifier> { } 86801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor CodeCompletionString *Pattern = new CodeCompletionString; 86901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("namespace"); 87001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 87101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("identifier"); 87201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftBrace); 87301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("declarations"); 87401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_VerticalSpace); 87501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightBrace); 876a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 87701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 87801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // namespace identifier = identifier ; 87901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 88001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("namespace"); 88101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 88201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("identifier"); 88301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_Equal); 88401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("identifier"); 88501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_SemiColon); 886a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 88701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 88801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Using directives 88901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 89001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("using"); 89101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 89201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTextChunk("namespace"); 89301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 89401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("identifier"); 89501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_SemiColon); 896a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 89701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 89801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // asm(string-literal) 89901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 90001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("asm"); 90101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 90201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("string-literal"); 90301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 90401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_SemiColon); 905a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 90601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 90701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Explicit template instantiation 90801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 90901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("template"); 91001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 91101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("declaration"); 91201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_SemiColon); 913a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 91401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 915b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 916b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor if (SemaRef.getLangOptions().ObjC1) 917bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCTopLevelResults(Results, true); 918b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 91901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Fall through 92001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 92101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case Action::CCC_Class: 922a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("typedef")); 92301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus) { 92401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Using declaration 92501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor CodeCompletionString *Pattern = new CodeCompletionString; 92601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("using"); 92701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 92801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("qualified-id"); 92901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_SemiColon); 930a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 93101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 93201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // using typename qualified-id; (only in a dependent context) 93301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (SemaRef.CurContext->isDependentContext()) { 93401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 93501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("using"); 93601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 93701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTextChunk("typename"); 93801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 93901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("qualified-id"); 94001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_SemiColon); 941a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 94201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 94301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 94401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (CCC == Action::CCC_Class) { 94501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // public: 94601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 94701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("public"); 94801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_Colon); 949a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 95001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 95101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // protected: 95201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 95301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("protected"); 95401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_Colon); 955a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 95601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 95701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // private: 95801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 95901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("private"); 96001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_Colon); 961a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 96201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 96301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 96401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Fall through 96501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 96601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case Action::CCC_Template: 96701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case Action::CCC_MemberTemplate: 96801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus) { 96901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // template < parameters > 97001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor CodeCompletionString *Pattern = new CodeCompletionString; 97101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("template"); 97201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftAngle); 97301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("parameters"); 97401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightAngle); 975a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 97601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 97701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 978bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddStorageSpecifiers(CCC, SemaRef.getLangOptions(), Results); 979bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddFunctionSpecifiers(CCC, SemaRef.getLangOptions(), Results); 98001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 98101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 982b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor case Action::CCC_ObjCInterface: 983bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCInterfaceResults(SemaRef.getLangOptions(), Results, true); 984bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddStorageSpecifiers(CCC, SemaRef.getLangOptions(), Results); 985bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddFunctionSpecifiers(CCC, SemaRef.getLangOptions(), Results); 986b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor break; 987b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 988b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor case Action::CCC_ObjCImplementation: 989bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCImplementationResults(SemaRef.getLangOptions(), Results, true); 990bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddStorageSpecifiers(CCC, SemaRef.getLangOptions(), Results); 991bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddFunctionSpecifiers(CCC, SemaRef.getLangOptions(), Results); 992b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor break; 993b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 994c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor case Action::CCC_ObjCInstanceVariableList: 995bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCVisibilityResults(SemaRef.getLangOptions(), Results, true); 996c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor break; 997c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor 99801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case Action::CCC_Statement: { 999a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("typedef")); 100001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 100101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor CodeCompletionString *Pattern = 0; 100201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus) { 100301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 100401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("try"); 100501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftBrace); 100601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("statements"); 100701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_VerticalSpace); 100801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightBrace); 100901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTextChunk("catch"); 101001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 101101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("declaration"); 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); 1017a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 101801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 1019b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor if (SemaRef.getLangOptions().ObjC1) 1020bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCStatementResults(Results, true); 1021b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 102201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // if (condition) { statements } 102301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 102401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("if"); 102501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 102601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus) 102701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("condition"); 102801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor else 102901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("expression"); 103001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 103101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftBrace); 103201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("statements"); 103301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_VerticalSpace); 103401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightBrace); 1035a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 103601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 103701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // switch (condition) { } 103801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 103901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("switch"); 104001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 104101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus) 104201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("condition"); 104301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor else 104401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("expression"); 104501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 104601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftBrace); 104701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_VerticalSpace); 104801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightBrace); 1049a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 105001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 105101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Switch-specific statements. 105201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (!SemaRef.getSwitchStack().empty()) { 105301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // case expression: 105401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 105501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("case"); 105601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("expression"); 105701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_Colon); 1058a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 105901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 106001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // default: 106101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 106201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("default"); 106301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_Colon); 1064a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 106501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 106601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 106701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor /// while (condition) { statements } 106801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 106901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("while"); 107001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 107101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus) 107201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("condition"); 107301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor else 107401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("expression"); 107501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 107601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftBrace); 107701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("statements"); 107801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_VerticalSpace); 107901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightBrace); 1080a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 108101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 108201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // do { statements } while ( expression ); 108301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 108401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("do"); 108501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftBrace); 108601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("statements"); 108701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_VerticalSpace); 108801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightBrace); 108901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTextChunk("while"); 109001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 109101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("expression"); 109201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 109301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_SemiColon); 1094a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 109501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 109601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // for ( for-init-statement ; condition ; expression ) { statements } 109701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 109801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("for"); 109901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 110001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus || SemaRef.getLangOptions().C99) 110101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("init-statement"); 110201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor else 110301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("init-expression"); 110401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_SemiColon); 110501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("condition"); 110601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_SemiColon); 110701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("inc-expression"); 110801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 110901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftBrace); 111001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("statements"); 111101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_VerticalSpace); 111201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightBrace); 1113a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 111401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 111501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (S->getContinueParent()) { 111601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // continue ; 111701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 111801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("continue"); 111901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_SemiColon); 1120a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 112101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 112201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 112301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (S->getBreakParent()) { 112401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // break ; 112501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 112601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("break"); 112701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_SemiColon); 1128a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 112901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 113001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 113101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // "return expression ;" or "return ;", depending on whether we 113201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // know the function is void or not. 113301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor bool isVoid = false; 113401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (FunctionDecl *Function = dyn_cast<FunctionDecl>(SemaRef.CurContext)) 113501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor isVoid = Function->getResultType()->isVoidType(); 113601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor else if (ObjCMethodDecl *Method 113701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor = dyn_cast<ObjCMethodDecl>(SemaRef.CurContext)) 113801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor isVoid = Method->getResultType()->isVoidType(); 11399ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor else if (SemaRef.getCurBlock() && 11409ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor !SemaRef.getCurBlock()->ReturnType.isNull()) 11419ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor isVoid = SemaRef.getCurBlock()->ReturnType->isVoidType(); 114201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 114301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("return"); 11449329800d6f4c4ea8778aabd64cde1b712b290b00Douglas Gregor if (!isVoid) { 11459329800d6f4c4ea8778aabd64cde1b712b290b00Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 114601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("expression"); 11479329800d6f4c4ea8778aabd64cde1b712b290b00Douglas Gregor } 114801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_SemiColon); 1149a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 115001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 115101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // goto identifier ; 115201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 115301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("goto"); 115401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 115501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("identifier"); 115601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_SemiColon); 1157a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 115801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 115901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Using directives 116001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 116101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("using"); 116201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 116301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTextChunk("namespace"); 116401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 116501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("identifier"); 116601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_SemiColon); 1167a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 116801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 116901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 117001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Fall through (for statement expressions). 117101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case Action::CCC_ForInit: 117201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case Action::CCC_Condition: 1173bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddStorageSpecifiers(CCC, SemaRef.getLangOptions(), Results); 117401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Fall through: conditions and statements can have expressions. 117501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 117601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case Action::CCC_Expression: { 117701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor CodeCompletionString *Pattern = 0; 117801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus) { 117901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // 'this', if we're in a non-static member function. 118001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(SemaRef.CurContext)) 118101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (!Method->isStatic()) 1182a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("this")); 118301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 118401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // true, false 1185a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("true")); 1186a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("false")); 118701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 118801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // dynamic_cast < type-id > ( expression ) 118901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 119001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("dynamic_cast"); 119101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftAngle); 119201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("type-id"); 119301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightAngle); 119401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 119501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("expression"); 119601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 1197a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 119801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 119901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // static_cast < type-id > ( expression ) 120001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 120101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("static_cast"); 120201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftAngle); 120301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("type-id"); 120401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightAngle); 120501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 120601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("expression"); 120701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 1208a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 120901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 121001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // reinterpret_cast < type-id > ( expression ) 121101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 121201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("reinterpret_cast"); 121301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftAngle); 121401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("type-id"); 121501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightAngle); 121601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 121701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("expression"); 121801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 1219a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 122001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 122101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // const_cast < type-id > ( expression ) 122201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 122301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("const_cast"); 122401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftAngle); 122501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("type-id"); 122601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightAngle); 122701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 122801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("expression"); 122901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 1230a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 123101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 123201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // typeid ( expression-or-type ) 123301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 123401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("typeid"); 123501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 123601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("expression-or-type"); 123701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 1238a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 123901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 124001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // new T ( ... ) 124101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 124201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("new"); 124301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 124401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("type-id"); 124501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 124601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("expressions"); 124701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 1248a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 124901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 125001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // new T [ ] ( ... ) 125101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 125201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("new"); 125301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 125401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("type-id"); 125501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftBracket); 125601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("size"); 125701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightBracket); 125801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 125901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("expressions"); 126001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 1261a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 126201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 126301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // delete expression 126401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 126501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("delete"); 126601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 126701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("expression"); 1268a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 126901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 127001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // delete [] expression 127101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 127201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("delete"); 127301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftBracket); 127401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightBracket); 127501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 127601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("expression"); 1277a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 127801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 127901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // throw expression 128001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 128101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("throw"); 128201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 128301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("expression"); 1284a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 128501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 128601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 128701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (SemaRef.getLangOptions().ObjC1) { 128801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Add "super", if we're in an Objective-C class with a superclass. 128901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (ObjCMethodDecl *Method = SemaRef.getCurMethodDecl()) 129001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (Method->getClassInterface()->getSuperClass()) 1291a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("super")); 1292b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 1293bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCExpressionResults(Results, true); 129401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 129501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 129601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // sizeof expression 129701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 129801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("sizeof"); 129901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 130001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("expression-or-type"); 130101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 1302a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 130301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 130486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 130501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 130601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1307bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddTypeSpecifierResults(SemaRef.getLangOptions(), Results); 130801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 130901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus) 1310a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("operator")); 131186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 131286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 1313ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor/// \brief If the given declaration has an associated type, add it as a result 1314ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor/// type chunk. 1315ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregorstatic void AddResultTypeChunk(ASTContext &Context, 1316ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor NamedDecl *ND, 1317ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor CodeCompletionString *Result) { 1318ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor if (!ND) 1319ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor return; 1320ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor 1321ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor // Determine the type of the declaration (if it has a type). 1322ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor QualType T; 1323ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor if (FunctionDecl *Function = dyn_cast<FunctionDecl>(ND)) 1324ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor T = Function->getResultType(); 1325ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor else if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(ND)) 1326ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor T = Method->getResultType(); 1327ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor else if (FunctionTemplateDecl *FunTmpl = dyn_cast<FunctionTemplateDecl>(ND)) 1328ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor T = FunTmpl->getTemplatedDecl()->getResultType(); 1329ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor else if (EnumConstantDecl *Enumerator = dyn_cast<EnumConstantDecl>(ND)) 1330ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor T = Context.getTypeDeclType(cast<TypeDecl>(Enumerator->getDeclContext())); 1331ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor else if (isa<UnresolvedUsingValueDecl>(ND)) { 1332ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor /* Do nothing: ignore unresolved using declarations*/ 1333ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor } else if (ValueDecl *Value = dyn_cast<ValueDecl>(ND)) 1334ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor T = Value->getType(); 1335ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor else if (ObjCPropertyDecl *Property = dyn_cast<ObjCPropertyDecl>(ND)) 1336ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor T = Property->getType(); 1337ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor 1338ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor if (T.isNull() || Context.hasSameType(T, Context.DependentTy)) 1339ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor return; 1340ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor 134184139d6ef8967cfdb70d37378a7a65cc4827d44dDouglas Gregor PrintingPolicy Policy(Context.PrintingPolicy); 134284139d6ef8967cfdb70d37378a7a65cc4827d44dDouglas Gregor Policy.AnonymousTagLocations = false; 134384139d6ef8967cfdb70d37378a7a65cc4827d44dDouglas Gregor 1344ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor std::string TypeStr; 134584139d6ef8967cfdb70d37378a7a65cc4827d44dDouglas Gregor T.getAsStringInternal(TypeStr, Policy); 1346ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor Result->AddResultTypeChunk(TypeStr); 1347ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor} 1348ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor 134986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Add function parameter chunks to the given code completion string. 135086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorstatic void AddFunctionParameterChunks(ASTContext &Context, 135186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor FunctionDecl *Function, 135286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor CodeCompletionString *Result) { 13530c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor typedef CodeCompletionString::Chunk Chunk; 13540c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 135586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor CodeCompletionString *CCStr = Result; 135686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 135786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor for (unsigned P = 0, N = Function->getNumParams(); P != N; ++P) { 135886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ParmVarDecl *Param = Function->getParamDecl(P); 135986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 136086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (Param->hasDefaultArg()) { 136186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // When we see an optional default argument, put that argument and 136286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // the remaining default arguments into a new, optional string. 136386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor CodeCompletionString *Opt = new CodeCompletionString; 136486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor CCStr->AddOptionalChunk(std::auto_ptr<CodeCompletionString>(Opt)); 136586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor CCStr = Opt; 136686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 136786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 136886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (P != 0) 13690c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor CCStr->AddChunk(Chunk(CodeCompletionString::CK_Comma)); 137086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 137186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Format the placeholder string. 137286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor std::string PlaceholderStr; 137386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (Param->getIdentifier()) 137486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr = Param->getIdentifier()->getName(); 137586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 137686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Param->getType().getAsStringInternal(PlaceholderStr, 137786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Context.PrintingPolicy); 137886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 137986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add the placeholder string. 1380660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer CCStr->AddPlaceholderChunk(PlaceholderStr); 138186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 1382b3d4525c65cf456d3f1f4338afdcac83afc7be02Douglas Gregor 1383b3d4525c65cf456d3f1f4338afdcac83afc7be02Douglas Gregor if (const FunctionProtoType *Proto 1384b3d4525c65cf456d3f1f4338afdcac83afc7be02Douglas Gregor = Function->getType()->getAs<FunctionProtoType>()) 1385b3d4525c65cf456d3f1f4338afdcac83afc7be02Douglas Gregor if (Proto->isVariadic()) 1386b3d4525c65cf456d3f1f4338afdcac83afc7be02Douglas Gregor CCStr->AddPlaceholderChunk(", ..."); 138786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 138886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 138986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Add template parameter chunks to the given code completion string. 139086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorstatic void AddTemplateParameterChunks(ASTContext &Context, 139186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor TemplateDecl *Template, 139286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor CodeCompletionString *Result, 139386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor unsigned MaxParameters = 0) { 13940c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor typedef CodeCompletionString::Chunk Chunk; 13950c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 139686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor CodeCompletionString *CCStr = Result; 139786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool FirstParameter = true; 139886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 139986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor TemplateParameterList *Params = Template->getTemplateParameters(); 140086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor TemplateParameterList::iterator PEnd = Params->end(); 140186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (MaxParameters) 140286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PEnd = Params->begin() + MaxParameters; 140386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor for (TemplateParameterList::iterator P = Params->begin(); P != PEnd; ++P) { 140486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool HasDefaultArg = false; 140586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor std::string PlaceholderStr; 140686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(*P)) { 140786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (TTP->wasDeclaredWithTypename()) 140886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr = "typename"; 140986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor else 141086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr = "class"; 141186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 141286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (TTP->getIdentifier()) { 141386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr += ' '; 141486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr += TTP->getIdentifier()->getName(); 141586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 141686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 141786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor HasDefaultArg = TTP->hasDefaultArgument(); 141886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } else if (NonTypeTemplateParmDecl *NTTP 141986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor = dyn_cast<NonTypeTemplateParmDecl>(*P)) { 142086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (NTTP->getIdentifier()) 142186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr = NTTP->getIdentifier()->getName(); 142286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NTTP->getType().getAsStringInternal(PlaceholderStr, 142386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Context.PrintingPolicy); 142486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor HasDefaultArg = NTTP->hasDefaultArgument(); 142586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } else { 142686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor assert(isa<TemplateTemplateParmDecl>(*P)); 142786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor TemplateTemplateParmDecl *TTP = cast<TemplateTemplateParmDecl>(*P); 142886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 142986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Since putting the template argument list into the placeholder would 143086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // be very, very long, we just use an abbreviation. 143186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr = "template<...> class"; 143286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (TTP->getIdentifier()) { 143386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr += ' '; 143486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr += TTP->getIdentifier()->getName(); 143586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 143686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 143786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor HasDefaultArg = TTP->hasDefaultArgument(); 143886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 143986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 144086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (HasDefaultArg) { 144186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // When we see an optional default argument, put that argument and 144286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // the remaining default arguments into a new, optional string. 144386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor CodeCompletionString *Opt = new CodeCompletionString; 144486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor CCStr->AddOptionalChunk(std::auto_ptr<CodeCompletionString>(Opt)); 144586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor CCStr = Opt; 144686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 144786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 144886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (FirstParameter) 144986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor FirstParameter = false; 145086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor else 14510c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor CCStr->AddChunk(Chunk(CodeCompletionString::CK_Comma)); 145286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 145386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add the placeholder string. 1454660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer CCStr->AddPlaceholderChunk(PlaceholderStr); 145586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 145686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 145786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 1458b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor/// \brief Add a qualifier to the given code-completion string, if the 1459b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor/// provided nested-name-specifier is non-NULL. 1460a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregorstatic void 1461a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas GregorAddQualifierToCompletionString(CodeCompletionString *Result, 1462a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor NestedNameSpecifier *Qualifier, 1463a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor bool QualifierIsInformative, 1464a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor ASTContext &Context) { 1465b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor if (!Qualifier) 1466b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor return; 1467b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor 1468b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor std::string PrintedNNS; 1469b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor { 1470b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor llvm::raw_string_ostream OS(PrintedNNS); 1471b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor Qualifier->print(OS, Context.PrintingPolicy); 1472b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor } 14730563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor if (QualifierIsInformative) 1474660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer Result->AddInformativeChunk(PrintedNNS); 14750563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor else 1476660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer Result->AddTextChunk(PrintedNNS); 1477b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor} 1478b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor 1479a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregorstatic void AddFunctionTypeQualsToCompletionString(CodeCompletionString *Result, 1480a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor FunctionDecl *Function) { 1481a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor const FunctionProtoType *Proto 1482a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor = Function->getType()->getAs<FunctionProtoType>(); 1483a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor if (!Proto || !Proto->getTypeQuals()) 1484a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor return; 1485a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor 1486a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor std::string QualsStr; 1487a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor if (Proto->getTypeQuals() & Qualifiers::Const) 1488a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor QualsStr += " const"; 1489a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor if (Proto->getTypeQuals() & Qualifiers::Volatile) 1490a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor QualsStr += " volatile"; 1491a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor if (Proto->getTypeQuals() & Qualifiers::Restrict) 1492a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor QualsStr += " restrict"; 1493a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor Result->AddInformativeChunk(QualsStr); 1494a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor} 1495a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor 149686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief If possible, create a new code completion string for the given 149786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// result. 149886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// 149986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \returns Either a new, heap-allocated code completion string describing 150086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// how to use this result, or NULL to indicate that the string or name of the 150186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// result is all that is needed. 150286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas GregorCodeCompletionString * 150386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas GregorCodeCompleteConsumer::Result::CreateCodeCompletionString(Sema &S) { 15040c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor typedef CodeCompletionString::Chunk Chunk; 15050c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 15062b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor if (Kind == RK_Pattern) 15072b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor return Pattern->Clone(); 15082b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 15092b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor CodeCompletionString *Result = new CodeCompletionString; 15102b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 15112b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor if (Kind == RK_Keyword) { 15122b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor Result->AddTypedTextChunk(Keyword); 15132b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor return Result; 15142b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor } 151586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 15163f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor if (Kind == RK_Macro) { 15173f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor MacroInfo *MI = S.PP.getMacroInfo(Macro); 15182b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor assert(MI && "Not a macro?"); 15192b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 15202b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor Result->AddTypedTextChunk(Macro->getName()); 15212b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 15222b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor if (!MI->isFunctionLike()) 15232b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor return Result; 15243f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor 15253f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor // Format a function-like macro with placeholders for the arguments. 15260c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_LeftParen)); 15273f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor for (MacroInfo::arg_iterator A = MI->arg_begin(), AEnd = MI->arg_end(); 15283f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor A != AEnd; ++A) { 15293f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor if (A != MI->arg_begin()) 15300c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_Comma)); 15313f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor 15323f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor if (!MI->isVariadic() || A != AEnd - 1) { 15333f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor // Non-variadic argument. 1534660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer Result->AddPlaceholderChunk((*A)->getName()); 15353f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor continue; 15363f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor } 15373f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor 15383f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor // Variadic argument; cope with the different between GNU and C99 15393f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor // variadic macros, providing a single placeholder for the rest of the 15403f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor // arguments. 15413f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor if ((*A)->isStr("__VA_ARGS__")) 15423f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor Result->AddPlaceholderChunk("..."); 15433f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor else { 15443f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor std::string Arg = (*A)->getName(); 15453f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor Arg += "..."; 1546660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer Result->AddPlaceholderChunk(Arg); 15473f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor } 15483f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor } 15490c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_RightParen)); 15503f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor return Result; 15513f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor } 15523f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor 15533f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor assert(Kind == RK_Declaration && "Missed a macro kind?"); 155486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NamedDecl *ND = Declaration; 155586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 15560c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor if (StartsNestedNameSpecifier) { 1557660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer Result->AddTypedTextChunk(ND->getNameAsString()); 15580c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddTextChunk("::"); 15590c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor return Result; 15600c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor } 15610c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 1562ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor AddResultTypeChunk(S.Context, ND, Result); 1563ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor 156486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (FunctionDecl *Function = dyn_cast<FunctionDecl>(ND)) { 15650563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative, 15660563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor S.Context); 1567660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer Result->AddTypedTextChunk(Function->getNameAsString()); 15680c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_LeftParen)); 156986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor AddFunctionParameterChunks(S.Context, Function, Result); 15700c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_RightParen)); 1571a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor AddFunctionTypeQualsToCompletionString(Result, Function); 157286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return Result; 157386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 157486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 157586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (FunctionTemplateDecl *FunTmpl = dyn_cast<FunctionTemplateDecl>(ND)) { 15760563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative, 15770563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor S.Context); 157886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor FunctionDecl *Function = FunTmpl->getTemplatedDecl(); 1579660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer Result->AddTypedTextChunk(Function->getNameAsString()); 158086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 158186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Figure out which template parameters are deduced (or have default 158286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // arguments). 158386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor llvm::SmallVector<bool, 16> Deduced; 158486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor S.MarkDeducedTemplateParameters(FunTmpl, Deduced); 158586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor unsigned LastDeducibleArgument; 158686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor for (LastDeducibleArgument = Deduced.size(); LastDeducibleArgument > 0; 158786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor --LastDeducibleArgument) { 158886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!Deduced[LastDeducibleArgument - 1]) { 158986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // C++0x: Figure out if the template argument has a default. If so, 159086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // the user doesn't need to type this argument. 159186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // FIXME: We need to abstract template parameters better! 159286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool HasDefaultArg = false; 159386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NamedDecl *Param = FunTmpl->getTemplateParameters()->getParam( 159486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor LastDeducibleArgument - 1); 159586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(Param)) 159686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor HasDefaultArg = TTP->hasDefaultArgument(); 159786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor else if (NonTypeTemplateParmDecl *NTTP 159886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor = dyn_cast<NonTypeTemplateParmDecl>(Param)) 159986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor HasDefaultArg = NTTP->hasDefaultArgument(); 160086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor else { 160186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor assert(isa<TemplateTemplateParmDecl>(Param)); 160286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor HasDefaultArg 16030c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor = cast<TemplateTemplateParmDecl>(Param)->hasDefaultArgument(); 160486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 160586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 160686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!HasDefaultArg) 160786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor break; 160886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 160986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 161086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 161186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (LastDeducibleArgument) { 161286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Some of the function template arguments cannot be deduced from a 161386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // function call, so we introduce an explicit template argument list 161486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // containing all of the arguments up to the first deducible argument. 16150c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_LeftAngle)); 161686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor AddTemplateParameterChunks(S.Context, FunTmpl, Result, 161786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor LastDeducibleArgument); 16180c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_RightAngle)); 161986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 162086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 162186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add the function parameters 16220c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_LeftParen)); 162386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor AddFunctionParameterChunks(S.Context, Function, Result); 16240c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_RightParen)); 1625a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor AddFunctionTypeQualsToCompletionString(Result, Function); 162686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return Result; 162786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 162886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 162986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (TemplateDecl *Template = dyn_cast<TemplateDecl>(ND)) { 16300563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative, 16310563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor S.Context); 1632660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer Result->AddTypedTextChunk(Template->getNameAsString()); 16330c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_LeftAngle)); 163486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor AddTemplateParameterChunks(S.Context, Template, Result); 16350c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_RightAngle)); 163686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return Result; 163786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 163886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 16399630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(ND)) { 16409630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor Selector Sel = Method->getSelector(); 16419630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor if (Sel.isUnarySelector()) { 16429630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor Result->AddTypedTextChunk(Sel.getIdentifierInfoForSlot(0)->getName()); 16439630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor return Result; 16449630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor } 16459630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor 1646d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor std::string SelName = Sel.getIdentifierInfoForSlot(0)->getName().str(); 1647d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor SelName += ':'; 1648d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor if (StartParameter == 0) 1649d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor Result->AddTypedTextChunk(SelName); 1650d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor else { 1651d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor Result->AddInformativeChunk(SelName); 1652d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor 1653d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor // If there is only one parameter, and we're past it, add an empty 1654d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor // typed-text chunk since there is nothing to type. 1655d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor if (Method->param_size() == 1) 1656d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor Result->AddTypedTextChunk(""); 1657d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor } 16589630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor unsigned Idx = 0; 16599630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor for (ObjCMethodDecl::param_iterator P = Method->param_begin(), 16609630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor PEnd = Method->param_end(); 16619630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor P != PEnd; (void)++P, ++Idx) { 16629630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor if (Idx > 0) { 1663d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor std::string Keyword; 1664d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor if (Idx > StartParameter) 1665834389b87451b24618513b907b4dfb5b00d211f3Douglas Gregor Result->AddChunk(CodeCompletionString::CK_HorizontalSpace); 16669630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor if (IdentifierInfo *II = Sel.getIdentifierInfoForSlot(Idx)) 16679630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor Keyword += II->getName().str(); 16689630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor Keyword += ":"; 16694ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (Idx < StartParameter || AllParametersAreInformative) { 1670d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor Result->AddInformativeChunk(Keyword); 1671d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor } else if (Idx == StartParameter) 1672d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor Result->AddTypedTextChunk(Keyword); 1673d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor else 1674d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor Result->AddTextChunk(Keyword); 16759630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor } 1676d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor 1677d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor // If we're before the starting parameter, skip the placeholder. 1678d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor if (Idx < StartParameter) 1679d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor continue; 16809630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor 16819630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor std::string Arg; 16829630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor (*P)->getType().getAsStringInternal(Arg, S.Context.PrintingPolicy); 16839630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor Arg = "(" + Arg + ")"; 16849630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor if (IdentifierInfo *II = (*P)->getIdentifier()) 16859630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor Arg += II->getName().str(); 16864ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (AllParametersAreInformative) 16874ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Result->AddInformativeChunk(Arg); 16884ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor else 16894ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Result->AddPlaceholderChunk(Arg); 16909630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor } 16919630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor 16922a17af0c7e05500e25d4cc71341f1f232085ebeaDouglas Gregor if (Method->isVariadic()) { 16932a17af0c7e05500e25d4cc71341f1f232085ebeaDouglas Gregor if (AllParametersAreInformative) 16942a17af0c7e05500e25d4cc71341f1f232085ebeaDouglas Gregor Result->AddInformativeChunk(", ..."); 16952a17af0c7e05500e25d4cc71341f1f232085ebeaDouglas Gregor else 16962a17af0c7e05500e25d4cc71341f1f232085ebeaDouglas Gregor Result->AddPlaceholderChunk(", ..."); 16972a17af0c7e05500e25d4cc71341f1f232085ebeaDouglas Gregor } 16982a17af0c7e05500e25d4cc71341f1f232085ebeaDouglas Gregor 16999630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor return Result; 17009630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor } 17019630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor 17022b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor if (Qualifier) 17030563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative, 17040563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor S.Context); 17052b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 17062b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor Result->AddTypedTextChunk(ND->getNameAsString()); 17072b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor return Result; 170886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 170986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 171086d802e03a267af79663990c39865c67e0645238Douglas GregorCodeCompletionString * 171186d802e03a267af79663990c39865c67e0645238Douglas GregorCodeCompleteConsumer::OverloadCandidate::CreateSignatureString( 171286d802e03a267af79663990c39865c67e0645238Douglas Gregor unsigned CurrentArg, 171386d802e03a267af79663990c39865c67e0645238Douglas Gregor Sema &S) const { 17140c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor typedef CodeCompletionString::Chunk Chunk; 17150c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 171686d802e03a267af79663990c39865c67e0645238Douglas Gregor CodeCompletionString *Result = new CodeCompletionString; 171786d802e03a267af79663990c39865c67e0645238Douglas Gregor FunctionDecl *FDecl = getFunction(); 1718ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor AddResultTypeChunk(S.Context, FDecl, Result); 171986d802e03a267af79663990c39865c67e0645238Douglas Gregor const FunctionProtoType *Proto 172086d802e03a267af79663990c39865c67e0645238Douglas Gregor = dyn_cast<FunctionProtoType>(getFunctionType()); 172186d802e03a267af79663990c39865c67e0645238Douglas Gregor if (!FDecl && !Proto) { 172286d802e03a267af79663990c39865c67e0645238Douglas Gregor // Function without a prototype. Just give the return type and a 172386d802e03a267af79663990c39865c67e0645238Douglas Gregor // highlighted ellipsis. 172486d802e03a267af79663990c39865c67e0645238Douglas Gregor const FunctionType *FT = getFunctionType(); 172586d802e03a267af79663990c39865c67e0645238Douglas Gregor Result->AddTextChunk( 1726660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer FT->getResultType().getAsString(S.Context.PrintingPolicy)); 17270c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_LeftParen)); 17280c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_CurrentParameter, "...")); 17290c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_RightParen)); 173086d802e03a267af79663990c39865c67e0645238Douglas Gregor return Result; 173186d802e03a267af79663990c39865c67e0645238Douglas Gregor } 173286d802e03a267af79663990c39865c67e0645238Douglas Gregor 173386d802e03a267af79663990c39865c67e0645238Douglas Gregor if (FDecl) 1734660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer Result->AddTextChunk(FDecl->getNameAsString()); 173586d802e03a267af79663990c39865c67e0645238Douglas Gregor else 173686d802e03a267af79663990c39865c67e0645238Douglas Gregor Result->AddTextChunk( 1737660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer Proto->getResultType().getAsString(S.Context.PrintingPolicy)); 173886d802e03a267af79663990c39865c67e0645238Douglas Gregor 17390c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_LeftParen)); 174086d802e03a267af79663990c39865c67e0645238Douglas Gregor unsigned NumParams = FDecl? FDecl->getNumParams() : Proto->getNumArgs(); 174186d802e03a267af79663990c39865c67e0645238Douglas Gregor for (unsigned I = 0; I != NumParams; ++I) { 174286d802e03a267af79663990c39865c67e0645238Douglas Gregor if (I) 17430c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_Comma)); 174486d802e03a267af79663990c39865c67e0645238Douglas Gregor 174586d802e03a267af79663990c39865c67e0645238Douglas Gregor std::string ArgString; 174686d802e03a267af79663990c39865c67e0645238Douglas Gregor QualType ArgType; 174786d802e03a267af79663990c39865c67e0645238Douglas Gregor 174886d802e03a267af79663990c39865c67e0645238Douglas Gregor if (FDecl) { 174986d802e03a267af79663990c39865c67e0645238Douglas Gregor ArgString = FDecl->getParamDecl(I)->getNameAsString(); 175086d802e03a267af79663990c39865c67e0645238Douglas Gregor ArgType = FDecl->getParamDecl(I)->getOriginalType(); 175186d802e03a267af79663990c39865c67e0645238Douglas Gregor } else { 175286d802e03a267af79663990c39865c67e0645238Douglas Gregor ArgType = Proto->getArgType(I); 175386d802e03a267af79663990c39865c67e0645238Douglas Gregor } 175486d802e03a267af79663990c39865c67e0645238Douglas Gregor 175586d802e03a267af79663990c39865c67e0645238Douglas Gregor ArgType.getAsStringInternal(ArgString, S.Context.PrintingPolicy); 175686d802e03a267af79663990c39865c67e0645238Douglas Gregor 175786d802e03a267af79663990c39865c67e0645238Douglas Gregor if (I == CurrentArg) 17580c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_CurrentParameter, 1759660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer ArgString)); 176086d802e03a267af79663990c39865c67e0645238Douglas Gregor else 1761660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer Result->AddTextChunk(ArgString); 176286d802e03a267af79663990c39865c67e0645238Douglas Gregor } 176386d802e03a267af79663990c39865c67e0645238Douglas Gregor 176486d802e03a267af79663990c39865c67e0645238Douglas Gregor if (Proto && Proto->isVariadic()) { 17650c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_Comma)); 176686d802e03a267af79663990c39865c67e0645238Douglas Gregor if (CurrentArg < NumParams) 176786d802e03a267af79663990c39865c67e0645238Douglas Gregor Result->AddTextChunk("..."); 176886d802e03a267af79663990c39865c67e0645238Douglas Gregor else 17690c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_CurrentParameter, "...")); 177086d802e03a267af79663990c39865c67e0645238Douglas Gregor } 17710c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_RightParen)); 177286d802e03a267af79663990c39865c67e0645238Douglas Gregor 177386d802e03a267af79663990c39865c67e0645238Douglas Gregor return Result; 177486d802e03a267af79663990c39865c67e0645238Douglas Gregor} 177586d802e03a267af79663990c39865c67e0645238Douglas Gregor 177686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregornamespace { 177786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor struct SortCodeCompleteResult { 177886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor typedef CodeCompleteConsumer::Result Result; 177986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 17806a6840326e9b4ac8e81a5a212165f33743847ab8Douglas Gregor bool isEarlierDeclarationName(DeclarationName X, DeclarationName Y) const { 17812b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor Selector XSel = X.getObjCSelector(); 17822b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor Selector YSel = Y.getObjCSelector(); 17832b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor if (!XSel.isNull() && !YSel.isNull()) { 17842b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor // We are comparing two selectors. 17852b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor unsigned N = std::min(XSel.getNumArgs(), YSel.getNumArgs()); 17862b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor if (N == 0) 17872b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor ++N; 17882b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor for (unsigned I = 0; I != N; ++I) { 17892b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor IdentifierInfo *XId = XSel.getIdentifierInfoForSlot(I); 17902b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor IdentifierInfo *YId = YSel.getIdentifierInfoForSlot(I); 17912b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor if (!XId || !YId) 17922b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor return XId && !YId; 17932b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor 17942b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor switch (XId->getName().compare_lower(YId->getName())) { 17952b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor case -1: return true; 17962b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor case 1: return false; 17972b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor default: break; 17982b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor } 17992b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor } 18002b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor 18012b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor return XSel.getNumArgs() < YSel.getNumArgs(); 18022b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor } 18032b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor 18042b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor // For non-selectors, order by kind. 18052b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor if (X.getNameKind() != Y.getNameKind()) 18066a6840326e9b4ac8e81a5a212165f33743847ab8Douglas Gregor return X.getNameKind() < Y.getNameKind(); 18076a6840326e9b4ac8e81a5a212165f33743847ab8Douglas Gregor 18082b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor // Order identifiers by comparison of their lowercased names. 18092b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor if (IdentifierInfo *XId = X.getAsIdentifierInfo()) 18102b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor return XId->getName().compare_lower( 18112b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor Y.getAsIdentifierInfo()->getName()) < 0; 18122b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor 18132b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor // Order overloaded operators by the order in which they appear 18142b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor // in our list of operators. 18152b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor if (OverloadedOperatorKind XOp = X.getCXXOverloadedOperator()) 18162b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor return XOp < Y.getCXXOverloadedOperator(); 18172b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor 18182b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor // Order C++0x user-defined literal operators lexically by their 18192b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor // lowercased suffixes. 18202b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor if (IdentifierInfo *XLit = X.getCXXLiteralIdentifier()) 18212b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor return XLit->getName().compare_lower( 18222b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor Y.getCXXLiteralIdentifier()->getName()) < 0; 18232b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor 18242b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor // The only stable ordering we have is to turn the name into a 18252b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor // string and then compare the lower-case strings. This is 18262b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor // inefficient, but thankfully does not happen too often. 18270e7049fc6f2cc13d1236630782b702f11f6aaf9fBenjamin Kramer return llvm::StringRef(X.getAsString()).compare_lower( 18280e7049fc6f2cc13d1236630782b702f11f6aaf9fBenjamin Kramer Y.getAsString()) < 0; 18296a6840326e9b4ac8e81a5a212165f33743847ab8Douglas Gregor } 18306a6840326e9b4ac8e81a5a212165f33743847ab8Douglas Gregor 1831ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor /// \brief Retrieve the name that should be used to order a result. 1832ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor /// 1833ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor /// If the name needs to be constructed as a string, that string will be 1834ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor /// saved into Saved and the returned StringRef will refer to it. 1835ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor static llvm::StringRef getOrderedName(const Result &R, 1836ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor std::string &Saved) { 1837ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor switch (R.Kind) { 1838ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor case Result::RK_Keyword: 1839ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor return R.Keyword; 1840ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor 1841ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor case Result::RK_Pattern: 1842ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor return R.Pattern->getTypedText(); 1843ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor 1844ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor case Result::RK_Macro: 1845ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor return R.Macro->getName(); 1846ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor 1847ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor case Result::RK_Declaration: 1848ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor // Handle declarations below. 1849ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor break; 185054f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor } 1851ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor 1852ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor DeclarationName Name = R.Declaration->getDeclName(); 185354f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor 1854ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor // If the name is a simple identifier (by far the common case), or a 1855ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor // zero-argument selector, just return a reference to that identifier. 1856ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor if (IdentifierInfo *Id = Name.getAsIdentifierInfo()) 1857ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor return Id->getName(); 1858ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor if (Name.isObjCZeroArgSelector()) 1859ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor if (IdentifierInfo *Id 1860ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor = Name.getObjCSelector().getIdentifierInfoForSlot(0)) 1861ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor return Id->getName(); 1862ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor 1863ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor Saved = Name.getAsString(); 1864ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor return Saved; 1865ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor } 1866ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor 1867ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor bool operator()(const Result &X, const Result &Y) const { 1868ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor std::string XSaved, YSaved; 1869ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor llvm::StringRef XStr = getOrderedName(X, XSaved); 1870ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor llvm::StringRef YStr = getOrderedName(Y, YSaved); 1871ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor int cmp = XStr.compare_lower(YStr); 1872ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor if (cmp) 1873ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor return cmp < 0; 187486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 187586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Non-hidden names precede hidden names. 187686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (X.Hidden != Y.Hidden) 187786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return !X.Hidden; 187886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 1879eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor // Non-nested-name-specifiers precede nested-name-specifiers. 1880eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor if (X.StartsNestedNameSpecifier != Y.StartsNestedNameSpecifier) 1881eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor return !X.StartsNestedNameSpecifier; 1882eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor 188386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return false; 188486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 188586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor }; 188686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 188786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 1888bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddMacroResults(Preprocessor &PP, ResultBuilder &Results) { 18893f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor Results.EnterNewScope(); 18900c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor for (Preprocessor::macro_iterator M = PP.macro_begin(), 18910c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor MEnd = PP.macro_end(); 18923f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor M != MEnd; ++M) 1893a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(M->first); 18943f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor Results.ExitScope(); 18953f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor} 18963f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor 18973a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbarstatic void HandleCodeCompleteResults(Sema *S, 18983a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar CodeCompleteConsumer *CodeCompleter, 18993a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar CodeCompleteConsumer::Result *Results, 19003a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar unsigned NumResults) { 190186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor std::stable_sort(Results, Results + NumResults, SortCodeCompleteResult()); 190286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 190386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (CodeCompleter) 19043a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar CodeCompleter->ProcessCodeCompleteResults(*S, Results, NumResults); 190554f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor 190654f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor for (unsigned I = 0; I != NumResults; ++I) 190754f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor Results[I].Destroy(); 190886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 190986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 191001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregorvoid Sema::CodeCompleteOrdinaryName(Scope *S, 191101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor CodeCompletionContext CompletionContext) { 19122a7925c4abe45650f3ab27be09468e3a3a98084aDouglas Gregor typedef CodeCompleteConsumer::Result Result; 191301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor ResultBuilder Results(*this); 191401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 191501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Determine how to filter results, e.g., so that the names of 191601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // values (functions, enumerators, function templates, etc.) are 191701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // only allowed where we can have an expression. 191801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor switch (CompletionContext) { 191901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CCC_Namespace: 192001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CCC_Class: 1921b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor case CCC_ObjCInterface: 1922b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor case CCC_ObjCImplementation: 1923c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor case CCC_ObjCInstanceVariableList: 192401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CCC_Template: 192501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CCC_MemberTemplate: 192601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Results.setFilter(&ResultBuilder::IsOrdinaryNonValueName); 192701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 192801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 192901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CCC_Expression: 193001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CCC_Statement: 193101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CCC_ForInit: 193201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CCC_Condition: 193301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Results.setFilter(&ResultBuilder::IsOrdinaryName); 193401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 193501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 193601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 19371ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 19381ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer); 19392a7925c4abe45650f3ab27be09468e3a3a98084aDouglas Gregor 19402a7925c4abe45650f3ab27be09468e3a3a98084aDouglas Gregor Results.EnterNewScope(); 1941bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddOrdinaryNameResults(CompletionContext, S, *this, Results); 19422a7925c4abe45650f3ab27be09468e3a3a98084aDouglas Gregor Results.ExitScope(); 19432a7925c4abe45650f3ab27be09468e3a3a98084aDouglas Gregor 19440c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor if (CodeCompleter->includeMacros()) 1945bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddMacroResults(PP, Results); 19463a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 1947791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor} 1948791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor 194995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregorstatic void AddObjCProperties(ObjCContainerDecl *Container, 1950322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor bool AllowCategories, 195195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor DeclContext *CurContext, 195295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor ResultBuilder &Results) { 195395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor typedef CodeCompleteConsumer::Result Result; 195495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 195595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Add properties in this container. 195695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor for (ObjCContainerDecl::prop_iterator P = Container->prop_begin(), 195795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor PEnd = Container->prop_end(); 195895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor P != PEnd; 195995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor ++P) 196095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor Results.MaybeAddResult(Result(*P, 0), CurContext); 196195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 196295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Add properties in referenced protocols. 196395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) { 196495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor for (ObjCProtocolDecl::protocol_iterator P = Protocol->protocol_begin(), 196595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor PEnd = Protocol->protocol_end(); 196695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor P != PEnd; ++P) 1967322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor AddObjCProperties(*P, AllowCategories, CurContext, Results); 196895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } else if (ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container)){ 1969322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor if (AllowCategories) { 1970322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Look through categories. 1971322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor for (ObjCCategoryDecl *Category = IFace->getCategoryList(); 1972322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Category; Category = Category->getNextClassCategory()) 1973322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor AddObjCProperties(Category, AllowCategories, CurContext, Results); 1974322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor } 197595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 197695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Look through protocols. 197795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor for (ObjCInterfaceDecl::protocol_iterator I = IFace->protocol_begin(), 197895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor E = IFace->protocol_end(); 197995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor I != E; ++I) 1980322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor AddObjCProperties(*I, AllowCategories, CurContext, Results); 198195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 198295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Look in the superclass. 198395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (IFace->getSuperClass()) 1984322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor AddObjCProperties(IFace->getSuperClass(), AllowCategories, CurContext, 1985322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Results); 198695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } else if (const ObjCCategoryDecl *Category 198795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor = dyn_cast<ObjCCategoryDecl>(Container)) { 198895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Look through protocols. 198995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor for (ObjCInterfaceDecl::protocol_iterator P = Category->protocol_begin(), 199095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor PEnd = Category->protocol_end(); 199195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor P != PEnd; ++P) 1992322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor AddObjCProperties(*P, AllowCategories, CurContext, Results); 199395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } 199495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor} 199595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 199681b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregorvoid Sema::CodeCompleteMemberReferenceExpr(Scope *S, ExprTy *BaseE, 199781b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor SourceLocation OpLoc, 199881b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor bool IsArrow) { 199981b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor if (!BaseE || !CodeCompleter) 200081b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor return; 200181b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor 200286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor typedef CodeCompleteConsumer::Result Result; 200386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 200481b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor Expr *Base = static_cast<Expr *>(BaseE); 200581b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor QualType BaseType = Base->getType(); 200686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 200786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (IsArrow) { 200886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (const PointerType *Ptr = BaseType->getAs<PointerType>()) 200986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor BaseType = Ptr->getPointeeType(); 201086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor else if (BaseType->isObjCObjectPointerType()) 201186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /*Do nothing*/ ; 201286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor else 201386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return; 201486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 201586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 2016eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor ResultBuilder Results(*this, &ResultBuilder::IsMember); 201795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor Results.EnterNewScope(); 201895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (const RecordType *Record = BaseType->getAs<RecordType>()) { 201995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Access to a C/C++ class, struct, or union. 202045bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor Results.allowNestedNameSpecifiers(); 20210cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 20220cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor LookupVisibleDecls(Record->getDecl(), LookupMemberName, Consumer); 20233a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar 202495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (getLangOptions().CPlusPlus) { 202595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (!Results.empty()) { 202695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // The "template" keyword can follow "->" or "." in the grammar. 202795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // However, we only want to suggest the template keyword if something 202895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // is dependent. 202995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor bool IsDependent = BaseType->isDependentType(); 203095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (!IsDependent) { 203195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor for (Scope *DepScope = S; DepScope; DepScope = DepScope->getParent()) 203295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (DeclContext *Ctx = (DeclContext *)DepScope->getEntity()) { 203395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor IsDependent = Ctx->isDependentContext(); 203495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor break; 203595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } 203695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } 20373a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar 203895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (IsDependent) 2039a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("template")); 204086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 204195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } 204295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } else if (!IsArrow && BaseType->getAsObjCInterfacePointerType()) { 204395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Objective-C property reference. 204495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 204595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Add property results based on our interface. 204695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor const ObjCObjectPointerType *ObjCPtr 204795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor = BaseType->getAsObjCInterfacePointerType(); 204895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor assert(ObjCPtr && "Non-NULL pointer guaranteed above!"); 2049322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor AddObjCProperties(ObjCPtr->getInterfaceDecl(), true, CurContext, Results); 205095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 205195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Add properties from the protocols in a qualified interface. 205295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor for (ObjCObjectPointerType::qual_iterator I = ObjCPtr->qual_begin(), 205395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor E = ObjCPtr->qual_end(); 205495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor I != E; ++I) 2055322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor AddObjCProperties(*I, true, CurContext, Results); 205695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } else if ((IsArrow && BaseType->isObjCObjectPointerType()) || 205795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor (!IsArrow && BaseType->isObjCInterfaceType())) { 205895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Objective-C instance variable access. 205995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor ObjCInterfaceDecl *Class = 0; 206095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (const ObjCObjectPointerType *ObjCPtr 206195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor = BaseType->getAs<ObjCObjectPointerType>()) 206295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor Class = ObjCPtr->getInterfaceDecl(); 206395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor else 206495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor Class = BaseType->getAs<ObjCInterfaceType>()->getDecl(); 206595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 206695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Add all ivars from this class and its superclasses. 206780f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor if (Class) { 206880f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 206980f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor Results.setFilter(&ResultBuilder::IsObjCIvar); 207080f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor LookupVisibleDecls(Class, LookupMemberName, Consumer); 207186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 207286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 207395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 207495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // FIXME: How do we cope with isa? 207595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 207695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor Results.ExitScope(); 20773a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar 20783a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar // Add macros 20793a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar if (CodeCompleter->includeMacros()) 2080bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddMacroResults(PP, Results); 20813a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar 20823a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar // Hand off the results found for code completion. 20833a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 208481b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor} 208581b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor 2086374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregorvoid Sema::CodeCompleteTag(Scope *S, unsigned TagSpec) { 2087374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor if (!CodeCompleter) 2088374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor return; 2089374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor 209086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor typedef CodeCompleteConsumer::Result Result; 209186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ResultBuilder::LookupFilter Filter = 0; 2092374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor switch ((DeclSpec::TST)TagSpec) { 2093374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor case DeclSpec::TST_enum: 209486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Filter = &ResultBuilder::IsEnum; 2095374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor break; 2096374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor 2097374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor case DeclSpec::TST_union: 209886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Filter = &ResultBuilder::IsUnion; 2099374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor break; 2100374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor 2101374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor case DeclSpec::TST_struct: 2102374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor case DeclSpec::TST_class: 210386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Filter = &ResultBuilder::IsClassOrStruct; 2104374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor break; 2105374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor 2106374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor default: 2107374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor assert(false && "Unknown type specifier kind in CodeCompleteTag"); 2108374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor return; 2109374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor } 211086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 211186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ResultBuilder Results(*this, Filter); 211245bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor Results.allowNestedNameSpecifiers(); 21135d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 21145d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor LookupVisibleDecls(S, LookupTagName, Consumer); 211586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 21160c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor if (CodeCompleter->includeMacros()) 2117bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddMacroResults(PP, Results); 21183a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 2119374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor} 2120374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor 21213e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregorvoid Sema::CodeCompleteCase(Scope *S) { 21223e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor if (getSwitchStack().empty() || !CodeCompleter) 21233e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor return; 21243e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 21253e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor SwitchStmt *Switch = getSwitchStack().back(); 21263e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor if (!Switch->getCond()->getType()->isEnumeralType()) 21273e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor return; 21283e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 21293e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // Code-complete the cases of a switch statement over an enumeration type 21303e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // by providing the list of 21313e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor EnumDecl *Enum = Switch->getCond()->getType()->getAs<EnumType>()->getDecl(); 21323e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 21333e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // Determine which enumerators we have already seen in the switch statement. 21343e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // FIXME: Ideally, we would also be able to look *past* the code-completion 21353e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // token, in case we are code-completing in the middle of the switch and not 21363e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // at the end. However, we aren't able to do so at the moment. 21373e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor llvm::SmallPtrSet<EnumConstantDecl *, 8> EnumeratorsSeen; 2138b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor NestedNameSpecifier *Qualifier = 0; 21393e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor for (SwitchCase *SC = Switch->getSwitchCaseList(); SC; 21403e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor SC = SC->getNextSwitchCase()) { 21413e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor CaseStmt *Case = dyn_cast<CaseStmt>(SC); 21423e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor if (!Case) 21433e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor continue; 21443e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 21453e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor Expr *CaseVal = Case->getLHS()->IgnoreParenCasts(); 21463e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(CaseVal)) 21473e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor if (EnumConstantDecl *Enumerator 21483e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor = dyn_cast<EnumConstantDecl>(DRE->getDecl())) { 21493e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // We look into the AST of the case statement to determine which 21503e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // enumerator was named. Alternatively, we could compute the value of 21513e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // the integral constant expression, then compare it against the 21523e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // values of each enumerator. However, value-based approach would not 21533e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // work as well with C++ templates where enumerators declared within a 21543e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // template are type- and value-dependent. 21553e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor EnumeratorsSeen.insert(Enumerator); 21563e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 2157b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // If this is a qualified-id, keep track of the nested-name-specifier 2158b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // so that we can reproduce it as part of code completion, e.g., 21593e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // 21603e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // switch (TagD.getKind()) { 21613e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // case TagDecl::TK_enum: 21623e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // break; 21633e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // case XXX 21643e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // 2165b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // At the XXX, our completions are TagDecl::TK_union, 21663e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // TagDecl::TK_struct, and TagDecl::TK_class, rather than TK_union, 21673e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // TK_struct, and TK_class. 2168a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor Qualifier = DRE->getQualifier(); 21693e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor } 21703e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor } 21713e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 2172b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor if (getLangOptions().CPlusPlus && !Qualifier && EnumeratorsSeen.empty()) { 2173b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // If there are no prior enumerators in C++, check whether we have to 2174b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // qualify the names of the enumerators that we suggest, because they 2175b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // may not be visible in this scope. 2176b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor Qualifier = getRequiredQualification(Context, CurContext, 2177b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor Enum->getDeclContext()); 2178b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor 2179b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // FIXME: Scoped enums need to start with "EnumDecl" as the context! 2180b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor } 2181b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor 21823e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // Add any enumerators that have not yet been mentioned. 21833e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor ResultBuilder Results(*this); 21843e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor Results.EnterNewScope(); 21853e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor for (EnumDecl::enumerator_iterator E = Enum->enumerator_begin(), 21863e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor EEnd = Enum->enumerator_end(); 21873e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor E != EEnd; ++E) { 21883e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor if (EnumeratorsSeen.count(*E)) 21893e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor continue; 21903e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 2191608300be1972c43fe99154d25d62d697e7c0a0c2Douglas Gregor Results.AddResult(CodeCompleteConsumer::Result(*E, Qualifier), 2192608300be1972c43fe99154d25d62d697e7c0a0c2Douglas Gregor CurContext, 0, false); 21933e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor } 21943e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor Results.ExitScope(); 21953e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 21960c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor if (CodeCompleter->includeMacros()) 2197bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddMacroResults(PP, Results); 21983a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 21993e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor} 22003e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 22019c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregornamespace { 22029c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor struct IsBetterOverloadCandidate { 22039c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor Sema &S; 22045769d6195087229770d7ac90449443e026c47103John McCall SourceLocation Loc; 22059c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 22069c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor public: 22075769d6195087229770d7ac90449443e026c47103John McCall explicit IsBetterOverloadCandidate(Sema &S, SourceLocation Loc) 22085769d6195087229770d7ac90449443e026c47103John McCall : S(S), Loc(Loc) { } 22099c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 22109c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor bool 22119c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor operator()(const OverloadCandidate &X, const OverloadCandidate &Y) const { 22125769d6195087229770d7ac90449443e026c47103John McCall return S.isBetterOverloadCandidate(X, Y, Loc); 22139c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor } 22149c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor }; 22159c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor} 22169c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 22179c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregorvoid Sema::CodeCompleteCall(Scope *S, ExprTy *FnIn, 22189c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor ExprTy **ArgsIn, unsigned NumArgs) { 22199c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor if (!CodeCompleter) 22209c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor return; 2221ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor 2222ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor // When we're code-completing for a call, we fall back to ordinary 2223ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor // name code-completion whenever we can't produce specific 2224ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor // results. We may want to revisit this strategy in the future, 2225ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor // e.g., by merging the two kinds of results. 2226ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor 22279c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor Expr *Fn = (Expr *)FnIn; 22289c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor Expr **Args = (Expr **)ArgsIn; 2229ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor 22309c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor // Ignore type-dependent call expressions entirely. 22319c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor if (Fn->isTypeDependent() || 2232ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor Expr::hasAnyTypeDependentArguments(Args, NumArgs)) { 223301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor CodeCompleteOrdinaryName(S, CCC_Expression); 22349c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor return; 2235ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor } 22369c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 22373b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall // Build an overload candidate set based on the functions we find. 22385769d6195087229770d7ac90449443e026c47103John McCall SourceLocation Loc = Fn->getExprLoc(); 22395769d6195087229770d7ac90449443e026c47103John McCall OverloadCandidateSet CandidateSet(Loc); 22403b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall 22419c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor // FIXME: What if we're calling something that isn't a function declaration? 22429c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor // FIXME: What if we're calling a pseudo-destructor? 22439c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor // FIXME: What if we're calling a member function? 22449c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 2245c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor typedef CodeCompleteConsumer::OverloadCandidate ResultCandidate; 2246c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor llvm::SmallVector<ResultCandidate, 8> Results; 2247c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor 22483b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall Expr *NakedFn = Fn->IgnoreParenCasts(); 22493b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(NakedFn)) 22503b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall AddOverloadedCallCandidates(ULE, Args, NumArgs, CandidateSet, 22513b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall /*PartialOverloading=*/ true); 22523b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall else if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(NakedFn)) { 22533b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall FunctionDecl *FDecl = dyn_cast<FunctionDecl>(DRE->getDecl()); 2254c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor if (FDecl) { 2255c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor if (!FDecl->getType()->getAs<FunctionProtoType>()) 2256c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor Results.push_back(ResultCandidate(FDecl)); 2257c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor else 225886820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall // FIXME: access? 22599aa472c45d2bd81b7b52c225e8acc560d716db97John McCall AddOverloadCandidate(FDecl, DeclAccessPair::make(FDecl, AS_none), 22609aa472c45d2bd81b7b52c225e8acc560d716db97John McCall Args, NumArgs, CandidateSet, 2261c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor false, false, /*PartialOverloading*/ true); 2262c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor } 22633b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall } 22649c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 2265c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor if (!CandidateSet.empty()) { 2266c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor // Sort the overload candidate set by placing the best overloads first. 2267c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor std::stable_sort(CandidateSet.begin(), CandidateSet.end(), 22685769d6195087229770d7ac90449443e026c47103John McCall IsBetterOverloadCandidate(*this, Loc)); 2269c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor 2270c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor // Add the remaining viable overload candidates as code-completion reslults. 2271c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor for (OverloadCandidateSet::iterator Cand = CandidateSet.begin(), 2272c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor CandEnd = CandidateSet.end(); 2273c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor Cand != CandEnd; ++Cand) { 2274c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor if (Cand->Viable) 2275c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor Results.push_back(ResultCandidate(Cand->Function)); 2276c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor } 22779c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor } 2278ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor 2279ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor if (Results.empty()) 228001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor CodeCompleteOrdinaryName(S, CCC_Expression); 2281ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor else 2282ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor CodeCompleter->ProcessOverloadCandidates(*this, NumArgs, Results.data(), 2283ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor Results.size()); 22849c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor} 22859c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 228681b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregorvoid Sema::CodeCompleteQualifiedId(Scope *S, const CXXScopeSpec &SS, 228781b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor bool EnteringContext) { 228881b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor if (!SS.getScopeRep() || !CodeCompleter) 228981b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor return; 229081b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor 229186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor DeclContext *Ctx = computeDeclContext(SS, EnteringContext); 229286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!Ctx) 229386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return; 2294d1cd31aeb806077340be94e32429f3192cf139b0Douglas Gregor 2295d1cd31aeb806077340be94e32429f3192cf139b0Douglas Gregor // Try to instantiate any non-dependent declaration contexts before 2296d1cd31aeb806077340be94e32429f3192cf139b0Douglas Gregor // we look in them. 2297d1cd31aeb806077340be94e32429f3192cf139b0Douglas Gregor if (!isDependentScopeSpecifier(SS) && RequireCompleteDeclContext(SS)) 2298d1cd31aeb806077340be94e32429f3192cf139b0Douglas Gregor return; 2299d1cd31aeb806077340be94e32429f3192cf139b0Douglas Gregor 230086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ResultBuilder Results(*this); 2301def9107059d460ada5f0eb3d58189c59122e3c3fDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 2302def9107059d460ada5f0eb3d58189c59122e3c3fDouglas Gregor LookupVisibleDecls(Ctx, LookupOrdinaryName, Consumer); 230386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 230486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // The "template" keyword can follow "::" in the grammar, but only 230586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // put it into the grammar if the nested-name-specifier is dependent. 230686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NestedNameSpecifier *NNS = (NestedNameSpecifier *)SS.getScopeRep(); 230786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!Results.empty() && NNS->isDependent()) 2308a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult("template"); 230986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 23100c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor if (CodeCompleter->includeMacros()) 2311bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddMacroResults(PP, Results); 23123a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 231381b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor} 231449f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 231549f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregorvoid Sema::CodeCompleteUsing(Scope *S) { 231649f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor if (!CodeCompleter) 231749f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor return; 231849f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 231986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ResultBuilder Results(*this, &ResultBuilder::IsNestedNameSpecifier); 23208e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.EnterNewScope(); 232186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 232286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // If we aren't in class scope, we could see the "namespace" keyword. 232386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!S->isClassScope()) 2324a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(CodeCompleteConsumer::Result("namespace")); 232586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 232686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // After "using", we can see anything that would start a 232786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // nested-name-specifier. 23285d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 23295d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer); 23308e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.ExitScope(); 233186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 23320c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor if (CodeCompleter->includeMacros()) 2333bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddMacroResults(PP, Results); 23343a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 233549f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor} 233649f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 233749f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregorvoid Sema::CodeCompleteUsingDirective(Scope *S) { 233849f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor if (!CodeCompleter) 233949f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor return; 234049f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 234186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // After "using namespace", we expect to see a namespace name or namespace 234286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // alias. 234386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ResultBuilder Results(*this, &ResultBuilder::IsNamespaceOrAlias); 23448e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.EnterNewScope(); 23455d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 23465d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer); 23478e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.ExitScope(); 23480c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor if (CodeCompleter->includeMacros()) 2349bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddMacroResults(PP, Results); 23503a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 235149f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor} 235249f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 235349f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregorvoid Sema::CodeCompleteNamespaceDecl(Scope *S) { 235449f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor if (!CodeCompleter) 235549f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor return; 235649f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 235786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ResultBuilder Results(*this, &ResultBuilder::IsNamespace); 235886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor DeclContext *Ctx = (DeclContext *)S->getEntity(); 235986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!S->getParent()) 236086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Ctx = Context.getTranslationUnitDecl(); 236186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 236286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (Ctx && Ctx->isFileContext()) { 236386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // We only want to see those namespaces that have already been defined 236486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // within this scope, because its likely that the user is creating an 236586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // extended namespace declaration. Keep track of the most recent 236686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // definition of each namespace. 236786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor std::map<NamespaceDecl *, NamespaceDecl *> OrigToLatest; 236886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor for (DeclContext::specific_decl_iterator<NamespaceDecl> 236986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NS(Ctx->decls_begin()), NSEnd(Ctx->decls_end()); 237086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NS != NSEnd; ++NS) 237186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor OrigToLatest[NS->getOriginalNamespace()] = *NS; 237286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 237386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add the most recent definition (or extended definition) of each 237486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // namespace to the list of results. 23758e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.EnterNewScope(); 237686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor for (std::map<NamespaceDecl *, NamespaceDecl *>::iterator 237786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NS = OrigToLatest.begin(), NSEnd = OrigToLatest.end(); 237886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NS != NSEnd; ++NS) 2379608300be1972c43fe99154d25d62d697e7c0a0c2Douglas Gregor Results.AddResult(CodeCompleteConsumer::Result(NS->second, 0), 2380608300be1972c43fe99154d25d62d697e7c0a0c2Douglas Gregor CurContext, 0, false); 23818e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.ExitScope(); 238286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 238386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 23840c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor if (CodeCompleter->includeMacros()) 2385bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddMacroResults(PP, Results); 23863a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 238749f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor} 238849f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 238949f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregorvoid Sema::CodeCompleteNamespaceAliasDecl(Scope *S) { 239049f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor if (!CodeCompleter) 239149f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor return; 239249f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 239386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // After "namespace", we expect to see a namespace or alias. 239486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ResultBuilder Results(*this, &ResultBuilder::IsNamespaceOrAlias); 23955d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 23965d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer); 23970c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor if (CodeCompleter->includeMacros()) 2398bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddMacroResults(PP, Results); 23993a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 240049f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor} 240149f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 2402ed8d322b4086b8b1e1f78b21389cabb23457dcb3Douglas Gregorvoid Sema::CodeCompleteOperatorName(Scope *S) { 2403ed8d322b4086b8b1e1f78b21389cabb23457dcb3Douglas Gregor if (!CodeCompleter) 2404ed8d322b4086b8b1e1f78b21389cabb23457dcb3Douglas Gregor return; 240586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 240686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor typedef CodeCompleteConsumer::Result Result; 240786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ResultBuilder Results(*this, &ResultBuilder::IsType); 24088e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.EnterNewScope(); 240986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 241086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add the names of overloadable operators. 241186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 241286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (std::strcmp(Spelling, "?")) \ 2413a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Spelling)); 241486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor#include "clang/Basic/OperatorKinds.def" 241586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 241686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add any type names visible from the current scope 241745bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor Results.allowNestedNameSpecifiers(); 24185d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 24195d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer); 242086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 242186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add any type specifiers 2422bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddTypeSpecifierResults(getLangOptions(), Results); 24238e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.ExitScope(); 2424ed8d322b4086b8b1e1f78b21389cabb23457dcb3Douglas Gregor 24250c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor if (CodeCompleter->includeMacros()) 2426bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddMacroResults(PP, Results); 24273a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 2428c464ae8444edb6d07ea49b7a0eae1674c0fa1bb8Douglas Gregor} 2429c464ae8444edb6d07ea49b7a0eae1674c0fa1bb8Douglas Gregor 2430b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor// Macro that expands to @Keyword or Keyword, depending on whether NeedAt is 2431b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor// true or false. 2432b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor#define OBJC_AT_KEYWORD_NAME(NeedAt,Keyword) NeedAt? "@" #Keyword : #Keyword 2433bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCImplementationResults(const LangOptions &LangOpts, 2434b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor ResultBuilder &Results, 2435b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor bool NeedAt) { 2436c464ae8444edb6d07ea49b7a0eae1674c0fa1bb8Douglas Gregor typedef CodeCompleteConsumer::Result Result; 2437b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // Since we have an implementation, we can end it. 2438a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,end))); 2439b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 2440b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor CodeCompletionString *Pattern = 0; 2441b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor if (LangOpts.ObjC2) { 2442b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @dynamic 2443c464ae8444edb6d07ea49b7a0eae1674c0fa1bb8Douglas Gregor Pattern = new CodeCompletionString; 2444b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,dynamic)); 2445834389b87451b24618513b907b4dfb5b00d211f3Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 2446b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddPlaceholderChunk("property"); 2447a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 2448b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 2449b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @synthesize 2450c464ae8444edb6d07ea49b7a0eae1674c0fa1bb8Douglas Gregor Pattern = new CodeCompletionString; 2451b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,synthesize)); 2452834389b87451b24618513b907b4dfb5b00d211f3Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 2453b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddPlaceholderChunk("property"); 2454a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 2455b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor } 2456b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor} 2457c464ae8444edb6d07ea49b7a0eae1674c0fa1bb8Douglas Gregor 2458bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCInterfaceResults(const LangOptions &LangOpts, 2459b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor ResultBuilder &Results, 2460b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor bool NeedAt) { 2461b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor typedef CodeCompleteConsumer::Result Result; 2462b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 2463b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // Since we have an interface or protocol, we can end it. 2464a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,end))); 2465b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 2466b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor if (LangOpts.ObjC2) { 2467b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @property 2468a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,property))); 2469b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 2470b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @required 2471a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,required))); 2472b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 2473b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @optional 2474a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,optional))); 2475b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor } 2476b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor} 2477834389b87451b24618513b907b4dfb5b00d211f3Douglas Gregor 2478bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCTopLevelResults(ResultBuilder &Results, bool NeedAt) { 2479b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor typedef CodeCompleteConsumer::Result Result; 2480b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor CodeCompletionString *Pattern = 0; 2481b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 2482b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @class name ; 2483b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern = new CodeCompletionString; 2484b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,class)); 2485b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 2486b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddPlaceholderChunk("identifier"); 2487b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_SemiColon); 2488a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 2489b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 2490b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @interface name 2491b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // FIXME: Could introduce the whole pattern, including superclasses and 2492b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // such. 2493b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern = new CodeCompletionString; 2494b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,interface)); 2495b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 2496b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddPlaceholderChunk("class"); 2497a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 2498b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 2499b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @protocol name 2500b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern = new CodeCompletionString; 2501b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,protocol)); 2502b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 2503b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddPlaceholderChunk("protocol"); 2504a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 2505b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 2506b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @implementation name 2507b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern = new CodeCompletionString; 2508b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,implementation)); 2509b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 2510b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddPlaceholderChunk("class"); 2511a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 2512b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 2513b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @compatibility_alias name 2514b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern = new CodeCompletionString; 2515b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,compatibility_alias)); 2516b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 2517b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddPlaceholderChunk("alias"); 2518b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 2519b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddPlaceholderChunk("class"); 2520a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 2521b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor} 2522834389b87451b24618513b907b4dfb5b00d211f3Douglas Gregor 2523b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregorvoid Sema::CodeCompleteObjCAtDirective(Scope *S, DeclPtrTy ObjCImpDecl, 2524b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor bool InInterface) { 2525b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor typedef CodeCompleteConsumer::Result Result; 2526b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor ResultBuilder Results(*this); 2527b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Results.EnterNewScope(); 2528b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor if (ObjCImpDecl) 2529bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCImplementationResults(getLangOptions(), Results, false); 2530b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor else if (InInterface) 2531bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCInterfaceResults(getLangOptions(), Results, false); 2532b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor else 2533bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCTopLevelResults(Results, false); 2534c464ae8444edb6d07ea49b7a0eae1674c0fa1bb8Douglas Gregor Results.ExitScope(); 2535c464ae8444edb6d07ea49b7a0eae1674c0fa1bb8Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 25369a0c85e640a08174569a303db22981612f05d385Douglas Gregor} 25379a0c85e640a08174569a303db22981612f05d385Douglas Gregor 2538bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCExpressionResults(ResultBuilder &Results, bool NeedAt) { 25399a0c85e640a08174569a303db22981612f05d385Douglas Gregor typedef CodeCompleteConsumer::Result Result; 25409a0c85e640a08174569a303db22981612f05d385Douglas Gregor CodeCompletionString *Pattern = 0; 25419a0c85e640a08174569a303db22981612f05d385Douglas Gregor 25429a0c85e640a08174569a303db22981612f05d385Douglas Gregor // @encode ( type-name ) 25439a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern = new CodeCompletionString; 2544b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,encode)); 25459a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 25469a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddPlaceholderChunk("type-name"); 25479a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 2548a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 25499a0c85e640a08174569a303db22981612f05d385Douglas Gregor 25509a0c85e640a08174569a303db22981612f05d385Douglas Gregor // @protocol ( protocol-name ) 25519a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern = new CodeCompletionString; 2552b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,protocol)); 25539a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 25549a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddPlaceholderChunk("protocol-name"); 25559a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 2556a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 25579a0c85e640a08174569a303db22981612f05d385Douglas Gregor 25589a0c85e640a08174569a303db22981612f05d385Douglas Gregor // @selector ( selector ) 25599a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern = new CodeCompletionString; 2560b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,selector)); 25619a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 25629a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddPlaceholderChunk("selector"); 25639a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 2564a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 25659a0c85e640a08174569a303db22981612f05d385Douglas Gregor} 25669a0c85e640a08174569a303db22981612f05d385Douglas Gregor 2567bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCStatementResults(ResultBuilder &Results, bool NeedAt) { 25689a0c85e640a08174569a303db22981612f05d385Douglas Gregor typedef CodeCompleteConsumer::Result Result; 25699a0c85e640a08174569a303db22981612f05d385Douglas Gregor CodeCompletionString *Pattern = 0; 2570b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 25719a0c85e640a08174569a303db22981612f05d385Douglas Gregor // @try { statements } @catch ( declaration ) { statements } @finally 25729a0c85e640a08174569a303db22981612f05d385Douglas Gregor // { statements } 25739a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern = new CodeCompletionString; 2574b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,try)); 25759a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftBrace); 25769a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddPlaceholderChunk("statements"); 25779a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightBrace); 25789a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddTextChunk("@catch"); 25799a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 25809a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddPlaceholderChunk("parameter"); 25819a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 25829a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftBrace); 25839a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddPlaceholderChunk("statements"); 25849a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightBrace); 25859a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddTextChunk("@finally"); 25869a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftBrace); 25879a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddPlaceholderChunk("statements"); 25889a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightBrace); 2589a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 2590b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 25919a0c85e640a08174569a303db22981612f05d385Douglas Gregor // @throw 25929a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern = new CodeCompletionString; 2593b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,throw)); 2594834389b87451b24618513b907b4dfb5b00d211f3Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 25959a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddPlaceholderChunk("expression"); 2596834389b87451b24618513b907b4dfb5b00d211f3Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_SemiColon); 2597a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 2598b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 25999a0c85e640a08174569a303db22981612f05d385Douglas Gregor // @synchronized ( expression ) { statements } 26009a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern = new CodeCompletionString; 2601b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,synchronized)); 2602834389b87451b24618513b907b4dfb5b00d211f3Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 26039a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 26049a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddPlaceholderChunk("expression"); 26059a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 26069a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftBrace); 26079a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddPlaceholderChunk("statements"); 26089a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightBrace); 2609a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 2610b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor} 26119a0c85e640a08174569a303db22981612f05d385Douglas Gregor 2612bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCVisibilityResults(const LangOptions &LangOpts, 2613c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor ResultBuilder &Results, 2614c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor bool NeedAt) { 2615b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor typedef CodeCompleteConsumer::Result Result; 2616a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,private))); 2617a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,protected))); 2618a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,public))); 2619c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor if (LangOpts.ObjC2) 2620a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,package))); 2621c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor} 2622c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor 2623c38c3e1e726630458154534227d74eda833d26a0Douglas Gregorvoid Sema::CodeCompleteObjCAtVisibility(Scope *S) { 2624c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor ResultBuilder Results(*this); 2625c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor Results.EnterNewScope(); 2626bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCVisibilityResults(getLangOptions(), Results, false); 2627c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor Results.ExitScope(); 2628c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 2629c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor} 2630c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor 2631c38c3e1e726630458154534227d74eda833d26a0Douglas Gregorvoid Sema::CodeCompleteObjCAtStatement(Scope *S) { 2632b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor ResultBuilder Results(*this); 2633b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Results.EnterNewScope(); 2634bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCStatementResults(Results, false); 2635bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCExpressionResults(Results, false); 26369a0c85e640a08174569a303db22981612f05d385Douglas Gregor Results.ExitScope(); 26379a0c85e640a08174569a303db22981612f05d385Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 26389a0c85e640a08174569a303db22981612f05d385Douglas Gregor} 26399a0c85e640a08174569a303db22981612f05d385Douglas Gregor 26409a0c85e640a08174569a303db22981612f05d385Douglas Gregorvoid Sema::CodeCompleteObjCAtExpression(Scope *S) { 26419a0c85e640a08174569a303db22981612f05d385Douglas Gregor ResultBuilder Results(*this); 26429a0c85e640a08174569a303db22981612f05d385Douglas Gregor Results.EnterNewScope(); 2643bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCExpressionResults(Results, false); 26449a0c85e640a08174569a303db22981612f05d385Douglas Gregor Results.ExitScope(); 26459a0c85e640a08174569a303db22981612f05d385Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 2646ed8d322b4086b8b1e1f78b21389cabb23457dcb3Douglas Gregor} 264749f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 2648988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor/// \brief Determine whether the addition of the given flag to an Objective-C 2649988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor/// property's attributes will cause a conflict. 2650988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregorstatic bool ObjCPropertyFlagConflicts(unsigned Attributes, unsigned NewFlag) { 2651988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor // Check if we've already added this flag. 2652988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (Attributes & NewFlag) 2653988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor return true; 2654988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor 2655988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor Attributes |= NewFlag; 2656988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor 2657988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor // Check for collisions with "readonly". 2658988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if ((Attributes & ObjCDeclSpec::DQ_PR_readonly) && 2659988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor (Attributes & (ObjCDeclSpec::DQ_PR_readwrite | 2660988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor ObjCDeclSpec::DQ_PR_assign | 2661988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor ObjCDeclSpec::DQ_PR_copy | 2662988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor ObjCDeclSpec::DQ_PR_retain))) 2663988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor return true; 2664988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor 2665988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor // Check for more than one of { assign, copy, retain }. 2666988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor unsigned AssignCopyRetMask = Attributes & (ObjCDeclSpec::DQ_PR_assign | 2667988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor ObjCDeclSpec::DQ_PR_copy | 2668988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor ObjCDeclSpec::DQ_PR_retain); 2669988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (AssignCopyRetMask && 2670988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor AssignCopyRetMask != ObjCDeclSpec::DQ_PR_assign && 2671988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor AssignCopyRetMask != ObjCDeclSpec::DQ_PR_copy && 2672988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor AssignCopyRetMask != ObjCDeclSpec::DQ_PR_retain) 2673988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor return true; 2674988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor 2675988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor return false; 2676988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor} 2677988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor 2678a93b108e025ef2480fa867cc533e7781a40a639bDouglas Gregorvoid Sema::CodeCompleteObjCPropertyFlags(Scope *S, ObjCDeclSpec &ODS) { 2679ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff if (!CodeCompleter) 2680ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff return; 2681d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor 2682ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff unsigned Attributes = ODS.getPropertyAttributes(); 2683ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff 2684ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff typedef CodeCompleteConsumer::Result Result; 2685ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff ResultBuilder Results(*this); 2686ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff Results.EnterNewScope(); 2687988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_readonly)) 2688a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(CodeCompleteConsumer::Result("readonly")); 2689988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_assign)) 2690a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(CodeCompleteConsumer::Result("assign")); 2691988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_readwrite)) 2692a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(CodeCompleteConsumer::Result("readwrite")); 2693988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_retain)) 2694a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(CodeCompleteConsumer::Result("retain")); 2695988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_copy)) 2696a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(CodeCompleteConsumer::Result("copy")); 2697988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_nonatomic)) 2698a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(CodeCompleteConsumer::Result("nonatomic")); 2699988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_setter)) { 270054f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor CodeCompletionString *Setter = new CodeCompletionString; 270154f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor Setter->AddTypedTextChunk("setter"); 270254f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor Setter->AddTextChunk(" = "); 270354f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor Setter->AddPlaceholderChunk("method"); 2704a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(CodeCompleteConsumer::Result(Setter)); 270554f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor } 2706988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_getter)) { 270754f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor CodeCompletionString *Getter = new CodeCompletionString; 270854f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor Getter->AddTypedTextChunk("getter"); 270954f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor Getter->AddTextChunk(" = "); 271054f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor Getter->AddPlaceholderChunk("method"); 2711a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(CodeCompleteConsumer::Result(Getter)); 271254f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor } 2713ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff Results.ExitScope(); 27143a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 2715ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff} 2716c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff 27174ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor/// \brief Descripts the kind of Objective-C method that we want to find 27184ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor/// via code completion. 27194ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregorenum ObjCMethodKind { 27204ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor MK_Any, //< Any kind of method, provided it means other specified criteria. 27214ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor MK_ZeroArgSelector, //< Zero-argument (unary) selector. 27224ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor MK_OneArgSelector //< One-argument selector. 27234ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor}; 27244ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 27254ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregorstatic bool isAcceptableObjCMethod(ObjCMethodDecl *Method, 27264ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor ObjCMethodKind WantKind, 27274ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor IdentifierInfo **SelIdents, 27284ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor unsigned NumSelIdents) { 27294ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Selector Sel = Method->getSelector(); 27304ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (NumSelIdents > Sel.getNumArgs()) 27314ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor return false; 27324ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 27334ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor switch (WantKind) { 27344ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor case MK_Any: break; 27354ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor case MK_ZeroArgSelector: return Sel.isUnarySelector(); 27364ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor case MK_OneArgSelector: return Sel.getNumArgs() == 1; 27374ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor } 27384ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 27394ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor for (unsigned I = 0; I != NumSelIdents; ++I) 27404ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (SelIdents[I] != Sel.getIdentifierInfoForSlot(I)) 27414ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor return false; 27424ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 27434ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor return true; 27444ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor} 27454ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 274636ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// \brief Add all of the Objective-C methods in the given Objective-C 274736ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// container to the set of results. 274836ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// 274936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// The container will be a class, protocol, category, or implementation of 275036ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// any of the above. This mether will recurse to include methods from 275136ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// the superclasses of classes along with their categories, protocols, and 275236ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// implementations. 275336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// 275436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// \param Container the container in which we'll look to find methods. 275536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// 275636ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// \param WantInstance whether to add instance methods (only); if false, this 275736ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// routine will add factory methods (only). 275836ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// 275936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// \param CurContext the context in which we're performing the lookup that 276036ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// finds methods. 276136ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// 276236ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// \param Results the structure into which we'll add results. 276336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregorstatic void AddObjCMethods(ObjCContainerDecl *Container, 276436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor bool WantInstanceMethods, 27654ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor ObjCMethodKind WantKind, 2766d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor IdentifierInfo **SelIdents, 2767d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor unsigned NumSelIdents, 276836ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor DeclContext *CurContext, 276936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor ResultBuilder &Results) { 277036ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor typedef CodeCompleteConsumer::Result Result; 277136ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor for (ObjCContainerDecl::method_iterator M = Container->meth_begin(), 277236ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor MEnd = Container->meth_end(); 277336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor M != MEnd; ++M) { 2774d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor if ((*M)->isInstanceMethod() == WantInstanceMethods) { 2775d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor // Check whether the selector identifiers we've been given are a 2776d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor // subset of the identifiers for this particular method. 27774ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (!isAcceptableObjCMethod(*M, WantKind, SelIdents, NumSelIdents)) 2778d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor continue; 27794ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 2780d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor Result R = Result(*M, 0); 2781d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor R.StartParameter = NumSelIdents; 27824ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor R.AllParametersAreInformative = (WantKind != MK_Any); 2783d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor Results.MaybeAddResult(R, CurContext); 2784d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor } 278536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor } 278636ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 278736ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container); 278836ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor if (!IFace) 278936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor return; 279036ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 279136ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add methods in protocols. 279236ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor const ObjCList<ObjCProtocolDecl> &Protocols= IFace->getReferencedProtocols(); 279336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 279436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor E = Protocols.end(); 279536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor I != E; ++I) 27964ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents, NumSelIdents, 2797d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor CurContext, Results); 279836ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 279936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add methods in categories. 280036ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor for (ObjCCategoryDecl *CatDecl = IFace->getCategoryList(); CatDecl; 280136ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor CatDecl = CatDecl->getNextClassCategory()) { 28024ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(CatDecl, WantInstanceMethods, WantKind, SelIdents, 28034ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor NumSelIdents, CurContext, Results); 280436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 280536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add a categories protocol methods. 280636ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor const ObjCList<ObjCProtocolDecl> &Protocols 280736ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor = CatDecl->getReferencedProtocols(); 280836ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 280936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor E = Protocols.end(); 281036ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor I != E; ++I) 28114ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents, 28124ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor NumSelIdents, CurContext, Results); 281336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 281436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add methods in category implementations. 281536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor if (ObjCCategoryImplDecl *Impl = CatDecl->getImplementation()) 28164ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(Impl, WantInstanceMethods, WantKind, SelIdents, 28174ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor NumSelIdents, CurContext, Results); 281836ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor } 281936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 282036ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add methods in superclass. 282136ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor if (IFace->getSuperClass()) 28224ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(IFace->getSuperClass(), WantInstanceMethods, WantKind, 28234ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor SelIdents, NumSelIdents, CurContext, Results); 282436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 282536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add methods in our implementation, if any. 282636ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor if (ObjCImplementationDecl *Impl = IFace->getImplementation()) 28274ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(Impl, WantInstanceMethods, WantKind, SelIdents, 28284ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor NumSelIdents, CurContext, Results); 28294ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor} 28304ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 28314ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 28324ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregorvoid Sema::CodeCompleteObjCPropertyGetter(Scope *S, DeclPtrTy ClassDecl, 28334ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor DeclPtrTy *Methods, 28344ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor unsigned NumMethods) { 28354ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor typedef CodeCompleteConsumer::Result Result; 28364ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 28374ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor // Try to find the interface where getters might live. 28384ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor ObjCInterfaceDecl *Class 28394ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor = dyn_cast_or_null<ObjCInterfaceDecl>(ClassDecl.getAs<Decl>()); 28404ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (!Class) { 28414ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (ObjCCategoryDecl *Category 28424ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor = dyn_cast_or_null<ObjCCategoryDecl>(ClassDecl.getAs<Decl>())) 28434ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Class = Category->getClassInterface(); 28444ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 28454ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (!Class) 28464ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor return; 28474ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor } 28484ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 28494ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor // Find all of the potential getters. 28504ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor ResultBuilder Results(*this); 28514ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Results.EnterNewScope(); 28524ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 28534ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor // FIXME: We need to do this because Objective-C methods don't get 28544ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor // pushed into DeclContexts early enough. Argh! 28554ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor for (unsigned I = 0; I != NumMethods; ++I) { 28564ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (ObjCMethodDecl *Method 28574ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor = dyn_cast_or_null<ObjCMethodDecl>(Methods[I].getAs<Decl>())) 28584ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (Method->isInstanceMethod() && 28594ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor isAcceptableObjCMethod(Method, MK_ZeroArgSelector, 0, 0)) { 28604ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Result R = Result(Method, 0); 28614ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor R.AllParametersAreInformative = true; 28624ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Results.MaybeAddResult(R, CurContext); 28634ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor } 28644ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor } 28654ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 28664ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(Class, true, MK_ZeroArgSelector, 0, 0, CurContext, Results); 28674ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Results.ExitScope(); 28684ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter,Results.data(),Results.size()); 28694ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor} 28704ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 28714ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregorvoid Sema::CodeCompleteObjCPropertySetter(Scope *S, DeclPtrTy ObjCImplDecl, 28724ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor DeclPtrTy *Methods, 28734ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor unsigned NumMethods) { 28744ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor typedef CodeCompleteConsumer::Result Result; 28754ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 28764ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor // Try to find the interface where setters might live. 28774ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor ObjCInterfaceDecl *Class 28784ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor = dyn_cast_or_null<ObjCInterfaceDecl>(ObjCImplDecl.getAs<Decl>()); 28794ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (!Class) { 28804ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (ObjCCategoryDecl *Category 28814ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor = dyn_cast_or_null<ObjCCategoryDecl>(ObjCImplDecl.getAs<Decl>())) 28824ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Class = Category->getClassInterface(); 28834ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 28844ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (!Class) 28854ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor return; 28864ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor } 28874ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 28884ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor // Find all of the potential getters. 28894ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor ResultBuilder Results(*this); 28904ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Results.EnterNewScope(); 28914ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 28924ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor // FIXME: We need to do this because Objective-C methods don't get 28934ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor // pushed into DeclContexts early enough. Argh! 28944ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor for (unsigned I = 0; I != NumMethods; ++I) { 28954ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (ObjCMethodDecl *Method 28964ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor = dyn_cast_or_null<ObjCMethodDecl>(Methods[I].getAs<Decl>())) 28974ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (Method->isInstanceMethod() && 28984ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor isAcceptableObjCMethod(Method, MK_OneArgSelector, 0, 0)) { 28994ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Result R = Result(Method, 0); 29004ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor R.AllParametersAreInformative = true; 29014ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Results.MaybeAddResult(R, CurContext); 29024ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor } 29034ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor } 29044ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 29054ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(Class, true, MK_OneArgSelector, 0, 0, CurContext, Results); 29064ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 29074ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Results.ExitScope(); 29084ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter,Results.data(),Results.size()); 290936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor} 291036ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 291160b01cc44855d62979f76dc4cdffa4277f321049Douglas Gregorvoid Sema::CodeCompleteObjCClassMessage(Scope *S, IdentifierInfo *FName, 2912d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor SourceLocation FNameLoc, 2913d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor IdentifierInfo **SelIdents, 2914d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor unsigned NumSelIdents) { 2915c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff typedef CodeCompleteConsumer::Result Result; 291624a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor ObjCInterfaceDecl *CDecl = 0; 291724a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor 291824a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor if (FName->isStr("super")) { 291924a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor // We're sending a message to "super". 292024a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) { 292124a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor // Figure out which interface we're in. 292224a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor CDecl = CurMethod->getClassInterface(); 292324a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor if (!CDecl) 292424a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor return; 292524a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor 292624a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor // Find the superclass of this class. 292724a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor CDecl = CDecl->getSuperClass(); 292824a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor if (!CDecl) 292924a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor return; 293024a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor 293124a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor if (CurMethod->isInstanceMethod()) { 293224a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor // We are inside an instance method, which means that the message 293324a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor // send [super ...] is actually calling an instance method on the 293424a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor // current object. Build the super expression and handle this like 293524a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor // an instance method. 293624a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor QualType SuperTy = Context.getObjCInterfaceType(CDecl); 293724a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor SuperTy = Context.getObjCObjectPointerType(SuperTy); 293824a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor OwningExprResult Super 293960b01cc44855d62979f76dc4cdffa4277f321049Douglas Gregor = Owned(new (Context) ObjCSuperExpr(FNameLoc, SuperTy)); 2940d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor return CodeCompleteObjCInstanceMessage(S, (Expr *)Super.get(), 2941d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor SelIdents, NumSelIdents); 294224a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor } 294324a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor 294424a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor // Okay, we're calling a factory method in our superclass. 294524a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor } 294624a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor } 294724a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor 294824a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor // If the given name refers to an interface type, retrieve the 294924a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor // corresponding declaration. 295024a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor if (!CDecl) 295160b01cc44855d62979f76dc4cdffa4277f321049Douglas Gregor if (TypeTy *Ty = getTypeName(*FName, FNameLoc, S, 0, false)) { 295224a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor QualType T = GetTypeFromParser(Ty, 0); 295324a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor if (!T.isNull()) 295424a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor if (const ObjCInterfaceType *Interface = T->getAs<ObjCInterfaceType>()) 295524a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor CDecl = Interface->getDecl(); 295624a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor } 295724a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor 295824a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor if (!CDecl && FName->isStr("super")) { 295924a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor // "super" may be the name of a variable, in which case we are 296024a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor // probably calling an instance method. 2961f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall CXXScopeSpec SS; 2962f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall UnqualifiedId id; 2963f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall id.setIdentifier(FName, FNameLoc); 2964f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall OwningExprResult Super = ActOnIdExpression(S, SS, id, false, false); 2965d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor return CodeCompleteObjCInstanceMessage(S, (Expr *)Super.get(), 2966d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor SelIdents, NumSelIdents); 296724a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor } 296824a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor 296936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add all of the factory methods in this Objective-C class, its protocols, 297036ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // superclasses, categories, implementation, etc. 2971c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff ResultBuilder Results(*this); 2972c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff Results.EnterNewScope(); 29734ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(CDecl, false, MK_Any, SelIdents, NumSelIdents, CurContext, 29744ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Results); 2975c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff Results.ExitScope(); 297636ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 2977c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff // This also suppresses remaining diagnostics. 29783a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 2979c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff} 2980c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff 2981d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregorvoid Sema::CodeCompleteObjCInstanceMessage(Scope *S, ExprTy *Receiver, 2982d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor IdentifierInfo **SelIdents, 2983d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor unsigned NumSelIdents) { 2984c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff typedef CodeCompleteConsumer::Result Result; 2985c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff 2986c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff Expr *RecExpr = static_cast<Expr *>(Receiver); 2987c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff 298836ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // If necessary, apply function/array conversion to the receiver. 298936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // C99 6.7.5.3p[7,8]. 2990a873dfc9e7314681bb37efd9ab185045de121e43Douglas Gregor DefaultFunctionArrayLvalueConversion(RecExpr); 299136ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor QualType ReceiverType = RecExpr->getType(); 2992c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff 299336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor if (ReceiverType->isObjCIdType() || ReceiverType->isBlockPointerType()) { 299436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // FIXME: We're messaging 'id'. Do we actually want to look up every method 299536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // in the universe? 299636ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor return; 299736ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor } 299836ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 299936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Build the set of methods we can see. 300036ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor ResultBuilder Results(*this); 300136ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor Results.EnterNewScope(); 300236ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 3003f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // Handle messages to Class. This really isn't a message to an instance 3004f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // method, so we treat it the same way we would treat a message send to a 3005f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // class method. 3006f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor if (ReceiverType->isObjCClassType() || 3007f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor ReceiverType->isObjCQualifiedClassType()) { 3008f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) { 3009f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor if (ObjCInterfaceDecl *ClassDecl = CurMethod->getClassInterface()) 30104ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(ClassDecl, false, MK_Any, SelIdents, NumSelIdents, 30114ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor CurContext, Results); 3012f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor } 3013f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor } 3014f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // Handle messages to a qualified ID ("id<foo>"). 3015f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor else if (const ObjCObjectPointerType *QualID 3016f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor = ReceiverType->getAsObjCQualifiedIdType()) { 3017f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // Search protocols for instance methods. 3018f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor for (ObjCObjectPointerType::qual_iterator I = QualID->qual_begin(), 3019f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor E = QualID->qual_end(); 3020f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor I != E; ++I) 30214ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(*I, true, MK_Any, SelIdents, NumSelIdents, CurContext, 30224ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Results); 3023f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor } 3024f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // Handle messages to a pointer to interface type. 3025f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor else if (const ObjCObjectPointerType *IFacePtr 3026f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor = ReceiverType->getAsObjCInterfacePointerType()) { 3027f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // Search the class, its superclasses, etc., for instance methods. 30284ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(IFacePtr->getInterfaceDecl(), true, MK_Any, SelIdents, 30294ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor NumSelIdents, CurContext, Results); 3030f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor 3031f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // Search protocols for instance methods. 3032f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor for (ObjCObjectPointerType::qual_iterator I = IFacePtr->qual_begin(), 3033f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor E = IFacePtr->qual_end(); 3034f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor I != E; ++I) 30354ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(*I, true, MK_Any, SelIdents, NumSelIdents, CurContext, 30364ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Results); 3037f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor } 303836ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 3039f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor Results.ExitScope(); 30403a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 3041c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff} 304255385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor 304355385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor/// \brief Add all of the protocol declarations that we find in the given 304455385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor/// (translation unit) context. 304555385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregorstatic void AddProtocolResults(DeclContext *Ctx, DeclContext *CurContext, 3046083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor bool OnlyForwardDeclarations, 304755385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor ResultBuilder &Results) { 304855385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor typedef CodeCompleteConsumer::Result Result; 304955385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor 305055385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor for (DeclContext::decl_iterator D = Ctx->decls_begin(), 305155385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor DEnd = Ctx->decls_end(); 305255385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor D != DEnd; ++D) { 305355385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor // Record any protocols we find. 305455385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor if (ObjCProtocolDecl *Proto = dyn_cast<ObjCProtocolDecl>(*D)) 3055083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor if (!OnlyForwardDeclarations || Proto->isForwardDecl()) 3056608300be1972c43fe99154d25d62d697e7c0a0c2Douglas Gregor Results.AddResult(Result(Proto, 0), CurContext, 0, false); 305755385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor 305855385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor // Record any forward-declared protocols we find. 305955385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor if (ObjCForwardProtocolDecl *Forward 306055385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor = dyn_cast<ObjCForwardProtocolDecl>(*D)) { 306155385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor for (ObjCForwardProtocolDecl::protocol_iterator 306255385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor P = Forward->protocol_begin(), 306355385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor PEnd = Forward->protocol_end(); 306455385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor P != PEnd; ++P) 3065083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor if (!OnlyForwardDeclarations || (*P)->isForwardDecl()) 3066608300be1972c43fe99154d25d62d697e7c0a0c2Douglas Gregor Results.AddResult(Result(*P, 0), CurContext, 0, false); 306755385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor } 306855385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor } 306955385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor} 307055385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor 307155385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregorvoid Sema::CodeCompleteObjCProtocolReferences(IdentifierLocPair *Protocols, 307255385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor unsigned NumProtocols) { 307355385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor ResultBuilder Results(*this); 307455385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor Results.EnterNewScope(); 307555385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor 307655385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor // Tell the result set to ignore all of the protocols we have 307755385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor // already seen. 307855385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor for (unsigned I = 0; I != NumProtocols; ++I) 307955385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor if (ObjCProtocolDecl *Protocol = LookupProtocol(Protocols[I].first)) 308055385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor Results.Ignore(Protocol); 308155385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor 308255385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor // Add all protocols. 3083083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor AddProtocolResults(Context.getTranslationUnitDecl(), CurContext, false, 3084083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor Results); 3085083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor 3086083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor Results.ExitScope(); 3087083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 3088083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor} 3089083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor 3090083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregorvoid Sema::CodeCompleteObjCProtocolDecl(Scope *) { 3091083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor ResultBuilder Results(*this); 3092083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor Results.EnterNewScope(); 3093083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor 3094083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor // Add all protocols. 3095083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor AddProtocolResults(Context.getTranslationUnitDecl(), CurContext, true, 3096083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor Results); 309755385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor 309855385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor Results.ExitScope(); 309955385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 310055385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor} 31013b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 31023b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor/// \brief Add all of the Objective-C interface declarations that we find in 31033b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor/// the given (translation unit) context. 31043b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregorstatic void AddInterfaceResults(DeclContext *Ctx, DeclContext *CurContext, 31053b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor bool OnlyForwardDeclarations, 31063b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor bool OnlyUnimplemented, 31073b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor ResultBuilder &Results) { 31083b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor typedef CodeCompleteConsumer::Result Result; 31093b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 31103b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor for (DeclContext::decl_iterator D = Ctx->decls_begin(), 31113b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor DEnd = Ctx->decls_end(); 31123b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor D != DEnd; ++D) { 31133b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor // Record any interfaces we find. 31143b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor if (ObjCInterfaceDecl *Class = dyn_cast<ObjCInterfaceDecl>(*D)) 31153b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor if ((!OnlyForwardDeclarations || Class->isForwardDecl()) && 31163b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor (!OnlyUnimplemented || !Class->getImplementation())) 3117608300be1972c43fe99154d25d62d697e7c0a0c2Douglas Gregor Results.AddResult(Result(Class, 0), CurContext, 0, false); 31183b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 31193b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor // Record any forward-declared interfaces we find. 31203b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor if (ObjCClassDecl *Forward = dyn_cast<ObjCClassDecl>(*D)) { 31213b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor for (ObjCClassDecl::iterator C = Forward->begin(), CEnd = Forward->end(); 31223b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor C != CEnd; ++C) 31233b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor if ((!OnlyForwardDeclarations || C->getInterface()->isForwardDecl()) && 31243b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor (!OnlyUnimplemented || !C->getInterface()->getImplementation())) 3125608300be1972c43fe99154d25d62d697e7c0a0c2Douglas Gregor Results.AddResult(Result(C->getInterface(), 0), CurContext, 3126608300be1972c43fe99154d25d62d697e7c0a0c2Douglas Gregor 0, false); 31273b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor } 31283b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor } 31293b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor} 31303b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 31313b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregorvoid Sema::CodeCompleteObjCInterfaceDecl(Scope *S) { 31323b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor ResultBuilder Results(*this); 31333b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.EnterNewScope(); 31343b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 31353b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor // Add all classes. 31363b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, true, 31373b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor false, Results); 31383b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 31393b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.ExitScope(); 31403b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 31413b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor} 31423b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 31433b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregorvoid Sema::CodeCompleteObjCSuperclass(Scope *S, IdentifierInfo *ClassName) { 31443b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor ResultBuilder Results(*this); 31453b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.EnterNewScope(); 31463b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 31473b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor // Make sure that we ignore the class we're currently defining. 31483b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor NamedDecl *CurClass 31493b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor = LookupSingleName(TUScope, ClassName, LookupOrdinaryName); 315033ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor if (CurClass && isa<ObjCInterfaceDecl>(CurClass)) 31513b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.Ignore(CurClass); 31523b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 31533b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor // Add all classes. 31543b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false, 31553b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor false, Results); 31563b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 31573b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.ExitScope(); 31583b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 31593b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor} 31603b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 31613b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregorvoid Sema::CodeCompleteObjCImplementationDecl(Scope *S) { 31623b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor ResultBuilder Results(*this); 31633b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.EnterNewScope(); 31643b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 31653b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor // Add all unimplemented classes. 31663b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false, 31673b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor true, Results); 31683b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 31693b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.ExitScope(); 31703b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 31713b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor} 317233ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 317333ced0b8550f3e7169f326944731ee02e9338659Douglas Gregorvoid Sema::CodeCompleteObjCInterfaceCategory(Scope *S, 317433ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor IdentifierInfo *ClassName) { 317533ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor typedef CodeCompleteConsumer::Result Result; 317633ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 317733ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor ResultBuilder Results(*this); 317833ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 317933ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // Ignore any categories we find that have already been implemented by this 318033ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // interface. 318133ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor llvm::SmallPtrSet<IdentifierInfo *, 16> CategoryNames; 318233ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor NamedDecl *CurClass 318333ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor = LookupSingleName(TUScope, ClassName, LookupOrdinaryName); 318433ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor if (ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurClass)) 318533ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor for (ObjCCategoryDecl *Category = Class->getCategoryList(); Category; 318633ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Category = Category->getNextClassCategory()) 318733ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor CategoryNames.insert(Category->getIdentifier()); 318833ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 318933ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // Add all of the categories we know about. 319033ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Results.EnterNewScope(); 319133ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor TranslationUnitDecl *TU = Context.getTranslationUnitDecl(); 319233ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor for (DeclContext::decl_iterator D = TU->decls_begin(), 319333ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor DEnd = TU->decls_end(); 319433ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor D != DEnd; ++D) 319533ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(*D)) 319633ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor if (CategoryNames.insert(Category->getIdentifier())) 3197608300be1972c43fe99154d25d62d697e7c0a0c2Douglas Gregor Results.AddResult(Result(Category, 0), CurContext, 0, false); 319833ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Results.ExitScope(); 319933ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 320033ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 320133ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor} 320233ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 320333ced0b8550f3e7169f326944731ee02e9338659Douglas Gregorvoid Sema::CodeCompleteObjCImplementationCategory(Scope *S, 320433ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor IdentifierInfo *ClassName) { 320533ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor typedef CodeCompleteConsumer::Result Result; 320633ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 320733ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // Find the corresponding interface. If we couldn't find the interface, the 320833ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // program itself is ill-formed. However, we'll try to be helpful still by 320933ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // providing the list of all of the categories we know about. 321033ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor NamedDecl *CurClass 321133ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor = LookupSingleName(TUScope, ClassName, LookupOrdinaryName); 321233ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurClass); 321333ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor if (!Class) 321433ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor return CodeCompleteObjCInterfaceCategory(S, ClassName); 321533ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 321633ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor ResultBuilder Results(*this); 321733ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 321833ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // Add all of the categories that have have corresponding interface 321933ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // declarations in this class and any of its superclasses, except for 322033ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // already-implemented categories in the class itself. 322133ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor llvm::SmallPtrSet<IdentifierInfo *, 16> CategoryNames; 322233ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Results.EnterNewScope(); 322333ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor bool IgnoreImplemented = true; 322433ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor while (Class) { 322533ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor for (ObjCCategoryDecl *Category = Class->getCategoryList(); Category; 322633ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Category = Category->getNextClassCategory()) 322733ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor if ((!IgnoreImplemented || !Category->getImplementation()) && 322833ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor CategoryNames.insert(Category->getIdentifier())) 3229608300be1972c43fe99154d25d62d697e7c0a0c2Douglas Gregor Results.AddResult(Result(Category, 0), CurContext, 0, false); 323033ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 323133ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Class = Class->getSuperClass(); 323233ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor IgnoreImplemented = false; 323333ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor } 323433ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Results.ExitScope(); 323533ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 323633ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 323733ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor} 3238322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 3239424b2a546dbd09cf70d43087771c7fff851ca158Douglas Gregorvoid Sema::CodeCompleteObjCPropertyDefinition(Scope *S, DeclPtrTy ObjCImpDecl) { 3240322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor typedef CodeCompleteConsumer::Result Result; 3241322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor ResultBuilder Results(*this); 3242322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 3243322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Figure out where this @synthesize lives. 3244322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor ObjCContainerDecl *Container 3245322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor = dyn_cast_or_null<ObjCContainerDecl>(ObjCImpDecl.getAs<Decl>()); 3246322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor if (!Container || 3247322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor (!isa<ObjCImplementationDecl>(Container) && 3248322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor !isa<ObjCCategoryImplDecl>(Container))) 3249322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor return; 3250322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 3251322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Ignore any properties that have already been implemented. 3252322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor for (DeclContext::decl_iterator D = Container->decls_begin(), 3253322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor DEnd = Container->decls_end(); 3254322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor D != DEnd; ++D) 3255322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor if (ObjCPropertyImplDecl *PropertyImpl = dyn_cast<ObjCPropertyImplDecl>(*D)) 3256322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Results.Ignore(PropertyImpl->getPropertyDecl()); 3257322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 3258322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Add any properties that we find. 3259322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Results.EnterNewScope(); 3260322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor if (ObjCImplementationDecl *ClassImpl 3261322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor = dyn_cast<ObjCImplementationDecl>(Container)) 3262322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor AddObjCProperties(ClassImpl->getClassInterface(), false, CurContext, 3263322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Results); 3264322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor else 3265322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor AddObjCProperties(cast<ObjCCategoryImplDecl>(Container)->getCategoryDecl(), 3266322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor false, CurContext, Results); 3267322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Results.ExitScope(); 3268322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 3269322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 3270322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor} 3271322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 3272322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregorvoid Sema::CodeCompleteObjCPropertySynthesizeIvar(Scope *S, 3273322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor IdentifierInfo *PropertyName, 3274322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor DeclPtrTy ObjCImpDecl) { 3275322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor typedef CodeCompleteConsumer::Result Result; 3276322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor ResultBuilder Results(*this); 3277322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 3278322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Figure out where this @synthesize lives. 3279322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor ObjCContainerDecl *Container 3280322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor = dyn_cast_or_null<ObjCContainerDecl>(ObjCImpDecl.getAs<Decl>()); 3281322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor if (!Container || 3282322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor (!isa<ObjCImplementationDecl>(Container) && 3283322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor !isa<ObjCCategoryImplDecl>(Container))) 3284322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor return; 3285322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 3286322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Figure out which interface we're looking into. 3287322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor ObjCInterfaceDecl *Class = 0; 3288322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor if (ObjCImplementationDecl *ClassImpl 3289322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor = dyn_cast<ObjCImplementationDecl>(Container)) 3290322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Class = ClassImpl->getClassInterface(); 3291322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor else 3292322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Class = cast<ObjCCategoryImplDecl>(Container)->getCategoryDecl() 3293322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor ->getClassInterface(); 3294322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 3295322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Add all of the instance variables in this class and its superclasses. 3296322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Results.EnterNewScope(); 3297322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor for(; Class; Class = Class->getSuperClass()) { 3298322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // FIXME: We could screen the type of each ivar for compatibility with 3299322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // the property, but is that being too paternal? 3300322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor for (ObjCInterfaceDecl::ivar_iterator IVar = Class->ivar_begin(), 3301322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor IVarEnd = Class->ivar_end(); 3302322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor IVar != IVarEnd; ++IVar) 3303608300be1972c43fe99154d25d62d697e7c0a0c2Douglas Gregor Results.AddResult(Result(*IVar, 0), CurContext, 0, false); 3304322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor } 3305322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Results.ExitScope(); 3306322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 3307322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 3308322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor} 3309