SemaCodeComplete.cpp revision 5d2fc405c71f307d4f9b71cc807ad3c4843cd2cc
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. 1811ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor void AddResult(Result R, DeclContext *CurContext, NamedDecl *Hiding); 1821ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 18386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \brief Enter into a new scope. 18486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor void EnterNewScope(); 18586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 18686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \brief Exit from the current scope. 18786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor void ExitScope(); 18886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 18955385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor /// \brief Ignore this declaration, if it is seen again. 19055385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor void Ignore(Decl *D) { AllDeclsFound.insert(D->getCanonicalDecl()); } 19155385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor 19286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \name Name lookup predicates 19386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// 19486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// These predicates can be passed to the name lookup functions to filter the 19586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// results of name lookup. All of the predicates have the same type, so that 19686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// 19786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor //@{ 198791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor bool IsOrdinaryName(NamedDecl *ND) const; 19901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor bool IsOrdinaryNonValueName(NamedDecl *ND) const; 20086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool IsNestedNameSpecifier(NamedDecl *ND) const; 20186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool IsEnum(NamedDecl *ND) const; 20286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool IsClassOrStruct(NamedDecl *ND) const; 20386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool IsUnion(NamedDecl *ND) const; 20486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool IsNamespace(NamedDecl *ND) const; 20586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool IsNamespaceOrAlias(NamedDecl *ND) const; 20686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool IsType(NamedDecl *ND) const; 207eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor bool IsMember(NamedDecl *ND) const; 20886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor //@} 20986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor }; 21086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 21186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 212fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregorclass ResultBuilder::ShadowMapEntry::iterator { 213fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor llvm::PointerUnion<NamedDecl*, const DeclIndexPair*> DeclOrIterator; 214fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor unsigned SingleDeclIndex; 215fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 216fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregorpublic: 217fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor typedef DeclIndexPair value_type; 218fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor typedef value_type reference; 219fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor typedef std::ptrdiff_t difference_type; 220fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor typedef std::input_iterator_tag iterator_category; 221fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 222fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor class pointer { 223fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor DeclIndexPair Value; 224fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 225fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor public: 226fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor pointer(const DeclIndexPair &Value) : Value(Value) { } 227fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 228fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor const DeclIndexPair *operator->() const { 229fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return &Value; 230fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 231fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor }; 232fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 233fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor iterator() : DeclOrIterator((NamedDecl *)0), SingleDeclIndex(0) { } 234fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 235fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor iterator(NamedDecl *SingleDecl, unsigned Index) 236fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor : DeclOrIterator(SingleDecl), SingleDeclIndex(Index) { } 237fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 238fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor iterator(const DeclIndexPair *Iterator) 239fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor : DeclOrIterator(Iterator), SingleDeclIndex(0) { } 240fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 241fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor iterator &operator++() { 242fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (DeclOrIterator.is<NamedDecl *>()) { 243fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor DeclOrIterator = (NamedDecl *)0; 244fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor SingleDeclIndex = 0; 245fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return *this; 246fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 247fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 248fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor const DeclIndexPair *I = DeclOrIterator.get<const DeclIndexPair*>(); 249fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ++I; 250fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor DeclOrIterator = I; 251fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return *this; 252fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 253fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 254fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor iterator operator++(int) { 255fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor iterator tmp(*this); 256fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ++(*this); 257fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return tmp; 258fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 259fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 260fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor reference operator*() const { 261fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (NamedDecl *ND = DeclOrIterator.dyn_cast<NamedDecl *>()) 262fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return reference(ND, SingleDeclIndex); 263fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 264d490f953e812a9bb1729637cc70a6db7d997ced0Douglas Gregor return *DeclOrIterator.get<const DeclIndexPair*>(); 265fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 266fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 267fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor pointer operator->() const { 268fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return pointer(**this); 269fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 270fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 271fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor friend bool operator==(const iterator &X, const iterator &Y) { 272d490f953e812a9bb1729637cc70a6db7d997ced0Douglas Gregor return X.DeclOrIterator.getOpaqueValue() 273d490f953e812a9bb1729637cc70a6db7d997ced0Douglas Gregor == Y.DeclOrIterator.getOpaqueValue() && 274fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor X.SingleDeclIndex == Y.SingleDeclIndex; 275fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 276fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 277fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor friend bool operator!=(const iterator &X, const iterator &Y) { 278d490f953e812a9bb1729637cc70a6db7d997ced0Douglas Gregor return !(X == Y); 279fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 280fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor}; 281fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 282fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas GregorResultBuilder::ShadowMapEntry::iterator 283fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas GregorResultBuilder::ShadowMapEntry::begin() const { 284fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (DeclOrVector.isNull()) 285fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return iterator(); 286fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 287fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (NamedDecl *ND = DeclOrVector.dyn_cast<NamedDecl *>()) 288fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return iterator(ND, SingleDeclIndex); 289fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 290fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return iterator(DeclOrVector.get<DeclIndexPairVector *>()->begin()); 291fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor} 292fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 293fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas GregorResultBuilder::ShadowMapEntry::iterator 294fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas GregorResultBuilder::ShadowMapEntry::end() const { 295fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (DeclOrVector.is<NamedDecl *>() || DeclOrVector.isNull()) 296fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return iterator(); 297fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 298fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return iterator(DeclOrVector.get<DeclIndexPairVector *>()->end()); 299fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor} 300fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 301456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// \brief Compute the qualification required to get from the current context 302456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// (\p CurContext) to the target context (\p TargetContext). 303456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// 304456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// \param Context the AST context in which the qualification will be used. 305456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// 306456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// \param CurContext the context where an entity is being named, which is 307456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// typically based on the current scope. 308456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// 309456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// \param TargetContext the context in which the named entity actually 310456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// resides. 311456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// 312456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// \returns a nested name specifier that refers into the target context, or 313456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// NULL if no qualification is needed. 314456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregorstatic NestedNameSpecifier * 315456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas GregorgetRequiredQualification(ASTContext &Context, 316456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor DeclContext *CurContext, 317456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor DeclContext *TargetContext) { 318456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor llvm::SmallVector<DeclContext *, 4> TargetParents; 319456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor 320456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor for (DeclContext *CommonAncestor = TargetContext; 321456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor CommonAncestor && !CommonAncestor->Encloses(CurContext); 322456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor CommonAncestor = CommonAncestor->getLookupParent()) { 323456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor if (CommonAncestor->isTransparentContext() || 324456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor CommonAncestor->isFunctionOrMethod()) 325456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor continue; 326456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor 327456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor TargetParents.push_back(CommonAncestor); 328456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor } 329456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor 330456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor NestedNameSpecifier *Result = 0; 331456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor while (!TargetParents.empty()) { 332456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor DeclContext *Parent = TargetParents.back(); 333456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor TargetParents.pop_back(); 334456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor 335456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor if (NamespaceDecl *Namespace = dyn_cast<NamespaceDecl>(Parent)) 336456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor Result = NestedNameSpecifier::Create(Context, Result, Namespace); 337456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor else if (TagDecl *TD = dyn_cast<TagDecl>(Parent)) 338456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor Result = NestedNameSpecifier::Create(Context, Result, 339456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor false, 340456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor Context.getTypeDeclType(TD).getTypePtr()); 341456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor else 342456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor assert(Parent->isTranslationUnit()); 3430c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor } 344456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor return Result; 345456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor} 346456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor 34745bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregorbool ResultBuilder::isInterestingDecl(NamedDecl *ND, 34845bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor bool &AsNestedNameSpecifier) const { 34945bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor AsNestedNameSpecifier = false; 35045bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor 351e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor ND = ND->getUnderlyingDecl(); 352e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor unsigned IDNS = ND->getIdentifierNamespace(); 353f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor 354f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor // Skip unnamed entities. 355e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor if (!ND->getDeclName()) 356e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return false; 35786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 35886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Friend declarations and declarations introduced due to friends are never 35986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // added as results. 360e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor if (isa<FriendDecl>(ND) || 36186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor (IDNS & (Decl::IDNS_OrdinaryFriend | Decl::IDNS_TagFriend))) 362e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return false; 363e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 3647628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor // Class template (partial) specializations are never added as results. 365e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor if (isa<ClassTemplateSpecializationDecl>(ND) || 366e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor isa<ClassTemplatePartialSpecializationDecl>(ND)) 367e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return false; 36886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 3697628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor // Using declarations themselves are never added as results. 370e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor if (isa<UsingDecl>(ND)) 371e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return false; 372e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 373e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor // Some declarations have reserved names that we don't want to ever show. 374e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor if (const IdentifierInfo *Id = ND->getIdentifier()) { 37586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // __va_list_tag is a freak of nature. Find it and skip it. 37686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (Id->isStr("__va_list_tag") || Id->isStr("__builtin_va_list")) 377e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return false; 37886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 379f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor // Filter out names reserved for the implementation (C99 7.1.3, 380f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor // C++ [lib.global.names]). Users don't need to see those. 381e013d685c6689ac7ae103ee88acf573422d1ed6aDaniel Dunbar // 382e013d685c6689ac7ae103ee88acf573422d1ed6aDaniel Dunbar // FIXME: Add predicate for this. 383f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor if (Id->getLength() >= 2) { 384e013d685c6689ac7ae103ee88acf573422d1ed6aDaniel Dunbar const char *Name = Id->getNameStart(); 385f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor if (Name[0] == '_' && 386f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor (Name[1] == '_' || (Name[1] >= 'A' && Name[1] <= 'Z'))) 387e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return false; 388f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor } 38986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 390e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 39186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // C++ constructors are never found by name lookup. 392e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor if (isa<CXXConstructorDecl>(ND)) 393e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return false; 39486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 39586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Filter out any unwanted results. 39645bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor if (Filter && !(this->*Filter)(ND)) { 39745bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor // Check whether it is interesting as a nested-name-specifier. 39845bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor if (AllowNestedNameSpecifiers && SemaRef.getLangOptions().CPlusPlus && 39945bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor IsNestedNameSpecifier(ND) && 40045bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor (Filter != &ResultBuilder::IsMember || 40145bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor (isa<CXXRecordDecl>(ND) && 40245bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor cast<CXXRecordDecl>(ND)->isInjectedClassName()))) { 40345bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor AsNestedNameSpecifier = true; 40445bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor return true; 40545bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor } 40645bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor 407e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return false; 40845bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor } 409e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 410e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor // ... then it must be interesting! 411e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return true; 412e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor} 413e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 4146660d845af8edb99098a08cf2539233a3be650b3Douglas Gregorbool ResultBuilder::CheckHiddenResult(Result &R, DeclContext *CurContext, 4156660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor NamedDecl *Hiding) { 4166660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor // In C, there is no way to refer to a hidden name. 4176660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor // FIXME: This isn't true; we can find a tag name hidden by an ordinary 4186660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor // name if we introduce the tag type. 4196660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor if (!SemaRef.getLangOptions().CPlusPlus) 4206660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor return true; 4216660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor 4226660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor DeclContext *HiddenCtx = R.Declaration->getDeclContext()->getLookupContext(); 4236660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor 4246660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor // There is no way to qualify a name declared in a function or method. 4256660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor if (HiddenCtx->isFunctionOrMethod()) 4266660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor return true; 4276660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor 4286660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor if (HiddenCtx == Hiding->getDeclContext()->getLookupContext()) 4296660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor return true; 4306660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor 4316660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor // We can refer to the result with the appropriate qualification. Do it. 4326660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor R.Hidden = true; 4336660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor R.QualifierIsInformative = false; 4346660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor 4356660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor if (!R.Qualifier) 4366660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor R.Qualifier = getRequiredQualification(SemaRef.Context, 4376660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor CurContext, 4386660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor R.Declaration->getDeclContext()); 4396660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor return false; 4406660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor} 4416660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor 442e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregorvoid ResultBuilder::MaybeAddResult(Result R, DeclContext *CurContext) { 443e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor assert(!ShadowMaps.empty() && "Must enter into a results scope"); 444e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 445e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor if (R.Kind != Result::RK_Declaration) { 446e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor // For non-declaration results, just add the result. 447e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor Results.push_back(R); 448e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return; 449e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor } 450e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 451e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor // Look through using declarations. 452e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor if (UsingShadowDecl *Using = dyn_cast<UsingShadowDecl>(R.Declaration)) { 453e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor MaybeAddResult(Result(Using->getTargetDecl(), R.Qualifier), CurContext); 45486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return; 455e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor } 45686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 457e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor Decl *CanonDecl = R.Declaration->getCanonicalDecl(); 458e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor unsigned IDNS = CanonDecl->getIdentifierNamespace(); 459e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 46045bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor bool AsNestedNameSpecifier = false; 46145bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor if (!isInterestingDecl(R.Declaration, AsNestedNameSpecifier)) 462e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return; 463e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 46486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ShadowMap &SMap = ShadowMaps.back(); 465fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ShadowMapEntry::iterator I, IEnd; 466fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ShadowMap::iterator NamePos = SMap.find(R.Declaration->getDeclName()); 467fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (NamePos != SMap.end()) { 468fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor I = NamePos->second.begin(); 469fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor IEnd = NamePos->second.end(); 470fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 471fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 472fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor for (; I != IEnd; ++I) { 473fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor NamedDecl *ND = I->first; 474fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor unsigned Index = I->second; 47586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (ND->getCanonicalDecl() == CanonDecl) { 47686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // This is a redeclaration. Always pick the newer declaration. 47786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Results[Index].Declaration = R.Declaration; 47886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 47986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // We're done. 48086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return; 48186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 48286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 48386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 48486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // This is a new declaration in this scope. However, check whether this 48586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // declaration name is hidden by a similarly-named declaration in an outer 48686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // scope. 48786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor std::list<ShadowMap>::iterator SM, SMEnd = ShadowMaps.end(); 48886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor --SMEnd; 48986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor for (SM = ShadowMaps.begin(); SM != SMEnd; ++SM) { 490fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ShadowMapEntry::iterator I, IEnd; 491fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ShadowMap::iterator NamePos = SM->find(R.Declaration->getDeclName()); 492fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (NamePos != SM->end()) { 493fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor I = NamePos->second.begin(); 494fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor IEnd = NamePos->second.end(); 495fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 496fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor for (; I != IEnd; ++I) { 49786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // A tag declaration does not hide a non-tag declaration. 498fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (I->first->getIdentifierNamespace() == Decl::IDNS_Tag && 49986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor (IDNS & (Decl::IDNS_Member | Decl::IDNS_Ordinary | 50086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Decl::IDNS_ObjCProtocol))) 50186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor continue; 50286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 50386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Protocols are in distinct namespaces from everything else. 504fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (((I->first->getIdentifierNamespace() & Decl::IDNS_ObjCProtocol) 50586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor || (IDNS & Decl::IDNS_ObjCProtocol)) && 506fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor I->first->getIdentifierNamespace() != IDNS) 50786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor continue; 50886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 50986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // The newly-added result is hidden by an entry in the shadow map. 5106660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor if (CheckHiddenResult(R, CurContext, I->first)) 51186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return; 51286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 51386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor break; 51486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 51586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 51686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 51786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Make sure that any given declaration only shows up in the result set once. 51886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!AllDeclsFound.insert(CanonDecl)) 51986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return; 52086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 521eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor // If the filter is for nested-name-specifiers, then this result starts a 522eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor // nested-name-specifier. 52345bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor if (AsNestedNameSpecifier) 524eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor R.StartsNestedNameSpecifier = true; 525eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor 5260563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor // If this result is supposed to have an informative qualifier, add one. 527eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor if (R.QualifierIsInformative && !R.Qualifier && 528eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor !R.StartsNestedNameSpecifier) { 5290563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor DeclContext *Ctx = R.Declaration->getDeclContext(); 5300563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor if (NamespaceDecl *Namespace = dyn_cast<NamespaceDecl>(Ctx)) 5310563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor R.Qualifier = NestedNameSpecifier::Create(SemaRef.Context, 0, Namespace); 5320563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor else if (TagDecl *Tag = dyn_cast<TagDecl>(Ctx)) 5330563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor R.Qualifier = NestedNameSpecifier::Create(SemaRef.Context, 0, false, 5340563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor SemaRef.Context.getTypeDeclType(Tag).getTypePtr()); 5350563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor else 5360563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor R.QualifierIsInformative = false; 5370563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor } 538eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor 53986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Insert this result into the set of results and into the current shadow 54086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // map. 541fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor SMap[R.Declaration->getDeclName()].Add(R.Declaration, Results.size()); 54286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Results.push_back(R); 54386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 54486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 5451ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregorvoid ResultBuilder::AddResult(Result R, DeclContext *CurContext, 5461ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor NamedDecl *Hiding) { 5471ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor assert(R.Kind == Result::RK_Declaration && 5481ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor "Only declaration results are supported"); 5491ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 5501ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor // Look through using declarations. 5511ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor if (UsingShadowDecl *Using = dyn_cast<UsingShadowDecl>(R.Declaration)) { 5521ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor AddResult(Result(Using->getTargetDecl(), R.Qualifier), CurContext, Hiding); 5531ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor return; 5541ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor } 5551ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 55645bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor bool AsNestedNameSpecifier = false; 55745bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor if (!isInterestingDecl(R.Declaration, AsNestedNameSpecifier)) 5581ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor return; 5591ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 5601ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor if (Hiding && CheckHiddenResult(R, CurContext, Hiding)) 5611ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor return; 5621ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 5631ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor // Make sure that any given declaration only shows up in the result set once. 5641ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor if (!AllDeclsFound.insert(R.Declaration->getCanonicalDecl())) 5651ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor return; 5661ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 5671ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor // If the filter is for nested-name-specifiers, then this result starts a 5681ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor // nested-name-specifier. 56945bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor if (AsNestedNameSpecifier) 5701ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor R.StartsNestedNameSpecifier = true; 5711ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 5721ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor // If this result is supposed to have an informative qualifier, add one. 5731ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor if (R.QualifierIsInformative && !R.Qualifier && 5741ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor !R.StartsNestedNameSpecifier) { 5751ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor DeclContext *Ctx = R.Declaration->getDeclContext(); 5761ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor if (NamespaceDecl *Namespace = dyn_cast<NamespaceDecl>(Ctx)) 5771ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor R.Qualifier = NestedNameSpecifier::Create(SemaRef.Context, 0, Namespace); 5781ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor else if (TagDecl *Tag = dyn_cast<TagDecl>(Ctx)) 5791ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor R.Qualifier = NestedNameSpecifier::Create(SemaRef.Context, 0, false, 58045bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor SemaRef.Context.getTypeDeclType(Tag).getTypePtr()); 5811ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor else 5821ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor R.QualifierIsInformative = false; 5831ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor } 5841ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 5851ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor // Insert this result into the set of results. 5861ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor Results.push_back(R); 5871ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor} 5881ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 58986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Enter into a new scope. 59086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorvoid ResultBuilder::EnterNewScope() { 59186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ShadowMaps.push_back(ShadowMap()); 59286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 59386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 59486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Exit from the current scope. 59586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorvoid ResultBuilder::ExitScope() { 596fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor for (ShadowMap::iterator E = ShadowMaps.back().begin(), 597fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor EEnd = ShadowMaps.back().end(); 598fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor E != EEnd; 599fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ++E) 600fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor E->second.Destroy(); 601fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 60286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ShadowMaps.pop_back(); 60386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 60486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 605791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor/// \brief Determines whether this given declaration will be found by 606791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor/// ordinary name lookup. 607791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregorbool ResultBuilder::IsOrdinaryName(NamedDecl *ND) const { 608791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor unsigned IDNS = Decl::IDNS_Ordinary; 609791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus) 610791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor IDNS |= Decl::IDNS_Tag; 6111ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor else if (SemaRef.getLangOptions().ObjC1 && isa<ObjCIvarDecl>(ND)) 6121ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor return true; 6131ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 614791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor return ND->getIdentifierNamespace() & IDNS; 615791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor} 616791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor 61701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor/// \brief Determines whether this given declaration will be found by 61801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor/// ordinary name lookup. 61901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregorbool ResultBuilder::IsOrdinaryNonValueName(NamedDecl *ND) const { 62001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor unsigned IDNS = Decl::IDNS_Ordinary; 62101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus) 62201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor IDNS |= Decl::IDNS_Tag; 62301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 62401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor return (ND->getIdentifierNamespace() & IDNS) && 62501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor !isa<ValueDecl>(ND) && !isa<FunctionTemplateDecl>(ND); 62601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor} 62701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 62886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Determines whether the given declaration is suitable as the 62986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// start of a C++ nested-name-specifier, e.g., a class or namespace. 63086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsNestedNameSpecifier(NamedDecl *ND) const { 63186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Allow us to find class templates, too. 63286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (ClassTemplateDecl *ClassTemplate = dyn_cast<ClassTemplateDecl>(ND)) 63386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ND = ClassTemplate->getTemplatedDecl(); 63486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 63586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return SemaRef.isAcceptableNestedNameSpecifier(ND); 63686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 63786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 63886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Determines whether the given declaration is an enumeration. 63986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsEnum(NamedDecl *ND) const { 64086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return isa<EnumDecl>(ND); 64186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 64286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 64386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Determines whether the given declaration is a class or struct. 64486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsClassOrStruct(NamedDecl *ND) const { 64586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Allow us to find class templates, too. 64686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (ClassTemplateDecl *ClassTemplate = dyn_cast<ClassTemplateDecl>(ND)) 64786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ND = ClassTemplate->getTemplatedDecl(); 64886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 64986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (RecordDecl *RD = dyn_cast<RecordDecl>(ND)) 65086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return RD->getTagKind() == TagDecl::TK_class || 65186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor RD->getTagKind() == TagDecl::TK_struct; 65286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 65386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return false; 65486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 65586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 65686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Determines whether the given declaration is a union. 65786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsUnion(NamedDecl *ND) const { 65886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Allow us to find class templates, too. 65986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (ClassTemplateDecl *ClassTemplate = dyn_cast<ClassTemplateDecl>(ND)) 66086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ND = ClassTemplate->getTemplatedDecl(); 66186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 66286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (RecordDecl *RD = dyn_cast<RecordDecl>(ND)) 66386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return RD->getTagKind() == TagDecl::TK_union; 66486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 66586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return false; 66686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 66786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 66886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Determines whether the given declaration is a namespace. 66986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsNamespace(NamedDecl *ND) const { 67086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return isa<NamespaceDecl>(ND); 67186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 67286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 67386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Determines whether the given declaration is a namespace or 67486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// namespace alias. 67586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsNamespaceOrAlias(NamedDecl *ND) const { 67686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return isa<NamespaceDecl>(ND) || isa<NamespaceAliasDecl>(ND); 67786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 67886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 6797628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor/// \brief Determines whether the given declaration is a type. 68086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsType(NamedDecl *ND) const { 68186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return isa<TypeDecl>(ND); 68286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 68386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 6847628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor/// \brief Determines which members of a class should be visible via 6857628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor/// "." or "->". Only value declarations, nested name specifiers, and 6867628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor/// using declarations thereof should show up. 687eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregorbool ResultBuilder::IsMember(NamedDecl *ND) const { 6887628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor if (UsingShadowDecl *Using = dyn_cast<UsingShadowDecl>(ND)) 6897628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor ND = Using->getTargetDecl(); 6907628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor 691ce82196076cd15f5ecfa029fcda8b58dc0146cf1Douglas Gregor return isa<ValueDecl>(ND) || isa<FunctionTemplateDecl>(ND) || 692ce82196076cd15f5ecfa029fcda8b58dc0146cf1Douglas Gregor isa<ObjCPropertyDecl>(ND); 693eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor} 694eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor 6951ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregornamespace { 6961ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// \brief Visible declaration consumer that adds a code-completion result 6971ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// for each visible declaration. 6981ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor class CodeCompletionDeclConsumer : public VisibleDeclConsumer { 6991ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor ResultBuilder &Results; 7001ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor DeclContext *CurContext; 7011ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 7021ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor public: 7031ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor CodeCompletionDeclConsumer(ResultBuilder &Results, DeclContext *CurContext) 7041ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor : Results(Results), CurContext(CurContext) { } 7051ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 7061ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor virtual void FoundDecl(NamedDecl *ND, NamedDecl *Hiding) { 7071ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor Results.AddResult(ND, CurContext, Hiding); 7081ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor } 7091ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor }; 7101ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor} 7111ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 71286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Collect the results of searching for members within the given 71386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// declaration context. 71486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// 71586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \param Ctx the declaration context from which we will gather results. 71686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// 71786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \param Visited the set of declaration contexts that have already been 71886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// visited. Declaration contexts will only be visited once. 71986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// 72086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \param Results the result set that will be extended with any results 72186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// found within this declaration context (and, for a C++ class, its bases). 72286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// 7230563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor/// \param InBaseClass whether we are in a base class. 724bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void CollectMemberLookupResults(DeclContext *Ctx, 725bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor DeclContext *CurContext, 726456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor llvm::SmallPtrSet<DeclContext *, 16> &Visited, 727bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor ResultBuilder &Results, 728bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor bool InBaseClass = false) { 72986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Make sure we don't visit the same context twice. 73086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!Visited.insert(Ctx->getPrimaryContext())) 731bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor return; 73286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 73386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Enumerate all of the results in this context. 7340563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor typedef CodeCompleteConsumer::Result Result; 73586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Results.EnterNewScope(); 73686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor for (DeclContext *CurCtx = Ctx->getPrimaryContext(); CurCtx; 73786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor CurCtx = CurCtx->getNextContext()) { 73886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor for (DeclContext::decl_iterator D = CurCtx->decls_begin(), 739ff4393c1cea81b94ac081bed5c49b8126f12fae8Douglas Gregor DEnd = CurCtx->decls_end(); 74086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor D != DEnd; ++D) { 74186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (NamedDecl *ND = dyn_cast<NamedDecl>(*D)) 742bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(ND, 0, InBaseClass), CurContext); 743ff4393c1cea81b94ac081bed5c49b8126f12fae8Douglas Gregor 744ff4393c1cea81b94ac081bed5c49b8126f12fae8Douglas Gregor // Visit transparent contexts inside this context. 745ff4393c1cea81b94ac081bed5c49b8126f12fae8Douglas Gregor if (DeclContext *InnerCtx = dyn_cast<DeclContext>(*D)) { 746ff4393c1cea81b94ac081bed5c49b8126f12fae8Douglas Gregor if (InnerCtx->isTransparentContext()) 747bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor CollectMemberLookupResults(InnerCtx, CurContext, Visited, 748ff4393c1cea81b94ac081bed5c49b8126f12fae8Douglas Gregor Results, InBaseClass); 749ff4393c1cea81b94ac081bed5c49b8126f12fae8Douglas Gregor } 75086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 75186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 75286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 75386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Traverse the contexts of inherited classes. 75486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (CXXRecordDecl *Record = dyn_cast<CXXRecordDecl>(Ctx)) { 75586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor for (CXXRecordDecl::base_class_iterator B = Record->bases_begin(), 756ff4393c1cea81b94ac081bed5c49b8126f12fae8Douglas Gregor BEnd = Record->bases_end(); 75786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor B != BEnd; ++B) { 75886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor QualType BaseType = B->getType(); 75986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 76086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Don't look into dependent bases, because name lookup can't look 76186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // there anyway. 76286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (BaseType->isDependentType()) 76386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor continue; 76486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 76586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor const RecordType *Record = BaseType->getAs<RecordType>(); 76686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!Record) 76786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor continue; 76886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 76986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // FIXME: It would be nice to be able to determine whether referencing 77086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // a particular member would be ambiguous. For example, given 77186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // 77286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // struct A { int member; }; 77386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // struct B { int member; }; 77486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // struct C : A, B { }; 77586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // 77686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // void f(C *c) { c->### } 77786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // accessing 'member' would result in an ambiguity. However, code 77886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // completion could be smart enough to qualify the member with the 77986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // base class, e.g., 78086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // 78186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // c->B::member 78286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // 78386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // or 78486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // 78586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // c->A::member 78686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 78786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Collect results from this base class (and its bases). 788bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor CollectMemberLookupResults(Record->getDecl(), CurContext, Visited, 7890563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor Results, /*InBaseClass=*/true); 79086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 79186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 79286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 79386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // FIXME: Look into base classes in Objective-C! 79486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 79586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Results.ExitScope(); 79686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 79786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 79886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Collect the results of searching for members within the given 79986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// declaration context. 80086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// 80186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \param Ctx the declaration context from which we will gather results. 80286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// 80386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \param Results the result set that will be extended with any results 80486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// found within this declaration context (and, for a C++ class, its bases). 805bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void CollectMemberLookupResults(DeclContext *Ctx, 806bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor DeclContext *CurContext, 807bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor ResultBuilder &Results) { 80886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor llvm::SmallPtrSet<DeclContext *, 16> Visited; 809bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor CollectMemberLookupResults(Ctx, CurContext, Visited, Results); 81086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 81186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 81286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Add type specifiers for the current language as keyword results. 813bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddTypeSpecifierResults(const LangOptions &LangOpts, 81486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ResultBuilder &Results) { 81586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor typedef CodeCompleteConsumer::Result Result; 816bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("short")); 817bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("long")); 818bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("signed")); 819bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("unsigned")); 820bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("void")); 821bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("char")); 822bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("int")); 823bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("float")); 824bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("double")); 825bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("enum")); 826bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("struct")); 827bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("union")); 828bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("const")); 829bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("volatile")); 83001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 83186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (LangOpts.C99) { 83286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // C99-specific 833bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("_Complex")); 834bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("_Imaginary")); 835bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("_Bool")); 836bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("restrict")); 83786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 83886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 83986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (LangOpts.CPlusPlus) { 84086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // C++-specific 841bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("bool")); 842bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("class")); 843bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("wchar_t")); 84486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 84501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // typename qualified-id 84601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor CodeCompletionString *Pattern = new CodeCompletionString; 84701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("typename"); 84801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 84901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("qualified-id"); 850bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 85101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 85286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (LangOpts.CPlusPlus0x) { 853bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("auto")); 854bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("char16_t")); 855bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("char32_t")); 856bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("decltype")); 85786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 85886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 85986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 86086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // GNU extensions 86186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (LangOpts.GNUMode) { 86286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // FIXME: Enable when we actually support decimal floating point. 863bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor // Results.MaybeAddResult(Result("_Decimal32")); 864bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor // Results.MaybeAddResult(Result("_Decimal64")); 865bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor // Results.MaybeAddResult(Result("_Decimal128")); 86601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 86701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor CodeCompletionString *Pattern = new CodeCompletionString; 86801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("typeof"); 86901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 87001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("expression-or-type"); 87101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 872bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 87301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 87401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor} 87501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 87601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregorstatic void AddStorageSpecifiers(Action::CodeCompletionContext CCC, 87701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor const LangOptions &LangOpts, 87801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor ResultBuilder &Results) { 87901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor typedef CodeCompleteConsumer::Result Result; 88001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Note: we don't suggest either "auto" or "register", because both 88101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // are pointless as storage specifiers. Elsewhere, we suggest "auto" 88201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // in C++0x as a type specifier. 883bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("extern")); 884bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("static")); 88501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor} 88601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 88701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregorstatic void AddFunctionSpecifiers(Action::CodeCompletionContext CCC, 88801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor const LangOptions &LangOpts, 88901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor ResultBuilder &Results) { 89001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor typedef CodeCompleteConsumer::Result Result; 89101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor switch (CCC) { 89201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case Action::CCC_Class: 89301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case Action::CCC_MemberTemplate: 89401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (LangOpts.CPlusPlus) { 895bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("explicit")); 896bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("friend")); 897bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("mutable")); 898bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("virtual")); 89901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 90001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Fall through 90101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 902b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor case Action::CCC_ObjCInterface: 903b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor case Action::CCC_ObjCImplementation: 90401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case Action::CCC_Namespace: 90501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case Action::CCC_Template: 90601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (LangOpts.CPlusPlus || LangOpts.C99) 907bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("inline")); 90801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 90901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 910c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor case Action::CCC_ObjCInstanceVariableList: 91101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case Action::CCC_Expression: 91201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case Action::CCC_Statement: 91301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case Action::CCC_ForInit: 91401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case Action::CCC_Condition: 91501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 91601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 91701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor} 91801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 919bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCExpressionResults(ResultBuilder &Results, bool NeedAt); 920bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCStatementResults(ResultBuilder &Results, bool NeedAt); 921bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCVisibilityResults(const LangOptions &LangOpts, 922c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor ResultBuilder &Results, 923c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor bool NeedAt); 924bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCImplementationResults(const LangOptions &LangOpts, 925b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor ResultBuilder &Results, 926b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor bool NeedAt); 927bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCInterfaceResults(const LangOptions &LangOpts, 928b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor ResultBuilder &Results, 929b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor bool NeedAt); 930bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCTopLevelResults(ResultBuilder &Results, bool NeedAt); 931b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 93201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor/// \brief Add language constructs that show up for "ordinary" names. 93301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregorstatic void AddOrdinaryNameResults(Action::CodeCompletionContext CCC, 93401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Scope *S, 93501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Sema &SemaRef, 93601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor ResultBuilder &Results) { 93701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor typedef CodeCompleteConsumer::Result Result; 93801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor switch (CCC) { 93901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case Action::CCC_Namespace: 94001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus) { 94101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // namespace <identifier> { } 94201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor CodeCompletionString *Pattern = new CodeCompletionString; 94301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("namespace"); 94401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 94501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("identifier"); 94601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftBrace); 94701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("declarations"); 94801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_VerticalSpace); 94901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightBrace); 950bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 95101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 95201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // namespace identifier = identifier ; 95301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 95401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("namespace"); 95501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 95601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("identifier"); 95701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_Equal); 95801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("identifier"); 95901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_SemiColon); 960bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 96101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 96201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Using directives 96301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 96401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("using"); 96501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 96601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTextChunk("namespace"); 96701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 96801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("identifier"); 96901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_SemiColon); 970bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 97101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 97201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // asm(string-literal) 97301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 97401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("asm"); 97501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 97601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("string-literal"); 97701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 97801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_SemiColon); 979bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 98001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 98101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Explicit template instantiation 98201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 98301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("template"); 98401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 98501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("declaration"); 98601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_SemiColon); 987bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 98801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 989b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 990b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor if (SemaRef.getLangOptions().ObjC1) 991bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCTopLevelResults(Results, true); 992b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 99301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Fall through 99401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 99501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case Action::CCC_Class: 996bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("typedef")); 99701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus) { 99801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Using declaration 99901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor CodeCompletionString *Pattern = new CodeCompletionString; 100001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("using"); 100101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 100201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("qualified-id"); 100301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_SemiColon); 1004bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 100501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 100601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // using typename qualified-id; (only in a dependent context) 100701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (SemaRef.CurContext->isDependentContext()) { 100801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 100901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("using"); 101001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 101101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTextChunk("typename"); 101201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 101301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("qualified-id"); 101401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_SemiColon); 1015bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 101601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 101701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 101801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (CCC == Action::CCC_Class) { 101901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // public: 102001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 102101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("public"); 102201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_Colon); 1023bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 102401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 102501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // protected: 102601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 102701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("protected"); 102801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_Colon); 1029bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 103001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 103101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // private: 103201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 103301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("private"); 103401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_Colon); 1035bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 103601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 103701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 103801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Fall through 103901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 104001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case Action::CCC_Template: 104101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case Action::CCC_MemberTemplate: 104201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus) { 104301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // template < parameters > 104401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor CodeCompletionString *Pattern = new CodeCompletionString; 104501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("template"); 104601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftAngle); 104701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("parameters"); 104801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightAngle); 1049bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 105001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 105101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1052bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddStorageSpecifiers(CCC, SemaRef.getLangOptions(), Results); 1053bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddFunctionSpecifiers(CCC, SemaRef.getLangOptions(), Results); 105401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 105501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1056b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor case Action::CCC_ObjCInterface: 1057bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCInterfaceResults(SemaRef.getLangOptions(), Results, true); 1058bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddStorageSpecifiers(CCC, SemaRef.getLangOptions(), Results); 1059bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddFunctionSpecifiers(CCC, SemaRef.getLangOptions(), Results); 1060b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor break; 1061b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 1062b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor case Action::CCC_ObjCImplementation: 1063bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCImplementationResults(SemaRef.getLangOptions(), Results, true); 1064bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddStorageSpecifiers(CCC, SemaRef.getLangOptions(), Results); 1065bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddFunctionSpecifiers(CCC, SemaRef.getLangOptions(), Results); 1066b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor break; 1067b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 1068c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor case Action::CCC_ObjCInstanceVariableList: 1069bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCVisibilityResults(SemaRef.getLangOptions(), Results, true); 1070c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor break; 1071c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor 107201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case Action::CCC_Statement: { 1073bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("typedef")); 107401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 107501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor CodeCompletionString *Pattern = 0; 107601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus) { 107701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 107801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("try"); 107901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftBrace); 108001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("statements"); 108101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_VerticalSpace); 108201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightBrace); 108301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTextChunk("catch"); 108401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 108501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("declaration"); 108601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 108701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftBrace); 108801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("statements"); 108901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_VerticalSpace); 109001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightBrace); 1091bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 109201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 1093b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor if (SemaRef.getLangOptions().ObjC1) 1094bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCStatementResults(Results, true); 1095b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 109601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // if (condition) { statements } 109701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 109801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("if"); 109901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 110001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus) 110101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("condition"); 110201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor else 110301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("expression"); 110401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 110501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftBrace); 110601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("statements"); 110701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_VerticalSpace); 110801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightBrace); 1109bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 111001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 111101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // switch (condition) { } 111201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 111301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("switch"); 111401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 111501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus) 111601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("condition"); 111701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor else 111801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("expression"); 111901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 112001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftBrace); 112101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_VerticalSpace); 112201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightBrace); 1123bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 112401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 112501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Switch-specific statements. 112601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (!SemaRef.getSwitchStack().empty()) { 112701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // case expression: 112801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 112901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("case"); 113001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("expression"); 113101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_Colon); 1132bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 113301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 113401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // default: 113501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 113601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("default"); 113701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_Colon); 1138bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 113901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 114001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 114101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor /// while (condition) { statements } 114201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 114301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("while"); 114401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 114501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus) 114601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("condition"); 114701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor else 114801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("expression"); 114901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 115001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftBrace); 115101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("statements"); 115201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_VerticalSpace); 115301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightBrace); 1154bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 115501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 115601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // do { statements } while ( expression ); 115701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 115801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("do"); 115901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftBrace); 116001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("statements"); 116101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_VerticalSpace); 116201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightBrace); 116301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTextChunk("while"); 116401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 116501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("expression"); 116601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 116701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_SemiColon); 1168bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 116901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 117001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // for ( for-init-statement ; condition ; expression ) { statements } 117101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 117201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("for"); 117301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 117401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus || SemaRef.getLangOptions().C99) 117501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("init-statement"); 117601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor else 117701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("init-expression"); 117801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_SemiColon); 117901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("condition"); 118001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_SemiColon); 118101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("inc-expression"); 118201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 118301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftBrace); 118401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("statements"); 118501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_VerticalSpace); 118601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightBrace); 1187bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 118801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 118901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (S->getContinueParent()) { 119001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // continue ; 119101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 119201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("continue"); 119301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_SemiColon); 1194bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 119501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 119601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 119701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (S->getBreakParent()) { 119801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // break ; 119901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 120001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("break"); 120101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_SemiColon); 1202bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 120301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 120401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 120501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // "return expression ;" or "return ;", depending on whether we 120601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // know the function is void or not. 120701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor bool isVoid = false; 120801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (FunctionDecl *Function = dyn_cast<FunctionDecl>(SemaRef.CurContext)) 120901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor isVoid = Function->getResultType()->isVoidType(); 121001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor else if (ObjCMethodDecl *Method 121101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor = dyn_cast<ObjCMethodDecl>(SemaRef.CurContext)) 121201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor isVoid = Method->getResultType()->isVoidType(); 121301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor else if (SemaRef.CurBlock && !SemaRef.CurBlock->ReturnType.isNull()) 121401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor isVoid = SemaRef.CurBlock->ReturnType->isVoidType(); 121501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 121601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("return"); 121701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (!isVoid) 121801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("expression"); 121901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_SemiColon); 1220bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 122101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 122201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // goto identifier ; 122301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 122401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("goto"); 122501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 122601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("identifier"); 122701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_SemiColon); 1228bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 122901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 123001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Using directives 123101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 123201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("using"); 123301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 123401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTextChunk("namespace"); 123501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 123601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("identifier"); 123701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_SemiColon); 1238bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 123901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 124001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 124101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Fall through (for statement expressions). 124201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case Action::CCC_ForInit: 124301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case Action::CCC_Condition: 1244bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddStorageSpecifiers(CCC, SemaRef.getLangOptions(), Results); 124501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Fall through: conditions and statements can have expressions. 124601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 124701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case Action::CCC_Expression: { 124801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor CodeCompletionString *Pattern = 0; 124901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus) { 125001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // 'this', if we're in a non-static member function. 125101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(SemaRef.CurContext)) 125201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (!Method->isStatic()) 1253bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("this")); 125401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 125501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // true, false 1256bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("true")); 1257bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("false")); 125801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 125901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // dynamic_cast < type-id > ( expression ) 126001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 126101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("dynamic_cast"); 126201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftAngle); 126301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("type-id"); 126401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightAngle); 126501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 126601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("expression"); 126701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 1268bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 126901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 127001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // static_cast < type-id > ( expression ) 127101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 127201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("static_cast"); 127301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftAngle); 127401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("type-id"); 127501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightAngle); 127601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 127701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("expression"); 127801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 1279bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 128001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 128101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // reinterpret_cast < type-id > ( expression ) 128201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 128301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("reinterpret_cast"); 128401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftAngle); 128501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("type-id"); 128601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightAngle); 128701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 128801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("expression"); 128901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 1290bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 129101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 129201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // const_cast < type-id > ( expression ) 129301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 129401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("const_cast"); 129501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftAngle); 129601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("type-id"); 129701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightAngle); 129801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 129901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("expression"); 130001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 1301bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 130201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 130301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // typeid ( expression-or-type ) 130401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 130501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("typeid"); 130601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 130701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("expression-or-type"); 130801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 1309bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 131001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 131101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // new T ( ... ) 131201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 131301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("new"); 131401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 131501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("type-id"); 131601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 131701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("expressions"); 131801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 1319bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 132001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 132101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // new T [ ] ( ... ) 132201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 132301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("new"); 132401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 132501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("type-id"); 132601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftBracket); 132701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("size"); 132801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightBracket); 132901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 133001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("expressions"); 133101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 1332bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 133301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 133401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // delete expression 133501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 133601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("delete"); 133701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 133801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("expression"); 1339bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 134001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 134101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // delete [] expression 134201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 134301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("delete"); 134401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftBracket); 134501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightBracket); 134601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 134701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("expression"); 1348bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 134901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 135001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // throw expression 135101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 135201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("throw"); 135301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 135401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("expression"); 1355bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 135601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 135701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 135801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (SemaRef.getLangOptions().ObjC1) { 135901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Add "super", if we're in an Objective-C class with a superclass. 136001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (ObjCMethodDecl *Method = SemaRef.getCurMethodDecl()) 136101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (Method->getClassInterface()->getSuperClass()) 1362bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("super")); 1363b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 1364bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCExpressionResults(Results, true); 136501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 136601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 136701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // sizeof expression 136801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 136901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("sizeof"); 137001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 137101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("expression-or-type"); 137201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 1373bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 137401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 137586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 137601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 137701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1378bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddTypeSpecifierResults(SemaRef.getLangOptions(), Results); 137901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 138001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus) 1381bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("operator")); 138286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 138386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 1384ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor/// \brief If the given declaration has an associated type, add it as a result 1385ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor/// type chunk. 1386ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregorstatic void AddResultTypeChunk(ASTContext &Context, 1387ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor NamedDecl *ND, 1388ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor CodeCompletionString *Result) { 1389ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor if (!ND) 1390ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor return; 1391ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor 1392ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor // Determine the type of the declaration (if it has a type). 1393ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor QualType T; 1394ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor if (FunctionDecl *Function = dyn_cast<FunctionDecl>(ND)) 1395ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor T = Function->getResultType(); 1396ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor else if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(ND)) 1397ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor T = Method->getResultType(); 1398ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor else if (FunctionTemplateDecl *FunTmpl = dyn_cast<FunctionTemplateDecl>(ND)) 1399ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor T = FunTmpl->getTemplatedDecl()->getResultType(); 1400ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor else if (EnumConstantDecl *Enumerator = dyn_cast<EnumConstantDecl>(ND)) 1401ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor T = Context.getTypeDeclType(cast<TypeDecl>(Enumerator->getDeclContext())); 1402ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor else if (isa<UnresolvedUsingValueDecl>(ND)) { 1403ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor /* Do nothing: ignore unresolved using declarations*/ 1404ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor } else if (ValueDecl *Value = dyn_cast<ValueDecl>(ND)) 1405ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor T = Value->getType(); 1406ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor else if (ObjCPropertyDecl *Property = dyn_cast<ObjCPropertyDecl>(ND)) 1407ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor T = Property->getType(); 1408ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor 1409ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor if (T.isNull() || Context.hasSameType(T, Context.DependentTy)) 1410ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor return; 1411ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor 1412ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor std::string TypeStr; 1413ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor T.getAsStringInternal(TypeStr, Context.PrintingPolicy); 1414ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor Result->AddResultTypeChunk(TypeStr); 1415ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor} 1416ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor 141786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Add function parameter chunks to the given code completion string. 141886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorstatic void AddFunctionParameterChunks(ASTContext &Context, 141986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor FunctionDecl *Function, 142086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor CodeCompletionString *Result) { 14210c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor typedef CodeCompletionString::Chunk Chunk; 14220c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 142386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor CodeCompletionString *CCStr = Result; 142486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 142586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor for (unsigned P = 0, N = Function->getNumParams(); P != N; ++P) { 142686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ParmVarDecl *Param = Function->getParamDecl(P); 142786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 142886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (Param->hasDefaultArg()) { 142986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // When we see an optional default argument, put that argument and 143086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // the remaining default arguments into a new, optional string. 143186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor CodeCompletionString *Opt = new CodeCompletionString; 143286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor CCStr->AddOptionalChunk(std::auto_ptr<CodeCompletionString>(Opt)); 143386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor CCStr = Opt; 143486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 143586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 143686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (P != 0) 14370c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor CCStr->AddChunk(Chunk(CodeCompletionString::CK_Comma)); 143886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 143986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Format the placeholder string. 144086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor std::string PlaceholderStr; 144186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (Param->getIdentifier()) 144286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr = Param->getIdentifier()->getName(); 144386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 144486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Param->getType().getAsStringInternal(PlaceholderStr, 144586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Context.PrintingPolicy); 144686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 144786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add the placeholder string. 1448660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer CCStr->AddPlaceholderChunk(PlaceholderStr); 144986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 1450b3d4525c65cf456d3f1f4338afdcac83afc7be02Douglas Gregor 1451b3d4525c65cf456d3f1f4338afdcac83afc7be02Douglas Gregor if (const FunctionProtoType *Proto 1452b3d4525c65cf456d3f1f4338afdcac83afc7be02Douglas Gregor = Function->getType()->getAs<FunctionProtoType>()) 1453b3d4525c65cf456d3f1f4338afdcac83afc7be02Douglas Gregor if (Proto->isVariadic()) 1454b3d4525c65cf456d3f1f4338afdcac83afc7be02Douglas Gregor CCStr->AddPlaceholderChunk(", ..."); 145586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 145686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 145786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Add template parameter chunks to the given code completion string. 145886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorstatic void AddTemplateParameterChunks(ASTContext &Context, 145986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor TemplateDecl *Template, 146086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor CodeCompletionString *Result, 146186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor unsigned MaxParameters = 0) { 14620c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor typedef CodeCompletionString::Chunk Chunk; 14630c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 146486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor CodeCompletionString *CCStr = Result; 146586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool FirstParameter = true; 146686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 146786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor TemplateParameterList *Params = Template->getTemplateParameters(); 146886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor TemplateParameterList::iterator PEnd = Params->end(); 146986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (MaxParameters) 147086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PEnd = Params->begin() + MaxParameters; 147186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor for (TemplateParameterList::iterator P = Params->begin(); P != PEnd; ++P) { 147286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool HasDefaultArg = false; 147386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor std::string PlaceholderStr; 147486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(*P)) { 147586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (TTP->wasDeclaredWithTypename()) 147686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr = "typename"; 147786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor else 147886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr = "class"; 147986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 148086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (TTP->getIdentifier()) { 148186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr += ' '; 148286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr += TTP->getIdentifier()->getName(); 148386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 148486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 148586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor HasDefaultArg = TTP->hasDefaultArgument(); 148686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } else if (NonTypeTemplateParmDecl *NTTP 148786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor = dyn_cast<NonTypeTemplateParmDecl>(*P)) { 148886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (NTTP->getIdentifier()) 148986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr = NTTP->getIdentifier()->getName(); 149086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NTTP->getType().getAsStringInternal(PlaceholderStr, 149186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Context.PrintingPolicy); 149286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor HasDefaultArg = NTTP->hasDefaultArgument(); 149386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } else { 149486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor assert(isa<TemplateTemplateParmDecl>(*P)); 149586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor TemplateTemplateParmDecl *TTP = cast<TemplateTemplateParmDecl>(*P); 149686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 149786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Since putting the template argument list into the placeholder would 149886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // be very, very long, we just use an abbreviation. 149986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr = "template<...> class"; 150086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (TTP->getIdentifier()) { 150186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr += ' '; 150286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr += TTP->getIdentifier()->getName(); 150386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 150486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 150586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor HasDefaultArg = TTP->hasDefaultArgument(); 150686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 150786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 150886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (HasDefaultArg) { 150986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // When we see an optional default argument, put that argument and 151086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // the remaining default arguments into a new, optional string. 151186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor CodeCompletionString *Opt = new CodeCompletionString; 151286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor CCStr->AddOptionalChunk(std::auto_ptr<CodeCompletionString>(Opt)); 151386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor CCStr = Opt; 151486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 151586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 151686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (FirstParameter) 151786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor FirstParameter = false; 151886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor else 15190c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor CCStr->AddChunk(Chunk(CodeCompletionString::CK_Comma)); 152086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 152186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add the placeholder string. 1522660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer CCStr->AddPlaceholderChunk(PlaceholderStr); 152386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 152486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 152586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 1526b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor/// \brief Add a qualifier to the given code-completion string, if the 1527b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor/// provided nested-name-specifier is non-NULL. 1528a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregorstatic void 1529a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas GregorAddQualifierToCompletionString(CodeCompletionString *Result, 1530a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor NestedNameSpecifier *Qualifier, 1531a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor bool QualifierIsInformative, 1532a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor ASTContext &Context) { 1533b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor if (!Qualifier) 1534b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor return; 1535b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor 1536b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor std::string PrintedNNS; 1537b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor { 1538b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor llvm::raw_string_ostream OS(PrintedNNS); 1539b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor Qualifier->print(OS, Context.PrintingPolicy); 1540b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor } 15410563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor if (QualifierIsInformative) 1542660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer Result->AddInformativeChunk(PrintedNNS); 15430563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor else 1544660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer Result->AddTextChunk(PrintedNNS); 1545b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor} 1546b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor 1547a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregorstatic void AddFunctionTypeQualsToCompletionString(CodeCompletionString *Result, 1548a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor FunctionDecl *Function) { 1549a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor const FunctionProtoType *Proto 1550a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor = Function->getType()->getAs<FunctionProtoType>(); 1551a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor if (!Proto || !Proto->getTypeQuals()) 1552a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor return; 1553a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor 1554a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor std::string QualsStr; 1555a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor if (Proto->getTypeQuals() & Qualifiers::Const) 1556a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor QualsStr += " const"; 1557a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor if (Proto->getTypeQuals() & Qualifiers::Volatile) 1558a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor QualsStr += " volatile"; 1559a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor if (Proto->getTypeQuals() & Qualifiers::Restrict) 1560a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor QualsStr += " restrict"; 1561a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor Result->AddInformativeChunk(QualsStr); 1562a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor} 1563a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor 156486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief If possible, create a new code completion string for the given 156586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// result. 156686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// 156786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \returns Either a new, heap-allocated code completion string describing 156886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// how to use this result, or NULL to indicate that the string or name of the 156986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// result is all that is needed. 157086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas GregorCodeCompletionString * 157186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas GregorCodeCompleteConsumer::Result::CreateCodeCompletionString(Sema &S) { 15720c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor typedef CodeCompletionString::Chunk Chunk; 15730c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 15742b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor if (Kind == RK_Pattern) 15752b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor return Pattern->Clone(); 15762b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 15772b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor CodeCompletionString *Result = new CodeCompletionString; 15782b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 15792b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor if (Kind == RK_Keyword) { 15802b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor Result->AddTypedTextChunk(Keyword); 15812b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor return Result; 15822b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor } 158386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 15843f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor if (Kind == RK_Macro) { 15853f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor MacroInfo *MI = S.PP.getMacroInfo(Macro); 15862b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor assert(MI && "Not a macro?"); 15872b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 15882b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor Result->AddTypedTextChunk(Macro->getName()); 15892b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 15902b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor if (!MI->isFunctionLike()) 15912b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor return Result; 15923f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor 15933f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor // Format a function-like macro with placeholders for the arguments. 15940c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_LeftParen)); 15953f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor for (MacroInfo::arg_iterator A = MI->arg_begin(), AEnd = MI->arg_end(); 15963f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor A != AEnd; ++A) { 15973f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor if (A != MI->arg_begin()) 15980c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_Comma)); 15993f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor 16003f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor if (!MI->isVariadic() || A != AEnd - 1) { 16013f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor // Non-variadic argument. 1602660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer Result->AddPlaceholderChunk((*A)->getName()); 16033f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor continue; 16043f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor } 16053f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor 16063f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor // Variadic argument; cope with the different between GNU and C99 16073f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor // variadic macros, providing a single placeholder for the rest of the 16083f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor // arguments. 16093f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor if ((*A)->isStr("__VA_ARGS__")) 16103f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor Result->AddPlaceholderChunk("..."); 16113f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor else { 16123f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor std::string Arg = (*A)->getName(); 16133f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor Arg += "..."; 1614660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer Result->AddPlaceholderChunk(Arg); 16153f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor } 16163f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor } 16170c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_RightParen)); 16183f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor return Result; 16193f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor } 16203f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor 16213f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor assert(Kind == RK_Declaration && "Missed a macro kind?"); 162286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NamedDecl *ND = Declaration; 162386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 16240c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor if (StartsNestedNameSpecifier) { 1625660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer Result->AddTypedTextChunk(ND->getNameAsString()); 16260c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddTextChunk("::"); 16270c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor return Result; 16280c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor } 16290c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 1630ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor AddResultTypeChunk(S.Context, ND, Result); 1631ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor 163286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (FunctionDecl *Function = dyn_cast<FunctionDecl>(ND)) { 16330563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative, 16340563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor S.Context); 1635660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer Result->AddTypedTextChunk(Function->getNameAsString()); 16360c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_LeftParen)); 163786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor AddFunctionParameterChunks(S.Context, Function, Result); 16380c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_RightParen)); 1639a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor AddFunctionTypeQualsToCompletionString(Result, Function); 164086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return Result; 164186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 164286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 164386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (FunctionTemplateDecl *FunTmpl = dyn_cast<FunctionTemplateDecl>(ND)) { 16440563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative, 16450563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor S.Context); 164686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor FunctionDecl *Function = FunTmpl->getTemplatedDecl(); 1647660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer Result->AddTypedTextChunk(Function->getNameAsString()); 164886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 164986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Figure out which template parameters are deduced (or have default 165086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // arguments). 165186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor llvm::SmallVector<bool, 16> Deduced; 165286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor S.MarkDeducedTemplateParameters(FunTmpl, Deduced); 165386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor unsigned LastDeducibleArgument; 165486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor for (LastDeducibleArgument = Deduced.size(); LastDeducibleArgument > 0; 165586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor --LastDeducibleArgument) { 165686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!Deduced[LastDeducibleArgument - 1]) { 165786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // C++0x: Figure out if the template argument has a default. If so, 165886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // the user doesn't need to type this argument. 165986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // FIXME: We need to abstract template parameters better! 166086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool HasDefaultArg = false; 166186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NamedDecl *Param = FunTmpl->getTemplateParameters()->getParam( 166286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor LastDeducibleArgument - 1); 166386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(Param)) 166486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor HasDefaultArg = TTP->hasDefaultArgument(); 166586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor else if (NonTypeTemplateParmDecl *NTTP 166686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor = dyn_cast<NonTypeTemplateParmDecl>(Param)) 166786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor HasDefaultArg = NTTP->hasDefaultArgument(); 166886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor else { 166986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor assert(isa<TemplateTemplateParmDecl>(Param)); 167086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor HasDefaultArg 16710c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor = cast<TemplateTemplateParmDecl>(Param)->hasDefaultArgument(); 167286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 167386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 167486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!HasDefaultArg) 167586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor break; 167686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 167786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 167886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 167986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (LastDeducibleArgument) { 168086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Some of the function template arguments cannot be deduced from a 168186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // function call, so we introduce an explicit template argument list 168286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // containing all of the arguments up to the first deducible argument. 16830c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_LeftAngle)); 168486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor AddTemplateParameterChunks(S.Context, FunTmpl, Result, 168586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor LastDeducibleArgument); 16860c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_RightAngle)); 168786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 168886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 168986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add the function parameters 16900c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_LeftParen)); 169186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor AddFunctionParameterChunks(S.Context, Function, Result); 16920c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_RightParen)); 1693a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor AddFunctionTypeQualsToCompletionString(Result, Function); 169486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return Result; 169586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 169686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 169786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (TemplateDecl *Template = dyn_cast<TemplateDecl>(ND)) { 16980563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative, 16990563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor S.Context); 1700660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer Result->AddTypedTextChunk(Template->getNameAsString()); 17010c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_LeftAngle)); 170286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor AddTemplateParameterChunks(S.Context, Template, Result); 17030c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_RightAngle)); 170486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return Result; 170586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 170686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 17079630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(ND)) { 17089630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor Selector Sel = Method->getSelector(); 17099630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor if (Sel.isUnarySelector()) { 17109630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor Result->AddTypedTextChunk(Sel.getIdentifierInfoForSlot(0)->getName()); 17119630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor return Result; 17129630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor } 17139630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor 1714d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor std::string SelName = Sel.getIdentifierInfoForSlot(0)->getName().str(); 1715d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor SelName += ':'; 1716d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor if (StartParameter == 0) 1717d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor Result->AddTypedTextChunk(SelName); 1718d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor else { 1719d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor Result->AddInformativeChunk(SelName); 1720d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor 1721d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor // If there is only one parameter, and we're past it, add an empty 1722d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor // typed-text chunk since there is nothing to type. 1723d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor if (Method->param_size() == 1) 1724d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor Result->AddTypedTextChunk(""); 1725d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor } 17269630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor unsigned Idx = 0; 17279630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor for (ObjCMethodDecl::param_iterator P = Method->param_begin(), 17289630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor PEnd = Method->param_end(); 17299630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor P != PEnd; (void)++P, ++Idx) { 17309630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor if (Idx > 0) { 1731d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor std::string Keyword; 1732d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor if (Idx > StartParameter) 1733834389b87451b24618513b907b4dfb5b00d211f3Douglas Gregor Result->AddChunk(CodeCompletionString::CK_HorizontalSpace); 17349630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor if (IdentifierInfo *II = Sel.getIdentifierInfoForSlot(Idx)) 17359630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor Keyword += II->getName().str(); 17369630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor Keyword += ":"; 17374ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (Idx < StartParameter || AllParametersAreInformative) { 1738d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor Result->AddInformativeChunk(Keyword); 1739d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor } else if (Idx == StartParameter) 1740d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor Result->AddTypedTextChunk(Keyword); 1741d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor else 1742d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor Result->AddTextChunk(Keyword); 17439630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor } 1744d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor 1745d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor // If we're before the starting parameter, skip the placeholder. 1746d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor if (Idx < StartParameter) 1747d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor continue; 17489630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor 17499630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor std::string Arg; 17509630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor (*P)->getType().getAsStringInternal(Arg, S.Context.PrintingPolicy); 17519630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor Arg = "(" + Arg + ")"; 17529630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor if (IdentifierInfo *II = (*P)->getIdentifier()) 17539630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor Arg += II->getName().str(); 17544ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (AllParametersAreInformative) 17554ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Result->AddInformativeChunk(Arg); 17564ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor else 17574ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Result->AddPlaceholderChunk(Arg); 17589630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor } 17599630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor 17602a17af0c7e05500e25d4cc71341f1f232085ebeaDouglas Gregor if (Method->isVariadic()) { 17612a17af0c7e05500e25d4cc71341f1f232085ebeaDouglas Gregor if (AllParametersAreInformative) 17622a17af0c7e05500e25d4cc71341f1f232085ebeaDouglas Gregor Result->AddInformativeChunk(", ..."); 17632a17af0c7e05500e25d4cc71341f1f232085ebeaDouglas Gregor else 17642a17af0c7e05500e25d4cc71341f1f232085ebeaDouglas Gregor Result->AddPlaceholderChunk(", ..."); 17652a17af0c7e05500e25d4cc71341f1f232085ebeaDouglas Gregor } 17662a17af0c7e05500e25d4cc71341f1f232085ebeaDouglas Gregor 17679630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor return Result; 17689630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor } 17699630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor 17702b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor if (Qualifier) 17710563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative, 17720563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor S.Context); 17732b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 17742b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor Result->AddTypedTextChunk(ND->getNameAsString()); 17752b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor return Result; 177686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 177786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 177886d802e03a267af79663990c39865c67e0645238Douglas GregorCodeCompletionString * 177986d802e03a267af79663990c39865c67e0645238Douglas GregorCodeCompleteConsumer::OverloadCandidate::CreateSignatureString( 178086d802e03a267af79663990c39865c67e0645238Douglas Gregor unsigned CurrentArg, 178186d802e03a267af79663990c39865c67e0645238Douglas Gregor Sema &S) const { 17820c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor typedef CodeCompletionString::Chunk Chunk; 17830c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 178486d802e03a267af79663990c39865c67e0645238Douglas Gregor CodeCompletionString *Result = new CodeCompletionString; 178586d802e03a267af79663990c39865c67e0645238Douglas Gregor FunctionDecl *FDecl = getFunction(); 1786ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor AddResultTypeChunk(S.Context, FDecl, Result); 178786d802e03a267af79663990c39865c67e0645238Douglas Gregor const FunctionProtoType *Proto 178886d802e03a267af79663990c39865c67e0645238Douglas Gregor = dyn_cast<FunctionProtoType>(getFunctionType()); 178986d802e03a267af79663990c39865c67e0645238Douglas Gregor if (!FDecl && !Proto) { 179086d802e03a267af79663990c39865c67e0645238Douglas Gregor // Function without a prototype. Just give the return type and a 179186d802e03a267af79663990c39865c67e0645238Douglas Gregor // highlighted ellipsis. 179286d802e03a267af79663990c39865c67e0645238Douglas Gregor const FunctionType *FT = getFunctionType(); 179386d802e03a267af79663990c39865c67e0645238Douglas Gregor Result->AddTextChunk( 1794660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer FT->getResultType().getAsString(S.Context.PrintingPolicy)); 17950c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_LeftParen)); 17960c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_CurrentParameter, "...")); 17970c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_RightParen)); 179886d802e03a267af79663990c39865c67e0645238Douglas Gregor return Result; 179986d802e03a267af79663990c39865c67e0645238Douglas Gregor } 180086d802e03a267af79663990c39865c67e0645238Douglas Gregor 180186d802e03a267af79663990c39865c67e0645238Douglas Gregor if (FDecl) 1802660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer Result->AddTextChunk(FDecl->getNameAsString()); 180386d802e03a267af79663990c39865c67e0645238Douglas Gregor else 180486d802e03a267af79663990c39865c67e0645238Douglas Gregor Result->AddTextChunk( 1805660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer Proto->getResultType().getAsString(S.Context.PrintingPolicy)); 180686d802e03a267af79663990c39865c67e0645238Douglas Gregor 18070c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_LeftParen)); 180886d802e03a267af79663990c39865c67e0645238Douglas Gregor unsigned NumParams = FDecl? FDecl->getNumParams() : Proto->getNumArgs(); 180986d802e03a267af79663990c39865c67e0645238Douglas Gregor for (unsigned I = 0; I != NumParams; ++I) { 181086d802e03a267af79663990c39865c67e0645238Douglas Gregor if (I) 18110c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_Comma)); 181286d802e03a267af79663990c39865c67e0645238Douglas Gregor 181386d802e03a267af79663990c39865c67e0645238Douglas Gregor std::string ArgString; 181486d802e03a267af79663990c39865c67e0645238Douglas Gregor QualType ArgType; 181586d802e03a267af79663990c39865c67e0645238Douglas Gregor 181686d802e03a267af79663990c39865c67e0645238Douglas Gregor if (FDecl) { 181786d802e03a267af79663990c39865c67e0645238Douglas Gregor ArgString = FDecl->getParamDecl(I)->getNameAsString(); 181886d802e03a267af79663990c39865c67e0645238Douglas Gregor ArgType = FDecl->getParamDecl(I)->getOriginalType(); 181986d802e03a267af79663990c39865c67e0645238Douglas Gregor } else { 182086d802e03a267af79663990c39865c67e0645238Douglas Gregor ArgType = Proto->getArgType(I); 182186d802e03a267af79663990c39865c67e0645238Douglas Gregor } 182286d802e03a267af79663990c39865c67e0645238Douglas Gregor 182386d802e03a267af79663990c39865c67e0645238Douglas Gregor ArgType.getAsStringInternal(ArgString, S.Context.PrintingPolicy); 182486d802e03a267af79663990c39865c67e0645238Douglas Gregor 182586d802e03a267af79663990c39865c67e0645238Douglas Gregor if (I == CurrentArg) 18260c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_CurrentParameter, 1827660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer ArgString)); 182886d802e03a267af79663990c39865c67e0645238Douglas Gregor else 1829660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer Result->AddTextChunk(ArgString); 183086d802e03a267af79663990c39865c67e0645238Douglas Gregor } 183186d802e03a267af79663990c39865c67e0645238Douglas Gregor 183286d802e03a267af79663990c39865c67e0645238Douglas Gregor if (Proto && Proto->isVariadic()) { 18330c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_Comma)); 183486d802e03a267af79663990c39865c67e0645238Douglas Gregor if (CurrentArg < NumParams) 183586d802e03a267af79663990c39865c67e0645238Douglas Gregor Result->AddTextChunk("..."); 183686d802e03a267af79663990c39865c67e0645238Douglas Gregor else 18370c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_CurrentParameter, "...")); 183886d802e03a267af79663990c39865c67e0645238Douglas Gregor } 18390c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_RightParen)); 184086d802e03a267af79663990c39865c67e0645238Douglas Gregor 184186d802e03a267af79663990c39865c67e0645238Douglas Gregor return Result; 184286d802e03a267af79663990c39865c67e0645238Douglas Gregor} 184386d802e03a267af79663990c39865c67e0645238Douglas Gregor 184486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregornamespace { 184586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor struct SortCodeCompleteResult { 184686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor typedef CodeCompleteConsumer::Result Result; 184786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 18486a6840326e9b4ac8e81a5a212165f33743847ab8Douglas Gregor bool isEarlierDeclarationName(DeclarationName X, DeclarationName Y) const { 18492b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor Selector XSel = X.getObjCSelector(); 18502b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor Selector YSel = Y.getObjCSelector(); 18512b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor if (!XSel.isNull() && !YSel.isNull()) { 18522b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor // We are comparing two selectors. 18532b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor unsigned N = std::min(XSel.getNumArgs(), YSel.getNumArgs()); 18542b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor if (N == 0) 18552b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor ++N; 18562b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor for (unsigned I = 0; I != N; ++I) { 18572b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor IdentifierInfo *XId = XSel.getIdentifierInfoForSlot(I); 18582b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor IdentifierInfo *YId = YSel.getIdentifierInfoForSlot(I); 18592b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor if (!XId || !YId) 18602b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor return XId && !YId; 18612b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor 18622b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor switch (XId->getName().compare_lower(YId->getName())) { 18632b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor case -1: return true; 18642b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor case 1: return false; 18652b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor default: break; 18662b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor } 18672b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor } 18682b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor 18692b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor return XSel.getNumArgs() < YSel.getNumArgs(); 18702b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor } 18712b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor 18722b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor // For non-selectors, order by kind. 18732b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor if (X.getNameKind() != Y.getNameKind()) 18746a6840326e9b4ac8e81a5a212165f33743847ab8Douglas Gregor return X.getNameKind() < Y.getNameKind(); 18756a6840326e9b4ac8e81a5a212165f33743847ab8Douglas Gregor 18762b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor // Order identifiers by comparison of their lowercased names. 18772b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor if (IdentifierInfo *XId = X.getAsIdentifierInfo()) 18782b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor return XId->getName().compare_lower( 18792b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor Y.getAsIdentifierInfo()->getName()) < 0; 18802b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor 18812b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor // Order overloaded operators by the order in which they appear 18822b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor // in our list of operators. 18832b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor if (OverloadedOperatorKind XOp = X.getCXXOverloadedOperator()) 18842b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor return XOp < Y.getCXXOverloadedOperator(); 18852b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor 18862b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor // Order C++0x user-defined literal operators lexically by their 18872b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor // lowercased suffixes. 18882b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor if (IdentifierInfo *XLit = X.getCXXLiteralIdentifier()) 18892b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor return XLit->getName().compare_lower( 18902b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor Y.getCXXLiteralIdentifier()->getName()) < 0; 18912b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor 18922b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor // The only stable ordering we have is to turn the name into a 18932b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor // string and then compare the lower-case strings. This is 18942b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor // inefficient, but thankfully does not happen too often. 18950e7049fc6f2cc13d1236630782b702f11f6aaf9fBenjamin Kramer return llvm::StringRef(X.getAsString()).compare_lower( 18960e7049fc6f2cc13d1236630782b702f11f6aaf9fBenjamin Kramer Y.getAsString()) < 0; 18976a6840326e9b4ac8e81a5a212165f33743847ab8Douglas Gregor } 18986a6840326e9b4ac8e81a5a212165f33743847ab8Douglas Gregor 1899ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor /// \brief Retrieve the name that should be used to order a result. 1900ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor /// 1901ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor /// If the name needs to be constructed as a string, that string will be 1902ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor /// saved into Saved and the returned StringRef will refer to it. 1903ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor static llvm::StringRef getOrderedName(const Result &R, 1904ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor std::string &Saved) { 1905ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor switch (R.Kind) { 1906ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor case Result::RK_Keyword: 1907ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor return R.Keyword; 1908ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor 1909ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor case Result::RK_Pattern: 1910ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor return R.Pattern->getTypedText(); 1911ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor 1912ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor case Result::RK_Macro: 1913ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor return R.Macro->getName(); 1914ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor 1915ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor case Result::RK_Declaration: 1916ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor // Handle declarations below. 1917ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor break; 191854f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor } 1919ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor 1920ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor DeclarationName Name = R.Declaration->getDeclName(); 192154f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor 1922ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor // If the name is a simple identifier (by far the common case), or a 1923ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor // zero-argument selector, just return a reference to that identifier. 1924ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor if (IdentifierInfo *Id = Name.getAsIdentifierInfo()) 1925ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor return Id->getName(); 1926ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor if (Name.isObjCZeroArgSelector()) 1927ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor if (IdentifierInfo *Id 1928ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor = Name.getObjCSelector().getIdentifierInfoForSlot(0)) 1929ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor return Id->getName(); 1930ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor 1931ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor Saved = Name.getAsString(); 1932ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor return Saved; 1933ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor } 1934ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor 1935ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor bool operator()(const Result &X, const Result &Y) const { 1936ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor std::string XSaved, YSaved; 1937ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor llvm::StringRef XStr = getOrderedName(X, XSaved); 1938ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor llvm::StringRef YStr = getOrderedName(Y, YSaved); 1939ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor int cmp = XStr.compare_lower(YStr); 1940ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor if (cmp) 1941ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor return cmp < 0; 194286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 194386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Non-hidden names precede hidden names. 194486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (X.Hidden != Y.Hidden) 194586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return !X.Hidden; 194686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 1947eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor // Non-nested-name-specifiers precede nested-name-specifiers. 1948eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor if (X.StartsNestedNameSpecifier != Y.StartsNestedNameSpecifier) 1949eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor return !X.StartsNestedNameSpecifier; 1950eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor 195186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return false; 195286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 195386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor }; 195486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 195586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 1956bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddMacroResults(Preprocessor &PP, ResultBuilder &Results) { 19573f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor Results.EnterNewScope(); 19580c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor for (Preprocessor::macro_iterator M = PP.macro_begin(), 19590c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor MEnd = PP.macro_end(); 19603f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor M != MEnd; ++M) 1961bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(M->first); 19623f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor Results.ExitScope(); 19633f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor} 19643f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor 19653a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbarstatic void HandleCodeCompleteResults(Sema *S, 19663a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar CodeCompleteConsumer *CodeCompleter, 19673a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar CodeCompleteConsumer::Result *Results, 19683a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar unsigned NumResults) { 196986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor std::stable_sort(Results, Results + NumResults, SortCodeCompleteResult()); 197086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 197186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (CodeCompleter) 19723a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar CodeCompleter->ProcessCodeCompleteResults(*S, Results, NumResults); 197354f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor 197454f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor for (unsigned I = 0; I != NumResults; ++I) 197554f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor Results[I].Destroy(); 197686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 197786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 197801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregorvoid Sema::CodeCompleteOrdinaryName(Scope *S, 197901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor CodeCompletionContext CompletionContext) { 19802a7925c4abe45650f3ab27be09468e3a3a98084aDouglas Gregor typedef CodeCompleteConsumer::Result Result; 198101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor ResultBuilder Results(*this); 198201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 198301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Determine how to filter results, e.g., so that the names of 198401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // values (functions, enumerators, function templates, etc.) are 198501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // only allowed where we can have an expression. 198601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor switch (CompletionContext) { 198701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CCC_Namespace: 198801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CCC_Class: 1989b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor case CCC_ObjCInterface: 1990b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor case CCC_ObjCImplementation: 1991c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor case CCC_ObjCInstanceVariableList: 199201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CCC_Template: 199301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CCC_MemberTemplate: 199401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Results.setFilter(&ResultBuilder::IsOrdinaryNonValueName); 199501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 199601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 199701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CCC_Expression: 199801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CCC_Statement: 199901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CCC_ForInit: 200001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CCC_Condition: 200101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Results.setFilter(&ResultBuilder::IsOrdinaryName); 200201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 200301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 200401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 20051ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 20061ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer); 20072a7925c4abe45650f3ab27be09468e3a3a98084aDouglas Gregor 20082a7925c4abe45650f3ab27be09468e3a3a98084aDouglas Gregor Results.EnterNewScope(); 2009bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddOrdinaryNameResults(CompletionContext, S, *this, Results); 20102a7925c4abe45650f3ab27be09468e3a3a98084aDouglas Gregor Results.ExitScope(); 20112a7925c4abe45650f3ab27be09468e3a3a98084aDouglas Gregor 20120c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor if (CodeCompleter->includeMacros()) 2013bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddMacroResults(PP, Results); 20143a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 2015791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor} 2016791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor 201795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregorstatic void AddObjCProperties(ObjCContainerDecl *Container, 2018322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor bool AllowCategories, 201995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor DeclContext *CurContext, 202095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor ResultBuilder &Results) { 202195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor typedef CodeCompleteConsumer::Result Result; 202295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 202395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Add properties in this container. 202495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor for (ObjCContainerDecl::prop_iterator P = Container->prop_begin(), 202595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor PEnd = Container->prop_end(); 202695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor P != PEnd; 202795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor ++P) 202895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor Results.MaybeAddResult(Result(*P, 0), CurContext); 202995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 203095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Add properties in referenced protocols. 203195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) { 203295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor for (ObjCProtocolDecl::protocol_iterator P = Protocol->protocol_begin(), 203395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor PEnd = Protocol->protocol_end(); 203495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor P != PEnd; ++P) 2035322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor AddObjCProperties(*P, AllowCategories, CurContext, Results); 203695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } else if (ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container)){ 2037322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor if (AllowCategories) { 2038322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Look through categories. 2039322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor for (ObjCCategoryDecl *Category = IFace->getCategoryList(); 2040322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Category; Category = Category->getNextClassCategory()) 2041322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor AddObjCProperties(Category, AllowCategories, CurContext, Results); 2042322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor } 204395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 204495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Look through protocols. 204595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor for (ObjCInterfaceDecl::protocol_iterator I = IFace->protocol_begin(), 204695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor E = IFace->protocol_end(); 204795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor I != E; ++I) 2048322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor AddObjCProperties(*I, AllowCategories, CurContext, Results); 204995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 205095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Look in the superclass. 205195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (IFace->getSuperClass()) 2052322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor AddObjCProperties(IFace->getSuperClass(), AllowCategories, CurContext, 2053322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Results); 205495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } else if (const ObjCCategoryDecl *Category 205595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor = dyn_cast<ObjCCategoryDecl>(Container)) { 205695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Look through protocols. 205795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor for (ObjCInterfaceDecl::protocol_iterator P = Category->protocol_begin(), 205895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor PEnd = Category->protocol_end(); 205995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor P != PEnd; ++P) 2060322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor AddObjCProperties(*P, AllowCategories, CurContext, Results); 206195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } 206295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor} 206395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 206481b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregorvoid Sema::CodeCompleteMemberReferenceExpr(Scope *S, ExprTy *BaseE, 206581b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor SourceLocation OpLoc, 206681b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor bool IsArrow) { 206781b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor if (!BaseE || !CodeCompleter) 206881b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor return; 206981b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor 207086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor typedef CodeCompleteConsumer::Result Result; 207186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 207281b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor Expr *Base = static_cast<Expr *>(BaseE); 207381b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor QualType BaseType = Base->getType(); 207486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 207586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (IsArrow) { 207686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (const PointerType *Ptr = BaseType->getAs<PointerType>()) 207786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor BaseType = Ptr->getPointeeType(); 207886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor else if (BaseType->isObjCObjectPointerType()) 207986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /*Do nothing*/ ; 208086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor else 208186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return; 208286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 208386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 2084eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor ResultBuilder Results(*this, &ResultBuilder::IsMember); 208595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor Results.EnterNewScope(); 208695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (const RecordType *Record = BaseType->getAs<RecordType>()) { 208795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Access to a C/C++ class, struct, or union. 208845bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor Results.allowNestedNameSpecifiers(); 2089bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor CollectMemberLookupResults(Record->getDecl(), Record->getDecl(), Results); 20903a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar 209195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (getLangOptions().CPlusPlus) { 209295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (!Results.empty()) { 209395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // The "template" keyword can follow "->" or "." in the grammar. 209495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // However, we only want to suggest the template keyword if something 209595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // is dependent. 209695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor bool IsDependent = BaseType->isDependentType(); 209795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (!IsDependent) { 209895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor for (Scope *DepScope = S; DepScope; DepScope = DepScope->getParent()) 209995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (DeclContext *Ctx = (DeclContext *)DepScope->getEntity()) { 210095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor IsDependent = Ctx->isDependentContext(); 210195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor break; 210295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } 210395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } 21043a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar 210595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (IsDependent) 2106bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result("template")); 210786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 210895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } 210995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } else if (!IsArrow && BaseType->getAsObjCInterfacePointerType()) { 211095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Objective-C property reference. 211195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 211295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Add property results based on our interface. 211395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor const ObjCObjectPointerType *ObjCPtr 211495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor = BaseType->getAsObjCInterfacePointerType(); 211595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor assert(ObjCPtr && "Non-NULL pointer guaranteed above!"); 2116322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor AddObjCProperties(ObjCPtr->getInterfaceDecl(), true, CurContext, Results); 211795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 211895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Add properties from the protocols in a qualified interface. 211995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor for (ObjCObjectPointerType::qual_iterator I = ObjCPtr->qual_begin(), 212095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor E = ObjCPtr->qual_end(); 212195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor I != E; ++I) 2122322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor AddObjCProperties(*I, true, CurContext, Results); 212395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } else if ((IsArrow && BaseType->isObjCObjectPointerType()) || 212495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor (!IsArrow && BaseType->isObjCInterfaceType())) { 212595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Objective-C instance variable access. 212695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor ObjCInterfaceDecl *Class = 0; 212795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (const ObjCObjectPointerType *ObjCPtr 212895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor = BaseType->getAs<ObjCObjectPointerType>()) 212995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor Class = ObjCPtr->getInterfaceDecl(); 213095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor else 213195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor Class = BaseType->getAs<ObjCInterfaceType>()->getDecl(); 213295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 213395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Add all ivars from this class and its superclasses. 213495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor for (; Class; Class = Class->getSuperClass()) { 213595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor for (ObjCInterfaceDecl::ivar_iterator IVar = Class->ivar_begin(), 213695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor IVarEnd = Class->ivar_end(); 213795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor IVar != IVarEnd; ++IVar) 213895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor Results.MaybeAddResult(Result(*IVar, 0), CurContext); 213986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 214086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 214195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 214295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // FIXME: How do we cope with isa? 214395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 214495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor Results.ExitScope(); 21453a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar 21463a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar // Add macros 21473a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar if (CodeCompleter->includeMacros()) 2148bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddMacroResults(PP, Results); 21493a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar 21503a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar // Hand off the results found for code completion. 21513a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 215281b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor} 215381b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor 2154374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregorvoid Sema::CodeCompleteTag(Scope *S, unsigned TagSpec) { 2155374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor if (!CodeCompleter) 2156374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor return; 2157374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor 215886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor typedef CodeCompleteConsumer::Result Result; 215986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ResultBuilder::LookupFilter Filter = 0; 2160374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor switch ((DeclSpec::TST)TagSpec) { 2161374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor case DeclSpec::TST_enum: 216286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Filter = &ResultBuilder::IsEnum; 2163374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor break; 2164374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor 2165374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor case DeclSpec::TST_union: 216686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Filter = &ResultBuilder::IsUnion; 2167374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor break; 2168374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor 2169374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor case DeclSpec::TST_struct: 2170374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor case DeclSpec::TST_class: 217186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Filter = &ResultBuilder::IsClassOrStruct; 2172374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor break; 2173374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor 2174374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor default: 2175374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor assert(false && "Unknown type specifier kind in CodeCompleteTag"); 2176374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor return; 2177374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor } 217886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 217986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ResultBuilder Results(*this, Filter); 218045bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor Results.allowNestedNameSpecifiers(); 21815d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 21825d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor LookupVisibleDecls(S, LookupTagName, Consumer); 218386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 21840c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor if (CodeCompleter->includeMacros()) 2185bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddMacroResults(PP, Results); 21863a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 2187374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor} 2188374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor 21893e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregorvoid Sema::CodeCompleteCase(Scope *S) { 21903e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor if (getSwitchStack().empty() || !CodeCompleter) 21913e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor return; 21923e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 21933e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor SwitchStmt *Switch = getSwitchStack().back(); 21943e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor if (!Switch->getCond()->getType()->isEnumeralType()) 21953e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor return; 21963e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 21973e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // Code-complete the cases of a switch statement over an enumeration type 21983e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // by providing the list of 21993e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor EnumDecl *Enum = Switch->getCond()->getType()->getAs<EnumType>()->getDecl(); 22003e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 22013e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // Determine which enumerators we have already seen in the switch statement. 22023e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // FIXME: Ideally, we would also be able to look *past* the code-completion 22033e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // token, in case we are code-completing in the middle of the switch and not 22043e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // at the end. However, we aren't able to do so at the moment. 22053e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor llvm::SmallPtrSet<EnumConstantDecl *, 8> EnumeratorsSeen; 2206b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor NestedNameSpecifier *Qualifier = 0; 22073e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor for (SwitchCase *SC = Switch->getSwitchCaseList(); SC; 22083e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor SC = SC->getNextSwitchCase()) { 22093e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor CaseStmt *Case = dyn_cast<CaseStmt>(SC); 22103e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor if (!Case) 22113e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor continue; 22123e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 22133e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor Expr *CaseVal = Case->getLHS()->IgnoreParenCasts(); 22143e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(CaseVal)) 22153e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor if (EnumConstantDecl *Enumerator 22163e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor = dyn_cast<EnumConstantDecl>(DRE->getDecl())) { 22173e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // We look into the AST of the case statement to determine which 22183e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // enumerator was named. Alternatively, we could compute the value of 22193e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // the integral constant expression, then compare it against the 22203e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // values of each enumerator. However, value-based approach would not 22213e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // work as well with C++ templates where enumerators declared within a 22223e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // template are type- and value-dependent. 22233e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor EnumeratorsSeen.insert(Enumerator); 22243e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 2225b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // If this is a qualified-id, keep track of the nested-name-specifier 2226b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // so that we can reproduce it as part of code completion, e.g., 22273e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // 22283e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // switch (TagD.getKind()) { 22293e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // case TagDecl::TK_enum: 22303e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // break; 22313e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // case XXX 22323e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // 2233b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // At the XXX, our completions are TagDecl::TK_union, 22343e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // TagDecl::TK_struct, and TagDecl::TK_class, rather than TK_union, 22353e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // TK_struct, and TK_class. 2236a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor Qualifier = DRE->getQualifier(); 22373e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor } 22383e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor } 22393e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 2240b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor if (getLangOptions().CPlusPlus && !Qualifier && EnumeratorsSeen.empty()) { 2241b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // If there are no prior enumerators in C++, check whether we have to 2242b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // qualify the names of the enumerators that we suggest, because they 2243b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // may not be visible in this scope. 2244b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor Qualifier = getRequiredQualification(Context, CurContext, 2245b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor Enum->getDeclContext()); 2246b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor 2247b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // FIXME: Scoped enums need to start with "EnumDecl" as the context! 2248b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor } 2249b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor 22503e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // Add any enumerators that have not yet been mentioned. 22513e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor ResultBuilder Results(*this); 22523e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor Results.EnterNewScope(); 22533e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor for (EnumDecl::enumerator_iterator E = Enum->enumerator_begin(), 22543e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor EEnd = Enum->enumerator_end(); 22553e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor E != EEnd; ++E) { 22563e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor if (EnumeratorsSeen.count(*E)) 22573e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor continue; 22583e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 2259bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(CodeCompleteConsumer::Result(*E, Qualifier)); 22603e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor } 22613e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor Results.ExitScope(); 22623e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 22630c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor if (CodeCompleter->includeMacros()) 2264bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddMacroResults(PP, Results); 22653a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 22663e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor} 22673e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 22689c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregornamespace { 22699c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor struct IsBetterOverloadCandidate { 22709c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor Sema &S; 22719c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 22729c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor public: 22739c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor explicit IsBetterOverloadCandidate(Sema &S) : S(S) { } 22749c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 22759c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor bool 22769c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor operator()(const OverloadCandidate &X, const OverloadCandidate &Y) const { 22779c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor return S.isBetterOverloadCandidate(X, Y); 22789c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor } 22799c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor }; 22809c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor} 22819c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 22829c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregorvoid Sema::CodeCompleteCall(Scope *S, ExprTy *FnIn, 22839c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor ExprTy **ArgsIn, unsigned NumArgs) { 22849c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor if (!CodeCompleter) 22859c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor return; 2286ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor 2287ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor // When we're code-completing for a call, we fall back to ordinary 2288ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor // name code-completion whenever we can't produce specific 2289ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor // results. We may want to revisit this strategy in the future, 2290ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor // e.g., by merging the two kinds of results. 2291ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor 22929c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor Expr *Fn = (Expr *)FnIn; 22939c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor Expr **Args = (Expr **)ArgsIn; 2294ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor 22959c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor // Ignore type-dependent call expressions entirely. 22969c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor if (Fn->isTypeDependent() || 2297ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor Expr::hasAnyTypeDependentArguments(Args, NumArgs)) { 229801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor CodeCompleteOrdinaryName(S, CCC_Expression); 22999c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor return; 2300ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor } 23019c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 23023b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall // Build an overload candidate set based on the functions we find. 23033b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall OverloadCandidateSet CandidateSet; 23043b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall 23059c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor // FIXME: What if we're calling something that isn't a function declaration? 23069c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor // FIXME: What if we're calling a pseudo-destructor? 23079c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor // FIXME: What if we're calling a member function? 23089c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 23093b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall Expr *NakedFn = Fn->IgnoreParenCasts(); 23103b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(NakedFn)) 23113b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall AddOverloadedCallCandidates(ULE, Args, NumArgs, CandidateSet, 23123b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall /*PartialOverloading=*/ true); 23133b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall else if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(NakedFn)) { 23143b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall FunctionDecl *FDecl = dyn_cast<FunctionDecl>(DRE->getDecl()); 23153b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall if (FDecl) 23163b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall AddOverloadCandidate(FDecl, Args, NumArgs, CandidateSet, 23173b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall false, false, /*PartialOverloading*/ true); 23183b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall } 23199c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 23209c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor // Sort the overload candidate set by placing the best overloads first. 23219c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor std::stable_sort(CandidateSet.begin(), CandidateSet.end(), 23229c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor IsBetterOverloadCandidate(*this)); 23239c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 23249c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor // Add the remaining viable overload candidates as code-completion reslults. 23250594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor typedef CodeCompleteConsumer::OverloadCandidate ResultCandidate; 23260594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor llvm::SmallVector<ResultCandidate, 8> Results; 232790756300f3c8beea14b7ae0c229405981e2870c2Anders Carlsson 23289c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor for (OverloadCandidateSet::iterator Cand = CandidateSet.begin(), 23299c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor CandEnd = CandidateSet.end(); 23309c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor Cand != CandEnd; ++Cand) { 23319c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor if (Cand->Viable) 23320594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor Results.push_back(ResultCandidate(Cand->Function)); 23339c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor } 2334ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor 2335ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor if (Results.empty()) 233601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor CodeCompleteOrdinaryName(S, CCC_Expression); 2337ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor else 2338ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor CodeCompleter->ProcessOverloadCandidates(*this, NumArgs, Results.data(), 2339ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor Results.size()); 23409c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor} 23419c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 234281b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregorvoid Sema::CodeCompleteQualifiedId(Scope *S, const CXXScopeSpec &SS, 234381b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor bool EnteringContext) { 234481b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor if (!SS.getScopeRep() || !CodeCompleter) 234581b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor return; 234681b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor 234786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor DeclContext *Ctx = computeDeclContext(SS, EnteringContext); 234886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!Ctx) 234986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return; 2350d1cd31aeb806077340be94e32429f3192cf139b0Douglas Gregor 2351d1cd31aeb806077340be94e32429f3192cf139b0Douglas Gregor // Try to instantiate any non-dependent declaration contexts before 2352d1cd31aeb806077340be94e32429f3192cf139b0Douglas Gregor // we look in them. 2353d1cd31aeb806077340be94e32429f3192cf139b0Douglas Gregor if (!isDependentScopeSpecifier(SS) && RequireCompleteDeclContext(SS)) 2354d1cd31aeb806077340be94e32429f3192cf139b0Douglas Gregor return; 2355d1cd31aeb806077340be94e32429f3192cf139b0Douglas Gregor 235686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ResultBuilder Results(*this); 2357bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor CollectMemberLookupResults(Ctx, Ctx, Results); 235886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 235986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // The "template" keyword can follow "::" in the grammar, but only 236086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // put it into the grammar if the nested-name-specifier is dependent. 236186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NestedNameSpecifier *NNS = (NestedNameSpecifier *)SS.getScopeRep(); 236286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!Results.empty() && NNS->isDependent()) 2363bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult("template"); 236486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 23650c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor if (CodeCompleter->includeMacros()) 2366bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddMacroResults(PP, Results); 23673a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 236881b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor} 236949f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 237049f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregorvoid Sema::CodeCompleteUsing(Scope *S) { 237149f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor if (!CodeCompleter) 237249f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor return; 237349f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 237486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ResultBuilder Results(*this, &ResultBuilder::IsNestedNameSpecifier); 23758e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.EnterNewScope(); 237686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 237786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // If we aren't in class scope, we could see the "namespace" keyword. 237886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!S->isClassScope()) 2379bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(CodeCompleteConsumer::Result("namespace")); 238086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 238186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // After "using", we can see anything that would start a 238286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // nested-name-specifier. 23835d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 23845d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer); 23858e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.ExitScope(); 238686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 23870c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor if (CodeCompleter->includeMacros()) 2388bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddMacroResults(PP, Results); 23893a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 239049f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor} 239149f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 239249f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregorvoid Sema::CodeCompleteUsingDirective(Scope *S) { 239349f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor if (!CodeCompleter) 239449f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor return; 239549f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 239686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // After "using namespace", we expect to see a namespace name or namespace 239786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // alias. 239886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ResultBuilder Results(*this, &ResultBuilder::IsNamespaceOrAlias); 23998e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.EnterNewScope(); 24005d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 24015d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer); 24028e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.ExitScope(); 24030c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor if (CodeCompleter->includeMacros()) 2404bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddMacroResults(PP, Results); 24053a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 240649f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor} 240749f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 240849f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregorvoid Sema::CodeCompleteNamespaceDecl(Scope *S) { 240949f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor if (!CodeCompleter) 241049f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor return; 241149f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 241286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ResultBuilder Results(*this, &ResultBuilder::IsNamespace); 241386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor DeclContext *Ctx = (DeclContext *)S->getEntity(); 241486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!S->getParent()) 241586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Ctx = Context.getTranslationUnitDecl(); 241686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 241786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (Ctx && Ctx->isFileContext()) { 241886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // We only want to see those namespaces that have already been defined 241986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // within this scope, because its likely that the user is creating an 242086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // extended namespace declaration. Keep track of the most recent 242186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // definition of each namespace. 242286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor std::map<NamespaceDecl *, NamespaceDecl *> OrigToLatest; 242386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor for (DeclContext::specific_decl_iterator<NamespaceDecl> 242486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NS(Ctx->decls_begin()), NSEnd(Ctx->decls_end()); 242586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NS != NSEnd; ++NS) 242686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor OrigToLatest[NS->getOriginalNamespace()] = *NS; 242786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 242886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add the most recent definition (or extended definition) of each 242986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // namespace to the list of results. 24308e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.EnterNewScope(); 243186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor for (std::map<NamespaceDecl *, NamespaceDecl *>::iterator 243286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NS = OrigToLatest.begin(), NSEnd = OrigToLatest.end(); 243386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NS != NSEnd; ++NS) 2434456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor Results.MaybeAddResult(CodeCompleteConsumer::Result(NS->second, 0), 2435456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor CurContext); 24368e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.ExitScope(); 243786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 243886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 24390c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor if (CodeCompleter->includeMacros()) 2440bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddMacroResults(PP, Results); 24413a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 244249f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor} 244349f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 244449f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregorvoid Sema::CodeCompleteNamespaceAliasDecl(Scope *S) { 244549f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor if (!CodeCompleter) 244649f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor return; 244749f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 244886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // After "namespace", we expect to see a namespace or alias. 244986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ResultBuilder Results(*this, &ResultBuilder::IsNamespaceOrAlias); 24505d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 24515d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer); 24520c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor if (CodeCompleter->includeMacros()) 2453bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddMacroResults(PP, Results); 24543a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 245549f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor} 245649f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 2457ed8d322b4086b8b1e1f78b21389cabb23457dcb3Douglas Gregorvoid Sema::CodeCompleteOperatorName(Scope *S) { 2458ed8d322b4086b8b1e1f78b21389cabb23457dcb3Douglas Gregor if (!CodeCompleter) 2459ed8d322b4086b8b1e1f78b21389cabb23457dcb3Douglas Gregor return; 246086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 246186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor typedef CodeCompleteConsumer::Result Result; 246286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ResultBuilder Results(*this, &ResultBuilder::IsType); 24638e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.EnterNewScope(); 246486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 246586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add the names of overloadable operators. 246686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 246786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (std::strcmp(Spelling, "?")) \ 2468bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Spelling)); 246986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor#include "clang/Basic/OperatorKinds.def" 247086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 247186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add any type names visible from the current scope 247245bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor Results.allowNestedNameSpecifiers(); 24735d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 24745d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer); 247586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 247686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add any type specifiers 2477bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddTypeSpecifierResults(getLangOptions(), Results); 24788e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.ExitScope(); 2479ed8d322b4086b8b1e1f78b21389cabb23457dcb3Douglas Gregor 24800c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor if (CodeCompleter->includeMacros()) 2481bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddMacroResults(PP, Results); 24823a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 2483c464ae8444edb6d07ea49b7a0eae1674c0fa1bb8Douglas Gregor} 2484c464ae8444edb6d07ea49b7a0eae1674c0fa1bb8Douglas Gregor 2485b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor// Macro that expands to @Keyword or Keyword, depending on whether NeedAt is 2486b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor// true or false. 2487b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor#define OBJC_AT_KEYWORD_NAME(NeedAt,Keyword) NeedAt? "@" #Keyword : #Keyword 2488bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCImplementationResults(const LangOptions &LangOpts, 2489b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor ResultBuilder &Results, 2490b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor bool NeedAt) { 2491c464ae8444edb6d07ea49b7a0eae1674c0fa1bb8Douglas Gregor typedef CodeCompleteConsumer::Result Result; 2492b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // Since we have an implementation, we can end it. 2493bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,end))); 2494b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 2495b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor CodeCompletionString *Pattern = 0; 2496b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor if (LangOpts.ObjC2) { 2497b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @dynamic 2498c464ae8444edb6d07ea49b7a0eae1674c0fa1bb8Douglas Gregor Pattern = new CodeCompletionString; 2499b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,dynamic)); 2500834389b87451b24618513b907b4dfb5b00d211f3Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 2501b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddPlaceholderChunk("property"); 2502bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 2503b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 2504b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @synthesize 2505c464ae8444edb6d07ea49b7a0eae1674c0fa1bb8Douglas Gregor Pattern = new CodeCompletionString; 2506b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,synthesize)); 2507834389b87451b24618513b907b4dfb5b00d211f3Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 2508b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddPlaceholderChunk("property"); 2509bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 2510b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor } 2511b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor} 2512c464ae8444edb6d07ea49b7a0eae1674c0fa1bb8Douglas Gregor 2513bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCInterfaceResults(const LangOptions &LangOpts, 2514b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor ResultBuilder &Results, 2515b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor bool NeedAt) { 2516b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor typedef CodeCompleteConsumer::Result Result; 2517b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 2518b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // Since we have an interface or protocol, we can end it. 2519bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,end))); 2520b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 2521b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor if (LangOpts.ObjC2) { 2522b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @property 2523bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,property))); 2524b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 2525b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @required 2526bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,required))); 2527b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 2528b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @optional 2529bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,optional))); 2530b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor } 2531b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor} 2532834389b87451b24618513b907b4dfb5b00d211f3Douglas Gregor 2533bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCTopLevelResults(ResultBuilder &Results, bool NeedAt) { 2534b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor typedef CodeCompleteConsumer::Result Result; 2535b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor CodeCompletionString *Pattern = 0; 2536b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 2537b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @class name ; 2538b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern = new CodeCompletionString; 2539b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,class)); 2540b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 2541b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddPlaceholderChunk("identifier"); 2542b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_SemiColon); 2543bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 2544b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 2545b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @interface name 2546b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // FIXME: Could introduce the whole pattern, including superclasses and 2547b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // such. 2548b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern = new CodeCompletionString; 2549b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,interface)); 2550b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 2551b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddPlaceholderChunk("class"); 2552bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 2553b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 2554b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @protocol name 2555b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern = new CodeCompletionString; 2556b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,protocol)); 2557b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 2558b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddPlaceholderChunk("protocol"); 2559bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 2560b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 2561b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @implementation name 2562b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern = new CodeCompletionString; 2563b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,implementation)); 2564b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 2565b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddPlaceholderChunk("class"); 2566bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 2567b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 2568b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @compatibility_alias name 2569b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern = new CodeCompletionString; 2570b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,compatibility_alias)); 2571b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 2572b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddPlaceholderChunk("alias"); 2573b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 2574b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddPlaceholderChunk("class"); 2575bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 2576b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor} 2577834389b87451b24618513b907b4dfb5b00d211f3Douglas Gregor 2578b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregorvoid Sema::CodeCompleteObjCAtDirective(Scope *S, DeclPtrTy ObjCImpDecl, 2579b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor bool InInterface) { 2580b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor typedef CodeCompleteConsumer::Result Result; 2581b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor ResultBuilder Results(*this); 2582b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Results.EnterNewScope(); 2583b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor if (ObjCImpDecl) 2584bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCImplementationResults(getLangOptions(), Results, false); 2585b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor else if (InInterface) 2586bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCInterfaceResults(getLangOptions(), Results, false); 2587b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor else 2588bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCTopLevelResults(Results, false); 2589c464ae8444edb6d07ea49b7a0eae1674c0fa1bb8Douglas Gregor Results.ExitScope(); 2590c464ae8444edb6d07ea49b7a0eae1674c0fa1bb8Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 25919a0c85e640a08174569a303db22981612f05d385Douglas Gregor} 25929a0c85e640a08174569a303db22981612f05d385Douglas Gregor 2593bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCExpressionResults(ResultBuilder &Results, bool NeedAt) { 25949a0c85e640a08174569a303db22981612f05d385Douglas Gregor typedef CodeCompleteConsumer::Result Result; 25959a0c85e640a08174569a303db22981612f05d385Douglas Gregor CodeCompletionString *Pattern = 0; 25969a0c85e640a08174569a303db22981612f05d385Douglas Gregor 25979a0c85e640a08174569a303db22981612f05d385Douglas Gregor // @encode ( type-name ) 25989a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern = new CodeCompletionString; 2599b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,encode)); 26009a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 26019a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddPlaceholderChunk("type-name"); 26029a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 2603bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 26049a0c85e640a08174569a303db22981612f05d385Douglas Gregor 26059a0c85e640a08174569a303db22981612f05d385Douglas Gregor // @protocol ( protocol-name ) 26069a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern = new CodeCompletionString; 2607b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,protocol)); 26089a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 26099a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddPlaceholderChunk("protocol-name"); 26109a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 2611bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 26129a0c85e640a08174569a303db22981612f05d385Douglas Gregor 26139a0c85e640a08174569a303db22981612f05d385Douglas Gregor // @selector ( selector ) 26149a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern = new CodeCompletionString; 2615b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,selector)); 26169a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 26179a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddPlaceholderChunk("selector"); 26189a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 2619bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 26209a0c85e640a08174569a303db22981612f05d385Douglas Gregor} 26219a0c85e640a08174569a303db22981612f05d385Douglas Gregor 2622bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCStatementResults(ResultBuilder &Results, bool NeedAt) { 26239a0c85e640a08174569a303db22981612f05d385Douglas Gregor typedef CodeCompleteConsumer::Result Result; 26249a0c85e640a08174569a303db22981612f05d385Douglas Gregor CodeCompletionString *Pattern = 0; 2625b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 26269a0c85e640a08174569a303db22981612f05d385Douglas Gregor // @try { statements } @catch ( declaration ) { statements } @finally 26279a0c85e640a08174569a303db22981612f05d385Douglas Gregor // { statements } 26289a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern = new CodeCompletionString; 2629b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,try)); 26309a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftBrace); 26319a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddPlaceholderChunk("statements"); 26329a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightBrace); 26339a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddTextChunk("@catch"); 26349a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 26359a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddPlaceholderChunk("parameter"); 26369a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 26379a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftBrace); 26389a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddPlaceholderChunk("statements"); 26399a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightBrace); 26409a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddTextChunk("@finally"); 26419a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftBrace); 26429a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddPlaceholderChunk("statements"); 26439a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightBrace); 2644bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 2645b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 26469a0c85e640a08174569a303db22981612f05d385Douglas Gregor // @throw 26479a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern = new CodeCompletionString; 2648b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,throw)); 2649834389b87451b24618513b907b4dfb5b00d211f3Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 26509a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddPlaceholderChunk("expression"); 2651834389b87451b24618513b907b4dfb5b00d211f3Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_SemiColon); 2652bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 2653b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 26549a0c85e640a08174569a303db22981612f05d385Douglas Gregor // @synchronized ( expression ) { statements } 26559a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern = new CodeCompletionString; 2656b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,synchronized)); 2657834389b87451b24618513b907b4dfb5b00d211f3Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 26589a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 26599a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddPlaceholderChunk("expression"); 26609a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 26619a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftBrace); 26629a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddPlaceholderChunk("statements"); 26639a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightBrace); 2664bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(Pattern)); 2665b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor} 26669a0c85e640a08174569a303db22981612f05d385Douglas Gregor 2667bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCVisibilityResults(const LangOptions &LangOpts, 2668c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor ResultBuilder &Results, 2669c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor bool NeedAt) { 2670b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor typedef CodeCompleteConsumer::Result Result; 2671bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,private))); 2672bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,protected))); 2673bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,public))); 2674c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor if (LangOpts.ObjC2) 2675bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,package))); 2676c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor} 2677c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor 2678c38c3e1e726630458154534227d74eda833d26a0Douglas Gregorvoid Sema::CodeCompleteObjCAtVisibility(Scope *S) { 2679c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor ResultBuilder Results(*this); 2680c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor Results.EnterNewScope(); 2681bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCVisibilityResults(getLangOptions(), Results, false); 2682c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor Results.ExitScope(); 2683c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 2684c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor} 2685c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor 2686c38c3e1e726630458154534227d74eda833d26a0Douglas Gregorvoid Sema::CodeCompleteObjCAtStatement(Scope *S) { 2687b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor ResultBuilder Results(*this); 2688b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Results.EnterNewScope(); 2689bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCStatementResults(Results, false); 2690bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCExpressionResults(Results, false); 26919a0c85e640a08174569a303db22981612f05d385Douglas Gregor Results.ExitScope(); 26929a0c85e640a08174569a303db22981612f05d385Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 26939a0c85e640a08174569a303db22981612f05d385Douglas Gregor} 26949a0c85e640a08174569a303db22981612f05d385Douglas Gregor 26959a0c85e640a08174569a303db22981612f05d385Douglas Gregorvoid Sema::CodeCompleteObjCAtExpression(Scope *S) { 26969a0c85e640a08174569a303db22981612f05d385Douglas Gregor ResultBuilder Results(*this); 26979a0c85e640a08174569a303db22981612f05d385Douglas Gregor Results.EnterNewScope(); 2698bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCExpressionResults(Results, false); 26999a0c85e640a08174569a303db22981612f05d385Douglas Gregor Results.ExitScope(); 27009a0c85e640a08174569a303db22981612f05d385Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 2701ed8d322b4086b8b1e1f78b21389cabb23457dcb3Douglas Gregor} 270249f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 2703988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor/// \brief Determine whether the addition of the given flag to an Objective-C 2704988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor/// property's attributes will cause a conflict. 2705988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregorstatic bool ObjCPropertyFlagConflicts(unsigned Attributes, unsigned NewFlag) { 2706988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor // Check if we've already added this flag. 2707988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (Attributes & NewFlag) 2708988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor return true; 2709988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor 2710988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor Attributes |= NewFlag; 2711988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor 2712988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor // Check for collisions with "readonly". 2713988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if ((Attributes & ObjCDeclSpec::DQ_PR_readonly) && 2714988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor (Attributes & (ObjCDeclSpec::DQ_PR_readwrite | 2715988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor ObjCDeclSpec::DQ_PR_assign | 2716988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor ObjCDeclSpec::DQ_PR_copy | 2717988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor ObjCDeclSpec::DQ_PR_retain))) 2718988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor return true; 2719988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor 2720988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor // Check for more than one of { assign, copy, retain }. 2721988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor unsigned AssignCopyRetMask = Attributes & (ObjCDeclSpec::DQ_PR_assign | 2722988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor ObjCDeclSpec::DQ_PR_copy | 2723988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor ObjCDeclSpec::DQ_PR_retain); 2724988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (AssignCopyRetMask && 2725988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor AssignCopyRetMask != ObjCDeclSpec::DQ_PR_assign && 2726988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor AssignCopyRetMask != ObjCDeclSpec::DQ_PR_copy && 2727988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor AssignCopyRetMask != ObjCDeclSpec::DQ_PR_retain) 2728988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor return true; 2729988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor 2730988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor return false; 2731988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor} 2732988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor 2733a93b108e025ef2480fa867cc533e7781a40a639bDouglas Gregorvoid Sema::CodeCompleteObjCPropertyFlags(Scope *S, ObjCDeclSpec &ODS) { 2734ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff if (!CodeCompleter) 2735ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff return; 2736d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor 2737ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff unsigned Attributes = ODS.getPropertyAttributes(); 2738ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff 2739ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff typedef CodeCompleteConsumer::Result Result; 2740ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff ResultBuilder Results(*this); 2741ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff Results.EnterNewScope(); 2742988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_readonly)) 2743bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(CodeCompleteConsumer::Result("readonly")); 2744988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_assign)) 2745bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(CodeCompleteConsumer::Result("assign")); 2746988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_readwrite)) 2747bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(CodeCompleteConsumer::Result("readwrite")); 2748988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_retain)) 2749bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(CodeCompleteConsumer::Result("retain")); 2750988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_copy)) 2751bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(CodeCompleteConsumer::Result("copy")); 2752988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_nonatomic)) 2753bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(CodeCompleteConsumer::Result("nonatomic")); 2754988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_setter)) { 275554f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor CodeCompletionString *Setter = new CodeCompletionString; 275654f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor Setter->AddTypedTextChunk("setter"); 275754f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor Setter->AddTextChunk(" = "); 275854f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor Setter->AddPlaceholderChunk("method"); 2759bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(CodeCompleteConsumer::Result(Setter)); 276054f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor } 2761988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_getter)) { 276254f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor CodeCompletionString *Getter = new CodeCompletionString; 276354f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor Getter->AddTypedTextChunk("getter"); 276454f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor Getter->AddTextChunk(" = "); 276554f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor Getter->AddPlaceholderChunk("method"); 2766bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor Results.MaybeAddResult(CodeCompleteConsumer::Result(Getter)); 276754f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor } 2768ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff Results.ExitScope(); 27693a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 2770ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff} 2771c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff 27724ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor/// \brief Descripts the kind of Objective-C method that we want to find 27734ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor/// via code completion. 27744ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregorenum ObjCMethodKind { 27754ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor MK_Any, //< Any kind of method, provided it means other specified criteria. 27764ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor MK_ZeroArgSelector, //< Zero-argument (unary) selector. 27774ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor MK_OneArgSelector //< One-argument selector. 27784ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor}; 27794ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 27804ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregorstatic bool isAcceptableObjCMethod(ObjCMethodDecl *Method, 27814ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor ObjCMethodKind WantKind, 27824ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor IdentifierInfo **SelIdents, 27834ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor unsigned NumSelIdents) { 27844ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Selector Sel = Method->getSelector(); 27854ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (NumSelIdents > Sel.getNumArgs()) 27864ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor return false; 27874ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 27884ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor switch (WantKind) { 27894ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor case MK_Any: break; 27904ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor case MK_ZeroArgSelector: return Sel.isUnarySelector(); 27914ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor case MK_OneArgSelector: return Sel.getNumArgs() == 1; 27924ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor } 27934ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 27944ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor for (unsigned I = 0; I != NumSelIdents; ++I) 27954ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (SelIdents[I] != Sel.getIdentifierInfoForSlot(I)) 27964ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor return false; 27974ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 27984ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor return true; 27994ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor} 28004ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 280136ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// \brief Add all of the Objective-C methods in the given Objective-C 280236ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// container to the set of results. 280336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// 280436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// The container will be a class, protocol, category, or implementation of 280536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// any of the above. This mether will recurse to include methods from 280636ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// the superclasses of classes along with their categories, protocols, and 280736ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// implementations. 280836ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// 280936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// \param Container the container in which we'll look to find methods. 281036ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// 281136ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// \param WantInstance whether to add instance methods (only); if false, this 281236ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// routine will add factory methods (only). 281336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// 281436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// \param CurContext the context in which we're performing the lookup that 281536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// finds methods. 281636ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// 281736ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// \param Results the structure into which we'll add results. 281836ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregorstatic void AddObjCMethods(ObjCContainerDecl *Container, 281936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor bool WantInstanceMethods, 28204ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor ObjCMethodKind WantKind, 2821d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor IdentifierInfo **SelIdents, 2822d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor unsigned NumSelIdents, 282336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor DeclContext *CurContext, 282436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor ResultBuilder &Results) { 282536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor typedef CodeCompleteConsumer::Result Result; 282636ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor for (ObjCContainerDecl::method_iterator M = Container->meth_begin(), 282736ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor MEnd = Container->meth_end(); 282836ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor M != MEnd; ++M) { 2829d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor if ((*M)->isInstanceMethod() == WantInstanceMethods) { 2830d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor // Check whether the selector identifiers we've been given are a 2831d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor // subset of the identifiers for this particular method. 28324ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (!isAcceptableObjCMethod(*M, WantKind, SelIdents, NumSelIdents)) 2833d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor continue; 28344ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 2835d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor Result R = Result(*M, 0); 2836d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor R.StartParameter = NumSelIdents; 28374ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor R.AllParametersAreInformative = (WantKind != MK_Any); 2838d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor Results.MaybeAddResult(R, CurContext); 2839d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor } 284036ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor } 284136ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 284236ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container); 284336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor if (!IFace) 284436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor return; 284536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 284636ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add methods in protocols. 284736ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor const ObjCList<ObjCProtocolDecl> &Protocols= IFace->getReferencedProtocols(); 284836ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 284936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor E = Protocols.end(); 285036ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor I != E; ++I) 28514ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents, NumSelIdents, 2852d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor CurContext, Results); 285336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 285436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add methods in categories. 285536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor for (ObjCCategoryDecl *CatDecl = IFace->getCategoryList(); CatDecl; 285636ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor CatDecl = CatDecl->getNextClassCategory()) { 28574ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(CatDecl, WantInstanceMethods, WantKind, SelIdents, 28584ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor NumSelIdents, CurContext, Results); 285936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 286036ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add a categories protocol methods. 286136ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor const ObjCList<ObjCProtocolDecl> &Protocols 286236ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor = CatDecl->getReferencedProtocols(); 286336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 286436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor E = Protocols.end(); 286536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor I != E; ++I) 28664ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents, 28674ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor NumSelIdents, CurContext, Results); 286836ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 286936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add methods in category implementations. 287036ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor if (ObjCCategoryImplDecl *Impl = CatDecl->getImplementation()) 28714ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(Impl, WantInstanceMethods, WantKind, SelIdents, 28724ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor NumSelIdents, CurContext, Results); 287336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor } 287436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 287536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add methods in superclass. 287636ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor if (IFace->getSuperClass()) 28774ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(IFace->getSuperClass(), WantInstanceMethods, WantKind, 28784ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor SelIdents, NumSelIdents, CurContext, Results); 287936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 288036ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add methods in our implementation, if any. 288136ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor if (ObjCImplementationDecl *Impl = IFace->getImplementation()) 28824ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(Impl, WantInstanceMethods, WantKind, SelIdents, 28834ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor NumSelIdents, CurContext, Results); 28844ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor} 28854ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 28864ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 28874ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregorvoid Sema::CodeCompleteObjCPropertyGetter(Scope *S, DeclPtrTy ClassDecl, 28884ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor DeclPtrTy *Methods, 28894ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor unsigned NumMethods) { 28904ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor typedef CodeCompleteConsumer::Result Result; 28914ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 28924ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor // Try to find the interface where getters might live. 28934ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor ObjCInterfaceDecl *Class 28944ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor = dyn_cast_or_null<ObjCInterfaceDecl>(ClassDecl.getAs<Decl>()); 28954ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (!Class) { 28964ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (ObjCCategoryDecl *Category 28974ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor = dyn_cast_or_null<ObjCCategoryDecl>(ClassDecl.getAs<Decl>())) 28984ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Class = Category->getClassInterface(); 28994ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 29004ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (!Class) 29014ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor return; 29024ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor } 29034ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 29044ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor // Find all of the potential getters. 29054ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor ResultBuilder Results(*this); 29064ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Results.EnterNewScope(); 29074ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 29084ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor // FIXME: We need to do this because Objective-C methods don't get 29094ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor // pushed into DeclContexts early enough. Argh! 29104ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor for (unsigned I = 0; I != NumMethods; ++I) { 29114ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (ObjCMethodDecl *Method 29124ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor = dyn_cast_or_null<ObjCMethodDecl>(Methods[I].getAs<Decl>())) 29134ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (Method->isInstanceMethod() && 29144ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor isAcceptableObjCMethod(Method, MK_ZeroArgSelector, 0, 0)) { 29154ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Result R = Result(Method, 0); 29164ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor R.AllParametersAreInformative = true; 29174ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Results.MaybeAddResult(R, CurContext); 29184ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor } 29194ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor } 29204ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 29214ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(Class, true, MK_ZeroArgSelector, 0, 0, CurContext, Results); 29224ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Results.ExitScope(); 29234ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter,Results.data(),Results.size()); 29244ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor} 29254ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 29264ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregorvoid Sema::CodeCompleteObjCPropertySetter(Scope *S, DeclPtrTy ObjCImplDecl, 29274ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor DeclPtrTy *Methods, 29284ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor unsigned NumMethods) { 29294ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor typedef CodeCompleteConsumer::Result Result; 29304ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 29314ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor // Try to find the interface where setters might live. 29324ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor ObjCInterfaceDecl *Class 29334ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor = dyn_cast_or_null<ObjCInterfaceDecl>(ObjCImplDecl.getAs<Decl>()); 29344ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (!Class) { 29354ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (ObjCCategoryDecl *Category 29364ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor = dyn_cast_or_null<ObjCCategoryDecl>(ObjCImplDecl.getAs<Decl>())) 29374ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Class = Category->getClassInterface(); 29384ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 29394ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (!Class) 29404ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor return; 29414ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor } 29424ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 29434ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor // Find all of the potential getters. 29444ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor ResultBuilder Results(*this); 29454ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Results.EnterNewScope(); 29464ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 29474ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor // FIXME: We need to do this because Objective-C methods don't get 29484ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor // pushed into DeclContexts early enough. Argh! 29494ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor for (unsigned I = 0; I != NumMethods; ++I) { 29504ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (ObjCMethodDecl *Method 29514ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor = dyn_cast_or_null<ObjCMethodDecl>(Methods[I].getAs<Decl>())) 29524ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (Method->isInstanceMethod() && 29534ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor isAcceptableObjCMethod(Method, MK_OneArgSelector, 0, 0)) { 29544ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Result R = Result(Method, 0); 29554ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor R.AllParametersAreInformative = true; 29564ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Results.MaybeAddResult(R, CurContext); 29574ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor } 29584ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor } 29594ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 29604ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(Class, true, MK_OneArgSelector, 0, 0, CurContext, Results); 29614ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 29624ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Results.ExitScope(); 29634ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter,Results.data(),Results.size()); 296436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor} 296536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 296660b01cc44855d62979f76dc4cdffa4277f321049Douglas Gregorvoid Sema::CodeCompleteObjCClassMessage(Scope *S, IdentifierInfo *FName, 2967d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor SourceLocation FNameLoc, 2968d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor IdentifierInfo **SelIdents, 2969d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor unsigned NumSelIdents) { 2970c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff typedef CodeCompleteConsumer::Result Result; 297124a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor ObjCInterfaceDecl *CDecl = 0; 297224a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor 297324a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor if (FName->isStr("super")) { 297424a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor // We're sending a message to "super". 297524a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) { 297624a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor // Figure out which interface we're in. 297724a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor CDecl = CurMethod->getClassInterface(); 297824a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor if (!CDecl) 297924a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor return; 298024a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor 298124a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor // Find the superclass of this class. 298224a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor CDecl = CDecl->getSuperClass(); 298324a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor if (!CDecl) 298424a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor return; 298524a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor 298624a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor if (CurMethod->isInstanceMethod()) { 298724a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor // We are inside an instance method, which means that the message 298824a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor // send [super ...] is actually calling an instance method on the 298924a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor // current object. Build the super expression and handle this like 299024a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor // an instance method. 299124a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor QualType SuperTy = Context.getObjCInterfaceType(CDecl); 299224a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor SuperTy = Context.getObjCObjectPointerType(SuperTy); 299324a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor OwningExprResult Super 299460b01cc44855d62979f76dc4cdffa4277f321049Douglas Gregor = Owned(new (Context) ObjCSuperExpr(FNameLoc, SuperTy)); 2995d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor return CodeCompleteObjCInstanceMessage(S, (Expr *)Super.get(), 2996d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor SelIdents, NumSelIdents); 299724a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor } 299824a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor 299924a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor // Okay, we're calling a factory method in our superclass. 300024a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor } 300124a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor } 300224a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor 300324a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor // If the given name refers to an interface type, retrieve the 300424a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor // corresponding declaration. 300524a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor if (!CDecl) 300660b01cc44855d62979f76dc4cdffa4277f321049Douglas Gregor if (TypeTy *Ty = getTypeName(*FName, FNameLoc, S, 0, false)) { 300724a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor QualType T = GetTypeFromParser(Ty, 0); 300824a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor if (!T.isNull()) 300924a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor if (const ObjCInterfaceType *Interface = T->getAs<ObjCInterfaceType>()) 301024a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor CDecl = Interface->getDecl(); 301124a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor } 301224a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor 301324a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor if (!CDecl && FName->isStr("super")) { 301424a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor // "super" may be the name of a variable, in which case we are 301524a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor // probably calling an instance method. 3016f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall CXXScopeSpec SS; 3017f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall UnqualifiedId id; 3018f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall id.setIdentifier(FName, FNameLoc); 3019f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall OwningExprResult Super = ActOnIdExpression(S, SS, id, false, false); 3020d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor return CodeCompleteObjCInstanceMessage(S, (Expr *)Super.get(), 3021d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor SelIdents, NumSelIdents); 302224a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor } 302324a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor 302436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add all of the factory methods in this Objective-C class, its protocols, 302536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // superclasses, categories, implementation, etc. 3026c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff ResultBuilder Results(*this); 3027c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff Results.EnterNewScope(); 30284ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(CDecl, false, MK_Any, SelIdents, NumSelIdents, CurContext, 30294ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Results); 3030c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff Results.ExitScope(); 303136ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 3032c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff // This also suppresses remaining diagnostics. 30333a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 3034c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff} 3035c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff 3036d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregorvoid Sema::CodeCompleteObjCInstanceMessage(Scope *S, ExprTy *Receiver, 3037d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor IdentifierInfo **SelIdents, 3038d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor unsigned NumSelIdents) { 3039c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff typedef CodeCompleteConsumer::Result Result; 3040c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff 3041c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff Expr *RecExpr = static_cast<Expr *>(Receiver); 3042c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff 304336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // If necessary, apply function/array conversion to the receiver. 304436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // C99 6.7.5.3p[7,8]. 304536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor DefaultFunctionArrayConversion(RecExpr); 304636ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor QualType ReceiverType = RecExpr->getType(); 3047c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff 304836ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor if (ReceiverType->isObjCIdType() || ReceiverType->isBlockPointerType()) { 304936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // FIXME: We're messaging 'id'. Do we actually want to look up every method 305036ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // in the universe? 305136ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor return; 305236ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor } 305336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 305436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Build the set of methods we can see. 305536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor ResultBuilder Results(*this); 305636ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor Results.EnterNewScope(); 305736ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 3058f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // Handle messages to Class. This really isn't a message to an instance 3059f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // method, so we treat it the same way we would treat a message send to a 3060f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // class method. 3061f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor if (ReceiverType->isObjCClassType() || 3062f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor ReceiverType->isObjCQualifiedClassType()) { 3063f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) { 3064f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor if (ObjCInterfaceDecl *ClassDecl = CurMethod->getClassInterface()) 30654ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(ClassDecl, false, MK_Any, SelIdents, NumSelIdents, 30664ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor CurContext, Results); 3067f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor } 3068f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor } 3069f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // Handle messages to a qualified ID ("id<foo>"). 3070f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor else if (const ObjCObjectPointerType *QualID 3071f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor = ReceiverType->getAsObjCQualifiedIdType()) { 3072f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // Search protocols for instance methods. 3073f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor for (ObjCObjectPointerType::qual_iterator I = QualID->qual_begin(), 3074f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor E = QualID->qual_end(); 3075f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor I != E; ++I) 30764ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(*I, true, MK_Any, SelIdents, NumSelIdents, CurContext, 30774ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Results); 3078f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor } 3079f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // Handle messages to a pointer to interface type. 3080f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor else if (const ObjCObjectPointerType *IFacePtr 3081f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor = ReceiverType->getAsObjCInterfacePointerType()) { 3082f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // Search the class, its superclasses, etc., for instance methods. 30834ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(IFacePtr->getInterfaceDecl(), true, MK_Any, SelIdents, 30844ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor NumSelIdents, CurContext, Results); 3085f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor 3086f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // Search protocols for instance methods. 3087f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor for (ObjCObjectPointerType::qual_iterator I = IFacePtr->qual_begin(), 3088f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor E = IFacePtr->qual_end(); 3089f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor I != E; ++I) 30904ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(*I, true, MK_Any, SelIdents, NumSelIdents, CurContext, 30914ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Results); 3092f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor } 309336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 3094f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor Results.ExitScope(); 30953a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 3096c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff} 309755385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor 309855385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor/// \brief Add all of the protocol declarations that we find in the given 309955385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor/// (translation unit) context. 310055385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregorstatic void AddProtocolResults(DeclContext *Ctx, DeclContext *CurContext, 3101083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor bool OnlyForwardDeclarations, 310255385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor ResultBuilder &Results) { 310355385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor typedef CodeCompleteConsumer::Result Result; 310455385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor 310555385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor for (DeclContext::decl_iterator D = Ctx->decls_begin(), 310655385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor DEnd = Ctx->decls_end(); 310755385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor D != DEnd; ++D) { 310855385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor // Record any protocols we find. 310955385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor if (ObjCProtocolDecl *Proto = dyn_cast<ObjCProtocolDecl>(*D)) 3110083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor if (!OnlyForwardDeclarations || Proto->isForwardDecl()) 3111083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor Results.MaybeAddResult(Result(Proto, 0), CurContext); 311255385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor 311355385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor // Record any forward-declared protocols we find. 311455385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor if (ObjCForwardProtocolDecl *Forward 311555385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor = dyn_cast<ObjCForwardProtocolDecl>(*D)) { 311655385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor for (ObjCForwardProtocolDecl::protocol_iterator 311755385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor P = Forward->protocol_begin(), 311855385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor PEnd = Forward->protocol_end(); 311955385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor P != PEnd; ++P) 3120083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor if (!OnlyForwardDeclarations || (*P)->isForwardDecl()) 3121083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor Results.MaybeAddResult(Result(*P, 0), CurContext); 312255385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor } 312355385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor } 312455385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor} 312555385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor 312655385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregorvoid Sema::CodeCompleteObjCProtocolReferences(IdentifierLocPair *Protocols, 312755385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor unsigned NumProtocols) { 312855385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor ResultBuilder Results(*this); 312955385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor Results.EnterNewScope(); 313055385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor 313155385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor // Tell the result set to ignore all of the protocols we have 313255385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor // already seen. 313355385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor for (unsigned I = 0; I != NumProtocols; ++I) 313455385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor if (ObjCProtocolDecl *Protocol = LookupProtocol(Protocols[I].first)) 313555385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor Results.Ignore(Protocol); 313655385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor 313755385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor // Add all protocols. 3138083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor AddProtocolResults(Context.getTranslationUnitDecl(), CurContext, false, 3139083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor Results); 3140083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor 3141083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor Results.ExitScope(); 3142083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 3143083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor} 3144083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor 3145083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregorvoid Sema::CodeCompleteObjCProtocolDecl(Scope *) { 3146083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor ResultBuilder Results(*this); 3147083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor Results.EnterNewScope(); 3148083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor 3149083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor // Add all protocols. 3150083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor AddProtocolResults(Context.getTranslationUnitDecl(), CurContext, true, 3151083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor Results); 315255385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor 315355385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor Results.ExitScope(); 315455385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 315555385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor} 31563b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 31573b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor/// \brief Add all of the Objective-C interface declarations that we find in 31583b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor/// the given (translation unit) context. 31593b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregorstatic void AddInterfaceResults(DeclContext *Ctx, DeclContext *CurContext, 31603b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor bool OnlyForwardDeclarations, 31613b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor bool OnlyUnimplemented, 31623b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor ResultBuilder &Results) { 31633b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor typedef CodeCompleteConsumer::Result Result; 31643b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 31653b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor for (DeclContext::decl_iterator D = Ctx->decls_begin(), 31663b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor DEnd = Ctx->decls_end(); 31673b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor D != DEnd; ++D) { 31683b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor // Record any interfaces we find. 31693b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor if (ObjCInterfaceDecl *Class = dyn_cast<ObjCInterfaceDecl>(*D)) 31703b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor if ((!OnlyForwardDeclarations || Class->isForwardDecl()) && 31713b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor (!OnlyUnimplemented || !Class->getImplementation())) 31723b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.MaybeAddResult(Result(Class, 0), CurContext); 31733b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 31743b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor // Record any forward-declared interfaces we find. 31753b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor if (ObjCClassDecl *Forward = dyn_cast<ObjCClassDecl>(*D)) { 31763b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor for (ObjCClassDecl::iterator C = Forward->begin(), CEnd = Forward->end(); 31773b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor C != CEnd; ++C) 31783b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor if ((!OnlyForwardDeclarations || C->getInterface()->isForwardDecl()) && 31793b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor (!OnlyUnimplemented || !C->getInterface()->getImplementation())) 31803b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.MaybeAddResult(Result(C->getInterface(), 0), CurContext); 31813b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor } 31823b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor } 31833b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor} 31843b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 31853b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregorvoid Sema::CodeCompleteObjCInterfaceDecl(Scope *S) { 31863b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor ResultBuilder Results(*this); 31873b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.EnterNewScope(); 31883b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 31893b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor // Add all classes. 31903b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, true, 31913b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor false, Results); 31923b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 31933b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.ExitScope(); 31943b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 31953b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor} 31963b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 31973b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregorvoid Sema::CodeCompleteObjCSuperclass(Scope *S, IdentifierInfo *ClassName) { 31983b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor ResultBuilder Results(*this); 31993b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.EnterNewScope(); 32003b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 32013b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor // Make sure that we ignore the class we're currently defining. 32023b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor NamedDecl *CurClass 32033b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor = LookupSingleName(TUScope, ClassName, LookupOrdinaryName); 320433ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor if (CurClass && isa<ObjCInterfaceDecl>(CurClass)) 32053b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.Ignore(CurClass); 32063b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 32073b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor // Add all classes. 32083b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false, 32093b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor false, Results); 32103b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 32113b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.ExitScope(); 32123b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 32133b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor} 32143b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 32153b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregorvoid Sema::CodeCompleteObjCImplementationDecl(Scope *S) { 32163b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor ResultBuilder Results(*this); 32173b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.EnterNewScope(); 32183b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 32193b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor // Add all unimplemented classes. 32203b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false, 32213b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor true, Results); 32223b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 32233b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.ExitScope(); 32243b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 32253b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor} 322633ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 322733ced0b8550f3e7169f326944731ee02e9338659Douglas Gregorvoid Sema::CodeCompleteObjCInterfaceCategory(Scope *S, 322833ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor IdentifierInfo *ClassName) { 322933ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor typedef CodeCompleteConsumer::Result Result; 323033ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 323133ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor ResultBuilder Results(*this); 323233ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 323333ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // Ignore any categories we find that have already been implemented by this 323433ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // interface. 323533ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor llvm::SmallPtrSet<IdentifierInfo *, 16> CategoryNames; 323633ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor NamedDecl *CurClass 323733ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor = LookupSingleName(TUScope, ClassName, LookupOrdinaryName); 323833ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor if (ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurClass)) 323933ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor for (ObjCCategoryDecl *Category = Class->getCategoryList(); Category; 324033ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Category = Category->getNextClassCategory()) 324133ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor CategoryNames.insert(Category->getIdentifier()); 324233ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 324333ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // Add all of the categories we know about. 324433ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Results.EnterNewScope(); 324533ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor TranslationUnitDecl *TU = Context.getTranslationUnitDecl(); 324633ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor for (DeclContext::decl_iterator D = TU->decls_begin(), 324733ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor DEnd = TU->decls_end(); 324833ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor D != DEnd; ++D) 324933ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(*D)) 325033ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor if (CategoryNames.insert(Category->getIdentifier())) 325133ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Results.MaybeAddResult(Result(Category, 0), CurContext); 325233ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Results.ExitScope(); 325333ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 325433ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 325533ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor} 325633ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 325733ced0b8550f3e7169f326944731ee02e9338659Douglas Gregorvoid Sema::CodeCompleteObjCImplementationCategory(Scope *S, 325833ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor IdentifierInfo *ClassName) { 325933ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor typedef CodeCompleteConsumer::Result Result; 326033ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 326133ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // Find the corresponding interface. If we couldn't find the interface, the 326233ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // program itself is ill-formed. However, we'll try to be helpful still by 326333ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // providing the list of all of the categories we know about. 326433ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor NamedDecl *CurClass 326533ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor = LookupSingleName(TUScope, ClassName, LookupOrdinaryName); 326633ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurClass); 326733ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor if (!Class) 326833ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor return CodeCompleteObjCInterfaceCategory(S, ClassName); 326933ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 327033ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor ResultBuilder Results(*this); 327133ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 327233ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // Add all of the categories that have have corresponding interface 327333ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // declarations in this class and any of its superclasses, except for 327433ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // already-implemented categories in the class itself. 327533ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor llvm::SmallPtrSet<IdentifierInfo *, 16> CategoryNames; 327633ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Results.EnterNewScope(); 327733ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor bool IgnoreImplemented = true; 327833ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor while (Class) { 327933ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor for (ObjCCategoryDecl *Category = Class->getCategoryList(); Category; 328033ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Category = Category->getNextClassCategory()) 328133ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor if ((!IgnoreImplemented || !Category->getImplementation()) && 328233ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor CategoryNames.insert(Category->getIdentifier())) 328333ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Results.MaybeAddResult(Result(Category, 0), CurContext); 328433ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 328533ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Class = Class->getSuperClass(); 328633ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor IgnoreImplemented = false; 328733ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor } 328833ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Results.ExitScope(); 328933ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 329033ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 329133ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor} 3292322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 3293424b2a546dbd09cf70d43087771c7fff851ca158Douglas Gregorvoid Sema::CodeCompleteObjCPropertyDefinition(Scope *S, DeclPtrTy ObjCImpDecl) { 3294322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor typedef CodeCompleteConsumer::Result Result; 3295322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor ResultBuilder Results(*this); 3296322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 3297322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Figure out where this @synthesize lives. 3298322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor ObjCContainerDecl *Container 3299322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor = dyn_cast_or_null<ObjCContainerDecl>(ObjCImpDecl.getAs<Decl>()); 3300322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor if (!Container || 3301322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor (!isa<ObjCImplementationDecl>(Container) && 3302322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor !isa<ObjCCategoryImplDecl>(Container))) 3303322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor return; 3304322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 3305322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Ignore any properties that have already been implemented. 3306322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor for (DeclContext::decl_iterator D = Container->decls_begin(), 3307322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor DEnd = Container->decls_end(); 3308322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor D != DEnd; ++D) 3309322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor if (ObjCPropertyImplDecl *PropertyImpl = dyn_cast<ObjCPropertyImplDecl>(*D)) 3310322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Results.Ignore(PropertyImpl->getPropertyDecl()); 3311322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 3312322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Add any properties that we find. 3313322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Results.EnterNewScope(); 3314322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor if (ObjCImplementationDecl *ClassImpl 3315322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor = dyn_cast<ObjCImplementationDecl>(Container)) 3316322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor AddObjCProperties(ClassImpl->getClassInterface(), false, CurContext, 3317322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Results); 3318322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor else 3319322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor AddObjCProperties(cast<ObjCCategoryImplDecl>(Container)->getCategoryDecl(), 3320322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor false, CurContext, Results); 3321322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Results.ExitScope(); 3322322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 3323322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 3324322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor} 3325322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 3326322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregorvoid Sema::CodeCompleteObjCPropertySynthesizeIvar(Scope *S, 3327322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor IdentifierInfo *PropertyName, 3328322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor DeclPtrTy ObjCImpDecl) { 3329322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor typedef CodeCompleteConsumer::Result Result; 3330322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor ResultBuilder Results(*this); 3331322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 3332322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Figure out where this @synthesize lives. 3333322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor ObjCContainerDecl *Container 3334322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor = dyn_cast_or_null<ObjCContainerDecl>(ObjCImpDecl.getAs<Decl>()); 3335322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor if (!Container || 3336322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor (!isa<ObjCImplementationDecl>(Container) && 3337322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor !isa<ObjCCategoryImplDecl>(Container))) 3338322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor return; 3339322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 3340322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Figure out which interface we're looking into. 3341322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor ObjCInterfaceDecl *Class = 0; 3342322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor if (ObjCImplementationDecl *ClassImpl 3343322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor = dyn_cast<ObjCImplementationDecl>(Container)) 3344322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Class = ClassImpl->getClassInterface(); 3345322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor else 3346322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Class = cast<ObjCCategoryImplDecl>(Container)->getCategoryDecl() 3347322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor ->getClassInterface(); 3348322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 3349322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Add all of the instance variables in this class and its superclasses. 3350322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Results.EnterNewScope(); 3351322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor for(; Class; Class = Class->getSuperClass()) { 3352322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // FIXME: We could screen the type of each ivar for compatibility with 3353322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // the property, but is that being too paternal? 3354322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor for (ObjCInterfaceDecl::ivar_iterator IVar = Class->ivar_begin(), 3355322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor IVarEnd = Class->ivar_end(); 3356322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor IVar != IVarEnd; ++IVar) 3357322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Results.MaybeAddResult(Result(*IVar, 0), CurContext); 3358322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor } 3359322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Results.ExitScope(); 3360322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 3361322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor HandleCodeCompleteResults(this, CodeCompleter, Results.data(),Results.size()); 3362322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor} 3363