SemaCodeComplete.cpp revision 87c08a5d6b9e1e44ae6f554df40139d3a6f60b33
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//===----------------------------------------------------------------------===// 13e737f5041a36d0befb39ffeed8d50ba15916d3daDouglas Gregor#include "clang/Sema/Sema.h" 14e737f5041a36d0befb39ffeed8d50ba15916d3daDouglas Gregor#include "clang/Sema/Lookup.h" 1581b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor#include "clang/Sema/CodeCompleteConsumer.h" 16719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor#include "clang/Sema/ExternalSemaSource.h" 17b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor#include "clang/AST/ExprCXX.h" 1824a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor#include "clang/AST/ExprObjC.h" 193f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor#include "clang/Lex/MacroInfo.h" 203f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor#include "clang/Lex/Preprocessor.h" 2186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor#include "llvm/ADT/SmallPtrSet.h" 226a6840326e9b4ac8e81a5a212165f33743847ab8Douglas Gregor#include "llvm/ADT/StringExtras.h" 2322f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor#include "llvm/ADT/StringSwitch.h" 2486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor#include <list> 2586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor#include <map> 2686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor#include <vector> 2781b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor 2881b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregorusing namespace clang; 2981b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor 3086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregornamespace { 3186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \brief A container of code-completion results. 3286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor class ResultBuilder { 3386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor public: 3486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \brief The type of a name-lookup filter, which can be provided to the 3586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// name-lookup routines to specify which declarations should be included in 3686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// the result set (when it returns true) and which declarations should be 3786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// filtered out (returns false). 3886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor typedef bool (ResultBuilder::*LookupFilter)(NamedDecl *) const; 3986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 4086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor typedef CodeCompleteConsumer::Result Result; 4186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 4286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor private: 4386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \brief The actual results we have found. 4486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor std::vector<Result> Results; 4586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 4686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \brief A record of all of the declarations we have found and placed 4786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// into the result set, used to ensure that no declaration ever gets into 4886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// the result set twice. 4986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor llvm::SmallPtrSet<Decl*, 16> AllDeclsFound; 5086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 51fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor typedef std::pair<NamedDecl *, unsigned> DeclIndexPair; 52fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 53fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor /// \brief An entry in the shadow map, which is optimized to store 54fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor /// a single (declaration, index) mapping (the common case) but 55fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor /// can also store a list of (declaration, index) mappings. 56fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor class ShadowMapEntry { 57fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor typedef llvm::SmallVector<DeclIndexPair, 4> DeclIndexPairVector; 58fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 59fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor /// \brief Contains either the solitary NamedDecl * or a vector 60fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor /// of (declaration, index) pairs. 61fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor llvm::PointerUnion<NamedDecl *, DeclIndexPairVector*> DeclOrVector; 62fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 63fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor /// \brief When the entry contains a single declaration, this is 64fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor /// the index associated with that entry. 65fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor unsigned SingleDeclIndex; 66fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 67fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor public: 68fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ShadowMapEntry() : DeclOrVector(), SingleDeclIndex(0) { } 69fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 70fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor void Add(NamedDecl *ND, unsigned Index) { 71fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (DeclOrVector.isNull()) { 72fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor // 0 - > 1 elements: just set the single element information. 73fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor DeclOrVector = ND; 74fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor SingleDeclIndex = Index; 75fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return; 76fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 77fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 78fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (NamedDecl *PrevND = DeclOrVector.dyn_cast<NamedDecl *>()) { 79fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor // 1 -> 2 elements: create the vector of results and push in the 80fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor // existing declaration. 81fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor DeclIndexPairVector *Vec = new DeclIndexPairVector; 82fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor Vec->push_back(DeclIndexPair(PrevND, SingleDeclIndex)); 83fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor DeclOrVector = Vec; 84fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 85fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 86fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor // Add the new element to the end of the vector. 87fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor DeclOrVector.get<DeclIndexPairVector*>()->push_back( 88fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor DeclIndexPair(ND, Index)); 89fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 90fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 91fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor void Destroy() { 92fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (DeclIndexPairVector *Vec 93fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor = DeclOrVector.dyn_cast<DeclIndexPairVector *>()) { 94fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor delete Vec; 95fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor DeclOrVector = ((NamedDecl *)0); 96fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 97fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 98fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 99fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor // Iteration. 100fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor class iterator; 101fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor iterator begin() const; 102fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor iterator end() const; 103fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor }; 104fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 10586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \brief A mapping from declaration names to the declarations that have 10686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// this name within a particular scope and their index within the list of 10786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// results. 108fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor typedef llvm::DenseMap<DeclarationName, ShadowMapEntry> ShadowMap; 10986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 11086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \brief The semantic analysis object for which results are being 11186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// produced. 11286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Sema &SemaRef; 11386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 11486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \brief If non-NULL, a filter function used to remove any code-completion 11586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// results that are not desirable. 11686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor LookupFilter Filter; 11745bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor 11845bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor /// \brief Whether we should allow declarations as 11945bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor /// nested-name-specifiers that would otherwise be filtered out. 12045bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor bool AllowNestedNameSpecifiers; 12145bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor 1225ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor /// \brief If set, the type that we would prefer our resulting value 1235ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor /// declarations to have. 1245ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor /// 1255ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor /// Closely matching the preferred type gives a boost to a result's 1265ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor /// priority. 1275ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor CanQualType PreferredType; 1285ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 12986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \brief A list of shadow maps, which is used to model name hiding at 13086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// different levels of, e.g., the inheritance hierarchy. 13186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor std::list<ShadowMap> ShadowMaps; 13286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 1331f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor void AdjustResultPriorityForPreferredType(Result &R); 1341f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 13586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor public: 13686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor explicit ResultBuilder(Sema &SemaRef, LookupFilter Filter = 0) 13745bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor : SemaRef(SemaRef), Filter(Filter), AllowNestedNameSpecifiers(false) { } 13886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 139d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor /// \brief Whether we should include code patterns in the completion 140d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor /// results. 141d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor bool includeCodePatterns() const { 142d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor return SemaRef.CodeCompleter && 143d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor SemaRef.CodeCompleter->includeCodePatterns(); 144d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor } 145d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor 14686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \brief Set the filter used for code-completion results. 14786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor void setFilter(LookupFilter Filter) { 14886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor this->Filter = Filter; 14986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 15086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 15186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor typedef std::vector<Result>::iterator iterator; 15286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor iterator begin() { return Results.begin(); } 15386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor iterator end() { return Results.end(); } 15486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 15586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Result *data() { return Results.empty()? 0 : &Results.front(); } 15686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor unsigned size() const { return Results.size(); } 15786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool empty() const { return Results.empty(); } 15886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 1595ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor /// \brief Specify the preferred type. 1605ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor void setPreferredType(QualType T) { 1615ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor PreferredType = SemaRef.Context.getCanonicalType(T); 1625ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor } 1635ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 16445bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor /// \brief Specify whether nested-name-specifiers are allowed. 16545bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor void allowNestedNameSpecifiers(bool Allow = true) { 16645bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor AllowNestedNameSpecifiers = Allow; 16745bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor } 16845bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor 169e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor /// \brief Determine whether the given declaration is at all interesting 170e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor /// as a code-completion result. 17145bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor /// 17245bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor /// \param ND the declaration that we are inspecting. 17345bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor /// 17445bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor /// \param AsNestedNameSpecifier will be set true if this declaration is 17545bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor /// only interesting when it is a nested-name-specifier. 17645bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor bool isInterestingDecl(NamedDecl *ND, bool &AsNestedNameSpecifier) const; 1776660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor 1786660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor /// \brief Check whether the result is hidden by the Hiding declaration. 1796660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor /// 1806660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor /// \returns true if the result is hidden and cannot be found, false if 1816660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor /// the hidden result could still be found. When false, \p R may be 1826660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor /// modified to describe how the result can be found (e.g., via extra 1836660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor /// qualification). 1846660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor bool CheckHiddenResult(Result &R, DeclContext *CurContext, 1856660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor NamedDecl *Hiding); 1866660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor 18786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \brief Add a new result to this result set (if it isn't already in one 18886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// of the shadow maps), or replace an existing result (for, e.g., a 18986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// redeclaration). 190456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor /// 1911ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// \param CurContext the result to add (if it is unique). 192456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor /// 193456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor /// \param R the context in which this result will be named. 194456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor void MaybeAddResult(Result R, DeclContext *CurContext = 0); 19586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 1961ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// \brief Add a new result to this result set, where we already know 1971ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// the hiding declation (if any). 1981ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// 1991ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// \param R the result to add (if it is unique). 2001ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// 2011ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// \param CurContext the context in which this result will be named. 2021ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// 2031ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// \param Hiding the declaration that hides the result. 2040cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor /// 2050cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor /// \param InBaseClass whether the result was found in a base 2060cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor /// class of the searched context. 2070cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor void AddResult(Result R, DeclContext *CurContext, NamedDecl *Hiding, 2080cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor bool InBaseClass); 2091ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 210a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor /// \brief Add a new non-declaration result to this result set. 211a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor void AddResult(Result R); 212a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor 21386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \brief Enter into a new scope. 21486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor void EnterNewScope(); 21586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 21686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \brief Exit from the current scope. 21786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor void ExitScope(); 21886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 21955385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor /// \brief Ignore this declaration, if it is seen again. 22055385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor void Ignore(Decl *D) { AllDeclsFound.insert(D->getCanonicalDecl()); } 22155385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor 22286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// \name Name lookup predicates 22386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// 22486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// These predicates can be passed to the name lookup functions to filter the 22586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// results of name lookup. All of the predicates have the same type, so that 22686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /// 22786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor //@{ 228791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor bool IsOrdinaryName(NamedDecl *ND) const; 2294710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor bool IsOrdinaryNonTypeName(NamedDecl *ND) const; 230f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor bool IsIntegralConstantValue(NamedDecl *ND) const; 23101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor bool IsOrdinaryNonValueName(NamedDecl *ND) const; 23286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool IsNestedNameSpecifier(NamedDecl *ND) const; 23386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool IsEnum(NamedDecl *ND) const; 23486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool IsClassOrStruct(NamedDecl *ND) const; 23586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool IsUnion(NamedDecl *ND) const; 23686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool IsNamespace(NamedDecl *ND) const; 23786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool IsNamespaceOrAlias(NamedDecl *ND) const; 23886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool IsType(NamedDecl *ND) const; 239eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor bool IsMember(NamedDecl *ND) const; 24080f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor bool IsObjCIvar(NamedDecl *ND) const; 2418e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor bool IsObjCMessageReceiver(NamedDecl *ND) const; 24286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor //@} 24386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor }; 24486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 24586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 246fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregorclass ResultBuilder::ShadowMapEntry::iterator { 247fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor llvm::PointerUnion<NamedDecl*, const DeclIndexPair*> DeclOrIterator; 248fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor unsigned SingleDeclIndex; 249fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 250fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregorpublic: 251fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor typedef DeclIndexPair value_type; 252fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor typedef value_type reference; 253fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor typedef std::ptrdiff_t difference_type; 254fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor typedef std::input_iterator_tag iterator_category; 255fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 256fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor class pointer { 257fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor DeclIndexPair Value; 258fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 259fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor public: 260fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor pointer(const DeclIndexPair &Value) : Value(Value) { } 261fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 262fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor const DeclIndexPair *operator->() const { 263fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return &Value; 264fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 265fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor }; 266fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 267fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor iterator() : DeclOrIterator((NamedDecl *)0), SingleDeclIndex(0) { } 268fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 269fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor iterator(NamedDecl *SingleDecl, unsigned Index) 270fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor : DeclOrIterator(SingleDecl), SingleDeclIndex(Index) { } 271fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 272fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor iterator(const DeclIndexPair *Iterator) 273fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor : DeclOrIterator(Iterator), SingleDeclIndex(0) { } 274fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 275fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor iterator &operator++() { 276fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (DeclOrIterator.is<NamedDecl *>()) { 277fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor DeclOrIterator = (NamedDecl *)0; 278fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor SingleDeclIndex = 0; 279fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return *this; 280fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 281fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 282fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor const DeclIndexPair *I = DeclOrIterator.get<const DeclIndexPair*>(); 283fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ++I; 284fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor DeclOrIterator = I; 285fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return *this; 286fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 287fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 288fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor iterator operator++(int) { 289fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor iterator tmp(*this); 290fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ++(*this); 291fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return tmp; 292fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 293fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 294fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor reference operator*() const { 295fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (NamedDecl *ND = DeclOrIterator.dyn_cast<NamedDecl *>()) 296fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return reference(ND, SingleDeclIndex); 297fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 298d490f953e812a9bb1729637cc70a6db7d997ced0Douglas Gregor return *DeclOrIterator.get<const DeclIndexPair*>(); 299fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 300fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 301fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor pointer operator->() const { 302fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return pointer(**this); 303fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 304fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 305fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor friend bool operator==(const iterator &X, const iterator &Y) { 306d490f953e812a9bb1729637cc70a6db7d997ced0Douglas Gregor return X.DeclOrIterator.getOpaqueValue() 307d490f953e812a9bb1729637cc70a6db7d997ced0Douglas Gregor == Y.DeclOrIterator.getOpaqueValue() && 308fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor X.SingleDeclIndex == Y.SingleDeclIndex; 309fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 310fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 311fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor friend bool operator!=(const iterator &X, const iterator &Y) { 312d490f953e812a9bb1729637cc70a6db7d997ced0Douglas Gregor return !(X == Y); 313fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 314fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor}; 315fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 316fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas GregorResultBuilder::ShadowMapEntry::iterator 317fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas GregorResultBuilder::ShadowMapEntry::begin() const { 318fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (DeclOrVector.isNull()) 319fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return iterator(); 320fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 321fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (NamedDecl *ND = DeclOrVector.dyn_cast<NamedDecl *>()) 322fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return iterator(ND, SingleDeclIndex); 323fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 324fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return iterator(DeclOrVector.get<DeclIndexPairVector *>()->begin()); 325fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor} 326fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 327fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas GregorResultBuilder::ShadowMapEntry::iterator 328fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas GregorResultBuilder::ShadowMapEntry::end() const { 329fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (DeclOrVector.is<NamedDecl *>() || DeclOrVector.isNull()) 330fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return iterator(); 331fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 332fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return iterator(DeclOrVector.get<DeclIndexPairVector *>()->end()); 333fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor} 334fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 335456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// \brief Compute the qualification required to get from the current context 336456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// (\p CurContext) to the target context (\p TargetContext). 337456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// 338456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// \param Context the AST context in which the qualification will be used. 339456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// 340456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// \param CurContext the context where an entity is being named, which is 341456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// typically based on the current scope. 342456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// 343456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// \param TargetContext the context in which the named entity actually 344456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// resides. 345456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// 346456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// \returns a nested name specifier that refers into the target context, or 347456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// NULL if no qualification is needed. 348456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregorstatic NestedNameSpecifier * 349456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas GregorgetRequiredQualification(ASTContext &Context, 350456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor DeclContext *CurContext, 351456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor DeclContext *TargetContext) { 352456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor llvm::SmallVector<DeclContext *, 4> TargetParents; 353456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor 354456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor for (DeclContext *CommonAncestor = TargetContext; 355456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor CommonAncestor && !CommonAncestor->Encloses(CurContext); 356456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor CommonAncestor = CommonAncestor->getLookupParent()) { 357456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor if (CommonAncestor->isTransparentContext() || 358456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor CommonAncestor->isFunctionOrMethod()) 359456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor continue; 360456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor 361456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor TargetParents.push_back(CommonAncestor); 362456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor } 363456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor 364456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor NestedNameSpecifier *Result = 0; 365456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor while (!TargetParents.empty()) { 366456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor DeclContext *Parent = TargetParents.back(); 367456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor TargetParents.pop_back(); 368456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor 369456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor if (NamespaceDecl *Namespace = dyn_cast<NamespaceDecl>(Parent)) 370456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor Result = NestedNameSpecifier::Create(Context, Result, Namespace); 371456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor else if (TagDecl *TD = dyn_cast<TagDecl>(Parent)) 372456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor Result = NestedNameSpecifier::Create(Context, Result, 373456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor false, 374456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor Context.getTypeDeclType(TD).getTypePtr()); 3750c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor } 376456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor return Result; 377456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor} 378456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor 37945bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregorbool ResultBuilder::isInterestingDecl(NamedDecl *ND, 38045bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor bool &AsNestedNameSpecifier) const { 38145bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor AsNestedNameSpecifier = false; 38245bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor 383e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor ND = ND->getUnderlyingDecl(); 384e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor unsigned IDNS = ND->getIdentifierNamespace(); 385f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor 386f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor // Skip unnamed entities. 387e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor if (!ND->getDeclName()) 388e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return false; 38986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 39086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Friend declarations and declarations introduced due to friends are never 39186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // added as results. 39292b7f70c924cbf4514e9e434cea7def51ab49860John McCall if (IDNS & (Decl::IDNS_OrdinaryFriend | Decl::IDNS_TagFriend)) 393e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return false; 394e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 3957628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor // Class template (partial) specializations are never added as results. 396e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor if (isa<ClassTemplateSpecializationDecl>(ND) || 397e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor isa<ClassTemplatePartialSpecializationDecl>(ND)) 398e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return false; 39986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 4007628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor // Using declarations themselves are never added as results. 401e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor if (isa<UsingDecl>(ND)) 402e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return false; 403e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 404e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor // Some declarations have reserved names that we don't want to ever show. 405e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor if (const IdentifierInfo *Id = ND->getIdentifier()) { 40686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // __va_list_tag is a freak of nature. Find it and skip it. 40786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (Id->isStr("__va_list_tag") || Id->isStr("__builtin_va_list")) 408e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return false; 40986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 410f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor // Filter out names reserved for the implementation (C99 7.1.3, 411797efb51ce0825eb4cce2864a5cea2b30e85f06cDouglas Gregor // C++ [lib.global.names]) if they come from a system header. 412e013d685c6689ac7ae103ee88acf573422d1ed6aDaniel Dunbar // 413e013d685c6689ac7ae103ee88acf573422d1ed6aDaniel Dunbar // FIXME: Add predicate for this. 414f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor if (Id->getLength() >= 2) { 415e013d685c6689ac7ae103ee88acf573422d1ed6aDaniel Dunbar const char *Name = Id->getNameStart(); 416f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor if (Name[0] == '_' && 417797efb51ce0825eb4cce2864a5cea2b30e85f06cDouglas Gregor (Name[1] == '_' || (Name[1] >= 'A' && Name[1] <= 'Z')) && 418797efb51ce0825eb4cce2864a5cea2b30e85f06cDouglas Gregor (ND->getLocation().isInvalid() || 419797efb51ce0825eb4cce2864a5cea2b30e85f06cDouglas Gregor SemaRef.SourceMgr.isInSystemHeader( 420797efb51ce0825eb4cce2864a5cea2b30e85f06cDouglas Gregor SemaRef.SourceMgr.getSpellingLoc(ND->getLocation())))) 421e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return false; 422f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor } 42386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 424e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 42586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // C++ constructors are never found by name lookup. 426e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor if (isa<CXXConstructorDecl>(ND)) 427e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return false; 42886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 42986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Filter out any unwanted results. 43045bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor if (Filter && !(this->*Filter)(ND)) { 43145bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor // Check whether it is interesting as a nested-name-specifier. 43245bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor if (AllowNestedNameSpecifiers && SemaRef.getLangOptions().CPlusPlus && 43345bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor IsNestedNameSpecifier(ND) && 43445bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor (Filter != &ResultBuilder::IsMember || 43545bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor (isa<CXXRecordDecl>(ND) && 43645bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor cast<CXXRecordDecl>(ND)->isInjectedClassName()))) { 43745bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor AsNestedNameSpecifier = true; 43845bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor return true; 43945bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor } 44045bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor 441e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return false; 44245bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor } 4430d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCall 4440d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCall if (Filter == &ResultBuilder::IsNestedNameSpecifier) 4450d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCall AsNestedNameSpecifier = true; 446e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 447e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor // ... then it must be interesting! 448e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return true; 449e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor} 450e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 4516660d845af8edb99098a08cf2539233a3be650b3Douglas Gregorbool ResultBuilder::CheckHiddenResult(Result &R, DeclContext *CurContext, 4526660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor NamedDecl *Hiding) { 4536660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor // In C, there is no way to refer to a hidden name. 4546660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor // FIXME: This isn't true; we can find a tag name hidden by an ordinary 4556660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor // name if we introduce the tag type. 4566660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor if (!SemaRef.getLangOptions().CPlusPlus) 4576660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor return true; 4586660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor 4596660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor DeclContext *HiddenCtx = R.Declaration->getDeclContext()->getLookupContext(); 4606660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor 4616660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor // There is no way to qualify a name declared in a function or method. 4626660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor if (HiddenCtx->isFunctionOrMethod()) 4636660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor return true; 4646660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor 4656660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor if (HiddenCtx == Hiding->getDeclContext()->getLookupContext()) 4666660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor return true; 4676660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor 4686660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor // We can refer to the result with the appropriate qualification. Do it. 4696660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor R.Hidden = true; 4706660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor R.QualifierIsInformative = false; 4716660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor 4726660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor if (!R.Qualifier) 4736660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor R.Qualifier = getRequiredQualification(SemaRef.Context, 4746660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor CurContext, 4756660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor R.Declaration->getDeclContext()); 4766660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor return false; 4776660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor} 4786660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor 4791f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregorenum SimplifiedTypeClass { 4801f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor STC_Arithmetic, 4811f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor STC_Array, 4821f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor STC_Block, 4831f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor STC_Function, 4841f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor STC_ObjectiveC, 4851f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor STC_Other, 4861f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor STC_Pointer, 4871f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor STC_Record, 4881f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor STC_Void 4891f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor}; 4901f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 4911f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor/// \brief A simplified classification of types used to determine whether two 4921f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor/// types are "similar enough" when adjusting priorities. 4931f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregorstatic SimplifiedTypeClass getSimplifiedTypeClass(CanQualType T) { 4941f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor switch (T->getTypeClass()) { 4951f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::Builtin: 4961f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor switch (cast<BuiltinType>(T)->getKind()) { 4971f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case BuiltinType::Void: 4981f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Void; 4991f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 5001f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case BuiltinType::NullPtr: 5011f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Pointer; 5021f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 5031f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case BuiltinType::Overload: 5041f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case BuiltinType::Dependent: 5051f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case BuiltinType::UndeducedAuto: 5061f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Other; 5071f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 5081f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case BuiltinType::ObjCId: 5091f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case BuiltinType::ObjCClass: 5101f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case BuiltinType::ObjCSel: 5111f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_ObjectiveC; 5121f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 5131f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor default: 5141f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Arithmetic; 5151f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor } 5161f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Other; 5171f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 5181f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::Complex: 5191f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Arithmetic; 5201f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 5211f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::Pointer: 5221f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Pointer; 5231f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 5241f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::BlockPointer: 5251f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Block; 5261f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 5271f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::LValueReference: 5281f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::RValueReference: 5291f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return getSimplifiedTypeClass(T->getAs<ReferenceType>()->getPointeeType()); 5301f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 5311f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::ConstantArray: 5321f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::IncompleteArray: 5331f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::VariableArray: 5341f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::DependentSizedArray: 5351f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Array; 5361f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 5371f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::DependentSizedExtVector: 5381f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::Vector: 5391f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::ExtVector: 5401f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Arithmetic; 5411f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 5421f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::FunctionProto: 5431f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::FunctionNoProto: 5441f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Function; 5451f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 5461f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::Record: 5471f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Record; 5481f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 5491f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::Enum: 5501f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Arithmetic; 5511f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 5521f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::ObjCObject: 5531f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::ObjCInterface: 5541f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::ObjCObjectPointer: 5551f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_ObjectiveC; 5561f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 5571f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor default: 5581f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Other; 5591f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor } 5601f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor} 5611f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 5621f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor/// \brief Get the type that a given expression will have if this declaration 5631f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor/// is used as an expression in its "typical" code-completion form. 5641f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregorstatic QualType getDeclUsageType(ASTContext &C, NamedDecl *ND) { 5651f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor ND = cast<NamedDecl>(ND->getUnderlyingDecl()); 5661f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 5671f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor if (TypeDecl *Type = dyn_cast<TypeDecl>(ND)) 5681f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return C.getTypeDeclType(Type); 5691f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor if (ObjCInterfaceDecl *Iface = dyn_cast<ObjCInterfaceDecl>(ND)) 5701f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return C.getObjCInterfaceType(Iface); 5711f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 5721f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor QualType T; 5731f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor if (FunctionDecl *Function = dyn_cast<FunctionDecl>(ND)) 5745291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor T = Function->getCallResultType(); 5751f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor else if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(ND)) 5765291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor T = Method->getSendResultType(); 5771f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor else if (FunctionTemplateDecl *FunTmpl = dyn_cast<FunctionTemplateDecl>(ND)) 5785291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor T = FunTmpl->getTemplatedDecl()->getCallResultType(); 5791f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor else if (EnumConstantDecl *Enumerator = dyn_cast<EnumConstantDecl>(ND)) 5801f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor T = C.getTypeDeclType(cast<EnumDecl>(Enumerator->getDeclContext())); 5811f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor else if (ObjCPropertyDecl *Property = dyn_cast<ObjCPropertyDecl>(ND)) 5821f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor T = Property->getType(); 5831f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor else if (ValueDecl *Value = dyn_cast<ValueDecl>(ND)) 5841f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor T = Value->getType(); 5851f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor else 5861f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return QualType(); 5871f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 5881f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return T.getNonReferenceType(); 5891f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor} 5901f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 5911f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregorvoid ResultBuilder::AdjustResultPriorityForPreferredType(Result &R) { 5921f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor QualType T = getDeclUsageType(SemaRef.Context, R.Declaration); 5931f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor if (T.isNull()) 5941f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return; 5951f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 5961f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor CanQualType TC = SemaRef.Context.getCanonicalType(T); 5971f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor // Check for exactly-matching types (modulo qualifiers). 5981f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor if (SemaRef.Context.hasSameUnqualifiedType(PreferredType, TC)) 5991f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor R.Priority /= CCF_ExactTypeMatch; 6001f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor // Check for nearly-matching types, based on classification of each. 6011f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor else if ((getSimplifiedTypeClass(PreferredType) 6021f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor == getSimplifiedTypeClass(TC)) && 6031f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor !(PreferredType->isEnumeralType() && TC->isEnumeralType())) 6041f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor R.Priority /= CCF_SimilarTypeMatch; 6051f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor} 6061f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 607e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregorvoid ResultBuilder::MaybeAddResult(Result R, DeclContext *CurContext) { 608e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor assert(!ShadowMaps.empty() && "Must enter into a results scope"); 609e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 610e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor if (R.Kind != Result::RK_Declaration) { 611e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor // For non-declaration results, just add the result. 612e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor Results.push_back(R); 613e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return; 614e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor } 615e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 616e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor // Look through using declarations. 617e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor if (UsingShadowDecl *Using = dyn_cast<UsingShadowDecl>(R.Declaration)) { 618e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor MaybeAddResult(Result(Using->getTargetDecl(), R.Qualifier), CurContext); 61986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return; 620e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor } 62186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 622e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor Decl *CanonDecl = R.Declaration->getCanonicalDecl(); 623e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor unsigned IDNS = CanonDecl->getIdentifierNamespace(); 624e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 62545bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor bool AsNestedNameSpecifier = false; 62645bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor if (!isInterestingDecl(R.Declaration, AsNestedNameSpecifier)) 627e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return; 628e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 62986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ShadowMap &SMap = ShadowMaps.back(); 630fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ShadowMapEntry::iterator I, IEnd; 631fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ShadowMap::iterator NamePos = SMap.find(R.Declaration->getDeclName()); 632fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (NamePos != SMap.end()) { 633fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor I = NamePos->second.begin(); 634fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor IEnd = NamePos->second.end(); 635fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 636fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 637fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor for (; I != IEnd; ++I) { 638fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor NamedDecl *ND = I->first; 639fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor unsigned Index = I->second; 64086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (ND->getCanonicalDecl() == CanonDecl) { 64186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // This is a redeclaration. Always pick the newer declaration. 64286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Results[Index].Declaration = R.Declaration; 64386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 64486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // We're done. 64586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return; 64686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 64786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 64886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 64986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // This is a new declaration in this scope. However, check whether this 65086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // declaration name is hidden by a similarly-named declaration in an outer 65186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // scope. 65286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor std::list<ShadowMap>::iterator SM, SMEnd = ShadowMaps.end(); 65386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor --SMEnd; 65486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor for (SM = ShadowMaps.begin(); SM != SMEnd; ++SM) { 655fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ShadowMapEntry::iterator I, IEnd; 656fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ShadowMap::iterator NamePos = SM->find(R.Declaration->getDeclName()); 657fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (NamePos != SM->end()) { 658fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor I = NamePos->second.begin(); 659fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor IEnd = NamePos->second.end(); 660fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 661fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor for (; I != IEnd; ++I) { 66286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // A tag declaration does not hide a non-tag declaration. 6630d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCall if (I->first->hasTagIdentifierNamespace() && 66486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor (IDNS & (Decl::IDNS_Member | Decl::IDNS_Ordinary | 66586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Decl::IDNS_ObjCProtocol))) 66686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor continue; 66786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 66886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Protocols are in distinct namespaces from everything else. 669fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (((I->first->getIdentifierNamespace() & Decl::IDNS_ObjCProtocol) 67086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor || (IDNS & Decl::IDNS_ObjCProtocol)) && 671fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor I->first->getIdentifierNamespace() != IDNS) 67286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor continue; 67386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 67486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // The newly-added result is hidden by an entry in the shadow map. 6756660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor if (CheckHiddenResult(R, CurContext, I->first)) 67686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return; 67786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 67886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor break; 67986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 68086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 68186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 68286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Make sure that any given declaration only shows up in the result set once. 68386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!AllDeclsFound.insert(CanonDecl)) 68486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return; 68586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 686eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor // If the filter is for nested-name-specifiers, then this result starts a 687eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor // nested-name-specifier. 68812e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor if (AsNestedNameSpecifier) { 689eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor R.StartsNestedNameSpecifier = true; 69012e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor R.Priority = CCP_NestedNameSpecifier; 6911f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor } else if (!PreferredType.isNull()) 6921f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor AdjustResultPriorityForPreferredType(R); 6931f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 6940563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor // If this result is supposed to have an informative qualifier, add one. 695eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor if (R.QualifierIsInformative && !R.Qualifier && 696eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor !R.StartsNestedNameSpecifier) { 6970563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor DeclContext *Ctx = R.Declaration->getDeclContext(); 6980563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor if (NamespaceDecl *Namespace = dyn_cast<NamespaceDecl>(Ctx)) 6990563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor R.Qualifier = NestedNameSpecifier::Create(SemaRef.Context, 0, Namespace); 7000563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor else if (TagDecl *Tag = dyn_cast<TagDecl>(Ctx)) 7010563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor R.Qualifier = NestedNameSpecifier::Create(SemaRef.Context, 0, false, 7020563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor SemaRef.Context.getTypeDeclType(Tag).getTypePtr()); 7030563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor else 7040563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor R.QualifierIsInformative = false; 7050563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor } 706eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor 70786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Insert this result into the set of results and into the current shadow 70886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // map. 709fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor SMap[R.Declaration->getDeclName()].Add(R.Declaration, Results.size()); 71086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Results.push_back(R); 71186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 71286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 7131ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregorvoid ResultBuilder::AddResult(Result R, DeclContext *CurContext, 7140cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor NamedDecl *Hiding, bool InBaseClass = false) { 715a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor if (R.Kind != Result::RK_Declaration) { 716a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor // For non-declaration results, just add the result. 717a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.push_back(R); 718a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor return; 719a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor } 720a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor 7211ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor // Look through using declarations. 7221ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor if (UsingShadowDecl *Using = dyn_cast<UsingShadowDecl>(R.Declaration)) { 7231ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor AddResult(Result(Using->getTargetDecl(), R.Qualifier), CurContext, Hiding); 7241ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor return; 7251ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor } 7261ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 72745bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor bool AsNestedNameSpecifier = false; 72845bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor if (!isInterestingDecl(R.Declaration, AsNestedNameSpecifier)) 7291ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor return; 7301ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 7311ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor if (Hiding && CheckHiddenResult(R, CurContext, Hiding)) 7321ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor return; 7331ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 7341ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor // Make sure that any given declaration only shows up in the result set once. 7351ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor if (!AllDeclsFound.insert(R.Declaration->getCanonicalDecl())) 7361ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor return; 7371ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 7381ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor // If the filter is for nested-name-specifiers, then this result starts a 7391ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor // nested-name-specifier. 74012e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor if (AsNestedNameSpecifier) { 7411ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor R.StartsNestedNameSpecifier = true; 74212e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor R.Priority = CCP_NestedNameSpecifier; 74312e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor } 7440cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor else if (Filter == &ResultBuilder::IsMember && !R.Qualifier && InBaseClass && 7450cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor isa<CXXRecordDecl>(R.Declaration->getDeclContext() 7460cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor ->getLookupContext())) 7470cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor R.QualifierIsInformative = true; 7480cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor 7491ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor // If this result is supposed to have an informative qualifier, add one. 7501ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor if (R.QualifierIsInformative && !R.Qualifier && 7511ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor !R.StartsNestedNameSpecifier) { 7521ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor DeclContext *Ctx = R.Declaration->getDeclContext(); 7531ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor if (NamespaceDecl *Namespace = dyn_cast<NamespaceDecl>(Ctx)) 7541ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor R.Qualifier = NestedNameSpecifier::Create(SemaRef.Context, 0, Namespace); 7551ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor else if (TagDecl *Tag = dyn_cast<TagDecl>(Ctx)) 7561ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor R.Qualifier = NestedNameSpecifier::Create(SemaRef.Context, 0, false, 75745bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor SemaRef.Context.getTypeDeclType(Tag).getTypePtr()); 7581ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor else 7591ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor R.QualifierIsInformative = false; 7601ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor } 7611ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 76212e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor // Adjust the priority if this result comes from a base class. 76312e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor if (InBaseClass) 76412e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor R.Priority += CCD_InBaseClass; 76512e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor 7661f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor if (!PreferredType.isNull()) 7671f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor AdjustResultPriorityForPreferredType(R); 7685ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 7691ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor // Insert this result into the set of results. 7701ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor Results.push_back(R); 7711ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor} 7721ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 773a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregorvoid ResultBuilder::AddResult(Result R) { 774a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor assert(R.Kind != Result::RK_Declaration && 775a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor "Declaration results need more context"); 776a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.push_back(R); 777a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor} 778a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor 77986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Enter into a new scope. 78086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorvoid ResultBuilder::EnterNewScope() { 78186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ShadowMaps.push_back(ShadowMap()); 78286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 78386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 78486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Exit from the current scope. 78586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorvoid ResultBuilder::ExitScope() { 786fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor for (ShadowMap::iterator E = ShadowMaps.back().begin(), 787fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor EEnd = ShadowMaps.back().end(); 788fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor E != EEnd; 789fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ++E) 790fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor E->second.Destroy(); 791fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 79286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ShadowMaps.pop_back(); 79386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 79486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 795791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor/// \brief Determines whether this given declaration will be found by 796791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor/// ordinary name lookup. 797791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregorbool ResultBuilder::IsOrdinaryName(NamedDecl *ND) const { 7984710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor ND = cast<NamedDecl>(ND->getUnderlyingDecl()); 7994710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor 800791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor unsigned IDNS = Decl::IDNS_Ordinary; 801791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus) 8029b30b267e77d1778e1e9b7c44b6852489c2c5096Douglas Gregor IDNS |= Decl::IDNS_Tag | Decl::IDNS_Namespace | Decl::IDNS_Member; 8031ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor else if (SemaRef.getLangOptions().ObjC1 && isa<ObjCIvarDecl>(ND)) 8041ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor return true; 8051ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 806791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor return ND->getIdentifierNamespace() & IDNS; 807791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor} 808791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor 80901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor/// \brief Determines whether this given declaration will be found by 8104710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor/// ordinary name lookup but is not a type name. 8114710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregorbool ResultBuilder::IsOrdinaryNonTypeName(NamedDecl *ND) const { 8124710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor ND = cast<NamedDecl>(ND->getUnderlyingDecl()); 8134710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor if (isa<TypeDecl>(ND) || isa<ObjCInterfaceDecl>(ND)) 8144710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor return false; 8154710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor 8164710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor unsigned IDNS = Decl::IDNS_Ordinary; 8174710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus) 8189b30b267e77d1778e1e9b7c44b6852489c2c5096Douglas Gregor IDNS |= Decl::IDNS_Tag | Decl::IDNS_Namespace | Decl::IDNS_Member; 8194710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor else if (SemaRef.getLangOptions().ObjC1 && isa<ObjCIvarDecl>(ND)) 8204710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor return true; 8214710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor 8224710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor return ND->getIdentifierNamespace() & IDNS; 8234710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor} 8244710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor 825f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregorbool ResultBuilder::IsIntegralConstantValue(NamedDecl *ND) const { 826f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor if (!IsOrdinaryNonTypeName(ND)) 827f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor return 0; 828f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor 829f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor if (ValueDecl *VD = dyn_cast<ValueDecl>(ND->getUnderlyingDecl())) 830f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor if (VD->getType()->isIntegralOrEnumerationType()) 831f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor return true; 832f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor 833f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor return false; 834f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor} 835f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor 8364710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor/// \brief Determines whether this given declaration will be found by 83701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor/// ordinary name lookup. 83801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregorbool ResultBuilder::IsOrdinaryNonValueName(NamedDecl *ND) const { 8394710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor ND = cast<NamedDecl>(ND->getUnderlyingDecl()); 8404710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor 84101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor unsigned IDNS = Decl::IDNS_Ordinary; 84201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus) 8430d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCall IDNS |= Decl::IDNS_Tag | Decl::IDNS_Namespace; 84401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 84501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor return (ND->getIdentifierNamespace() & IDNS) && 8464710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor !isa<ValueDecl>(ND) && !isa<FunctionTemplateDecl>(ND) && 8474710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor !isa<ObjCPropertyDecl>(ND); 84801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor} 84901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 85086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Determines whether the given declaration is suitable as the 85186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// start of a C++ nested-name-specifier, e.g., a class or namespace. 85286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsNestedNameSpecifier(NamedDecl *ND) const { 85386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Allow us to find class templates, too. 85486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (ClassTemplateDecl *ClassTemplate = dyn_cast<ClassTemplateDecl>(ND)) 85586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ND = ClassTemplate->getTemplatedDecl(); 85686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 85786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return SemaRef.isAcceptableNestedNameSpecifier(ND); 85886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 85986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 86086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Determines whether the given declaration is an enumeration. 86186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsEnum(NamedDecl *ND) const { 86286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return isa<EnumDecl>(ND); 86386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 86486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 86586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Determines whether the given declaration is a class or struct. 86686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsClassOrStruct(NamedDecl *ND) const { 86786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Allow us to find class templates, too. 86886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (ClassTemplateDecl *ClassTemplate = dyn_cast<ClassTemplateDecl>(ND)) 86986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ND = ClassTemplate->getTemplatedDecl(); 87086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 87186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (RecordDecl *RD = dyn_cast<RecordDecl>(ND)) 872465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara return RD->getTagKind() == TTK_Class || 873465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara RD->getTagKind() == TTK_Struct; 87486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 87586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return false; 87686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 87786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 87886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Determines whether the given declaration is a union. 87986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsUnion(NamedDecl *ND) const { 88086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Allow us to find class templates, too. 88186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (ClassTemplateDecl *ClassTemplate = dyn_cast<ClassTemplateDecl>(ND)) 88286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ND = ClassTemplate->getTemplatedDecl(); 88386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 88486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (RecordDecl *RD = dyn_cast<RecordDecl>(ND)) 885465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara return RD->getTagKind() == TTK_Union; 88686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 88786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return false; 88886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 88986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 89086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Determines whether the given declaration is a namespace. 89186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsNamespace(NamedDecl *ND) const { 89286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return isa<NamespaceDecl>(ND); 89386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 89486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 89586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Determines whether the given declaration is a namespace or 89686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// namespace alias. 89786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsNamespaceOrAlias(NamedDecl *ND) const { 89886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return isa<NamespaceDecl>(ND) || isa<NamespaceAliasDecl>(ND); 89986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 90086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 9017628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor/// \brief Determines whether the given declaration is a type. 90286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsType(NamedDecl *ND) const { 90386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return isa<TypeDecl>(ND); 90486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 90586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 9067628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor/// \brief Determines which members of a class should be visible via 9077628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor/// "." or "->". Only value declarations, nested name specifiers, and 9087628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor/// using declarations thereof should show up. 909eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregorbool ResultBuilder::IsMember(NamedDecl *ND) const { 9107628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor if (UsingShadowDecl *Using = dyn_cast<UsingShadowDecl>(ND)) 9117628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor ND = Using->getTargetDecl(); 9127628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor 913ce82196076cd15f5ecfa029fcda8b58dc0146cf1Douglas Gregor return isa<ValueDecl>(ND) || isa<FunctionTemplateDecl>(ND) || 914ce82196076cd15f5ecfa029fcda8b58dc0146cf1Douglas Gregor isa<ObjCPropertyDecl>(ND); 915eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor} 916eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor 9178e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregorstatic bool isObjCReceiverType(ASTContext &C, QualType T) { 9188e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor T = C.getCanonicalType(T); 9198e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor switch (T->getTypeClass()) { 9208e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor case Type::ObjCObject: 9218e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor case Type::ObjCInterface: 9228e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor case Type::ObjCObjectPointer: 9238e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor return true; 9248e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 9258e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor case Type::Builtin: 9268e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor switch (cast<BuiltinType>(T)->getKind()) { 9278e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor case BuiltinType::ObjCId: 9288e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor case BuiltinType::ObjCClass: 9298e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor case BuiltinType::ObjCSel: 9308e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor return true; 9318e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 9328e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor default: 9338e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor break; 9348e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor } 9358e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor return false; 9368e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 9378e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor default: 9388e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor break; 9398e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor } 9408e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 9418e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor if (!C.getLangOptions().CPlusPlus) 9428e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor return false; 9438e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 9448e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor // FIXME: We could perform more analysis here to determine whether a 9458e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor // particular class type has any conversions to Objective-C types. For now, 9468e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor // just accept all class types. 9478e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor return T->isDependentType() || T->isRecordType(); 9488e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor} 9498e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 9508e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregorbool ResultBuilder::IsObjCMessageReceiver(NamedDecl *ND) const { 9518e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor QualType T = getDeclUsageType(SemaRef.Context, ND); 9528e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor if (T.isNull()) 9538e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor return false; 9548e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 9558e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor T = SemaRef.Context.getBaseElementType(T); 9568e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor return isObjCReceiverType(SemaRef.Context, T); 9578e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor} 9588e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 9598e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 96080f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor/// \rief Determines whether the given declaration is an Objective-C 96180f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor/// instance variable. 96280f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregorbool ResultBuilder::IsObjCIvar(NamedDecl *ND) const { 96380f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor return isa<ObjCIvarDecl>(ND); 96480f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor} 96580f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor 9661ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregornamespace { 9671ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// \brief Visible declaration consumer that adds a code-completion result 9681ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// for each visible declaration. 9691ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor class CodeCompletionDeclConsumer : public VisibleDeclConsumer { 9701ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor ResultBuilder &Results; 9711ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor DeclContext *CurContext; 9721ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 9731ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor public: 9741ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor CodeCompletionDeclConsumer(ResultBuilder &Results, DeclContext *CurContext) 9751ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor : Results(Results), CurContext(CurContext) { } 9761ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 9770cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor virtual void FoundDecl(NamedDecl *ND, NamedDecl *Hiding, bool InBaseClass) { 9780cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor Results.AddResult(ND, CurContext, Hiding, InBaseClass); 9791ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor } 9801ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor }; 9811ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor} 9821ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 98386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Add type specifiers for the current language as keyword results. 984bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddTypeSpecifierResults(const LangOptions &LangOpts, 98586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ResultBuilder &Results) { 98686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor typedef CodeCompleteConsumer::Result Result; 98712e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("short", CCP_Type)); 98812e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("long", CCP_Type)); 98912e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("signed", CCP_Type)); 99012e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("unsigned", CCP_Type)); 99112e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("void", CCP_Type)); 99212e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("char", CCP_Type)); 99312e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("int", CCP_Type)); 99412e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("float", CCP_Type)); 99512e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("double", CCP_Type)); 99612e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("enum", CCP_Type)); 99712e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("struct", CCP_Type)); 99812e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("union", CCP_Type)); 99912e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("const", CCP_Type)); 100012e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("volatile", CCP_Type)); 100101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 100286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (LangOpts.C99) { 100386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // C99-specific 100412e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("_Complex", CCP_Type)); 100512e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("_Imaginary", CCP_Type)); 100612e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("_Bool", CCP_Type)); 100712e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("restrict", CCP_Type)); 100886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 100986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 101086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (LangOpts.CPlusPlus) { 101186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // C++-specific 101212e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("bool", CCP_Type)); 101312e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("class", CCP_Type)); 101412e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("wchar_t", CCP_Type)); 101586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 1016c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // typename qualified-id 1017c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor CodeCompletionString *Pattern = new CodeCompletionString; 1018c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddTypedTextChunk("typename"); 1019c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 1020c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("qualifier"); 1021c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddTextChunk("::"); 1022c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("name"); 1023c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Results.AddResult(Result(Pattern)); 1024d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor 102586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (LangOpts.CPlusPlus0x) { 102612e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("auto", CCP_Type)); 102712e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("char16_t", CCP_Type)); 102812e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("char32_t", CCP_Type)); 1029c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor 1030c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor CodeCompletionString *Pattern = new CodeCompletionString; 1031c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddTypedTextChunk("decltype"); 1032c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 1033c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("expression"); 1034c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 1035c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Results.AddResult(Result(Pattern)); 103686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 103786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 103886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 103986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // GNU extensions 104086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (LangOpts.GNUMode) { 104186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // FIXME: Enable when we actually support decimal floating point. 1042a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor // Results.AddResult(Result("_Decimal32")); 1043a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor // Results.AddResult(Result("_Decimal64")); 1044a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor // Results.AddResult(Result("_Decimal128")); 104501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1046c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor CodeCompletionString *Pattern = new CodeCompletionString; 1047c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddTypedTextChunk("typeof"); 1048c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 1049c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("expression"); 1050c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Results.AddResult(Result(Pattern)); 1051c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor 1052c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern = new CodeCompletionString; 1053c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddTypedTextChunk("typeof"); 1054c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 1055c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("type"); 1056c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 1057c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Results.AddResult(Result(Pattern)); 105801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 105901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor} 106001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1061e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregorstatic void AddStorageSpecifiers(Action::ParserCompletionContext CCC, 106201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor const LangOptions &LangOpts, 106301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor ResultBuilder &Results) { 106401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor typedef CodeCompleteConsumer::Result Result; 106501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Note: we don't suggest either "auto" or "register", because both 106601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // are pointless as storage specifiers. Elsewhere, we suggest "auto" 106701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // in C++0x as a type specifier. 1068a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("extern")); 1069a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("static")); 107001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor} 107101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1072e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregorstatic void AddFunctionSpecifiers(Action::ParserCompletionContext CCC, 107301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor const LangOptions &LangOpts, 107401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor ResultBuilder &Results) { 107501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor typedef CodeCompleteConsumer::Result Result; 107601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor switch (CCC) { 1077e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_Class: 1078e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_MemberTemplate: 107901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (LangOpts.CPlusPlus) { 1080a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("explicit")); 1081a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("friend")); 1082a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("mutable")); 1083a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("virtual")); 108401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 108501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Fall through 108601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1087e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_ObjCInterface: 1088e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_ObjCImplementation: 1089e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_Namespace: 1090e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_Template: 109101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (LangOpts.CPlusPlus || LangOpts.C99) 1092a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("inline")); 109301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 109401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1095e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_ObjCInstanceVariableList: 1096e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_Expression: 1097e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_Statement: 1098e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_ForInit: 1099e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_Condition: 1100e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_RecoveryInFunction: 110101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 110201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 110301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor} 110401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1105bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCExpressionResults(ResultBuilder &Results, bool NeedAt); 1106bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCStatementResults(ResultBuilder &Results, bool NeedAt); 1107bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCVisibilityResults(const LangOptions &LangOpts, 1108c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor ResultBuilder &Results, 1109c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor bool NeedAt); 1110bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCImplementationResults(const LangOptions &LangOpts, 1111b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor ResultBuilder &Results, 1112b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor bool NeedAt); 1113bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCInterfaceResults(const LangOptions &LangOpts, 1114b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor ResultBuilder &Results, 1115b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor bool NeedAt); 1116bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCTopLevelResults(ResultBuilder &Results, bool NeedAt); 1117b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 1118c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregorstatic void AddTypedefResult(ResultBuilder &Results) { 1119c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor CodeCompletionString *Pattern = new CodeCompletionString; 1120c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddTypedTextChunk("typedef"); 1121c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 1122c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("type"); 1123c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 1124c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("name"); 1125c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Results.AddResult(CodeCompleteConsumer::Result(Pattern)); 1126c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor} 1127c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor 1128e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregorstatic bool WantTypesInContext(Action::ParserCompletionContext CCC, 11294710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor const LangOptions &LangOpts) { 11304710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor if (LangOpts.CPlusPlus) 11314710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor return true; 11324710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor 11334710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor switch (CCC) { 1134e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_Namespace: 1135e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_Class: 1136e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_ObjCInstanceVariableList: 1137e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_Template: 1138e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_MemberTemplate: 1139e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_Statement: 1140e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_RecoveryInFunction: 11414710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor return true; 11424710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor 1143e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_ObjCInterface: 1144e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_ObjCImplementation: 1145e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_Expression: 1146e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_Condition: 11474710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor return false; 11484710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor 1149e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_ForInit: 11504710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor return LangOpts.ObjC1 || LangOpts.C99; 11514710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor } 11524710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor 11534710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor return false; 11544710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor} 11554710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor 115601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor/// \brief Add language constructs that show up for "ordinary" names. 1157e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregorstatic void AddOrdinaryNameResults(Action::ParserCompletionContext CCC, 115801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Scope *S, 115901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Sema &SemaRef, 116001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor ResultBuilder &Results) { 116101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor typedef CodeCompleteConsumer::Result Result; 116201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor switch (CCC) { 1163e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_Namespace: 1164c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor if (SemaRef.getLangOptions().CPlusPlus) { 1165c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor CodeCompletionString *Pattern = 0; 1166c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor 1167c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor if (Results.includeCodePatterns()) { 1168c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // namespace <identifier> { declarations } 1169c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor CodeCompletionString *Pattern = new CodeCompletionString; 1170c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddTypedTextChunk("namespace"); 1171c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 1172c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("identifier"); 1173c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftBrace); 1174c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("declarations"); 1175c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_VerticalSpace); 1176c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightBrace); 1177c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Results.AddResult(Result(Pattern)); 1178c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor } 1179c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor 118001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // namespace identifier = identifier ; 118101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 118201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("namespace"); 118301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 1184c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("name"); 118501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_Equal); 1186c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("namespace"); 1187a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 118801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 118901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Using directives 119001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 119101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("using"); 119201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 119301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTextChunk("namespace"); 119401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 119501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("identifier"); 1196a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 119701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 119801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // asm(string-literal) 119901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 120001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("asm"); 120101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 120201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("string-literal"); 120301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 1204a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 120501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1206c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor if (Results.includeCodePatterns()) { 1207c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // Explicit template instantiation 1208c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern = new CodeCompletionString; 1209c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddTypedTextChunk("template"); 1210c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 1211c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("declaration"); 1212c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Results.AddResult(Result(Pattern)); 1213c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor } 121401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 1215b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 1216b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor if (SemaRef.getLangOptions().ObjC1) 1217bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCTopLevelResults(Results, true); 1218b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 1219c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor AddTypedefResult(Results); 122001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Fall through 122101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1222e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_Class: 1223c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor if (SemaRef.getLangOptions().CPlusPlus) { 122401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Using declaration 122501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor CodeCompletionString *Pattern = new CodeCompletionString; 122601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("using"); 122701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 1228c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("qualifier"); 1229c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddTextChunk("::"); 1230c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("name"); 1231a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 123201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1233c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // using typename qualifier::name (only in a dependent context) 123401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (SemaRef.CurContext->isDependentContext()) { 123501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 123601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("using"); 123701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 123801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTextChunk("typename"); 123901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 1240c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("qualifier"); 1241c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddTextChunk("::"); 1242c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("name"); 1243a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 124401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 124501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1246e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor if (CCC == Action::PCC_Class) { 1247c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor AddTypedefResult(Results); 1248c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor 124901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // public: 125001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 125101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("public"); 125201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_Colon); 1253a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 125401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 125501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // protected: 125601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 125701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("protected"); 125801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_Colon); 1259a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 126001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 126101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // private: 126201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 126301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("private"); 126401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_Colon); 1265a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 126601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 126701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 126801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Fall through 126901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1270e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_Template: 1271e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_MemberTemplate: 1272d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus && Results.includeCodePatterns()) { 127301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // template < parameters > 127401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor CodeCompletionString *Pattern = new CodeCompletionString; 127501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("template"); 127601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftAngle); 127701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("parameters"); 127801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightAngle); 1279a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 128001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 128101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1282bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddStorageSpecifiers(CCC, SemaRef.getLangOptions(), Results); 1283bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddFunctionSpecifiers(CCC, SemaRef.getLangOptions(), Results); 128401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 128501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1286e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_ObjCInterface: 1287bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCInterfaceResults(SemaRef.getLangOptions(), Results, true); 1288bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddStorageSpecifiers(CCC, SemaRef.getLangOptions(), Results); 1289bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddFunctionSpecifiers(CCC, SemaRef.getLangOptions(), Results); 1290b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor break; 1291b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 1292e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_ObjCImplementation: 1293bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCImplementationResults(SemaRef.getLangOptions(), Results, true); 1294bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddStorageSpecifiers(CCC, SemaRef.getLangOptions(), Results); 1295bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddFunctionSpecifiers(CCC, SemaRef.getLangOptions(), Results); 1296b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor break; 1297b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 1298e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_ObjCInstanceVariableList: 1299bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCVisibilityResults(SemaRef.getLangOptions(), Results, true); 1300c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor break; 1301c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor 1302e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_RecoveryInFunction: 1303e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_Statement: { 1304c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor AddTypedefResult(Results); 130501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 130601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor CodeCompletionString *Pattern = 0; 1307d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus && Results.includeCodePatterns()) { 130801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 130901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("try"); 131001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftBrace); 131101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("statements"); 131201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_VerticalSpace); 131301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightBrace); 131401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTextChunk("catch"); 131501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 131601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("declaration"); 131701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 131801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftBrace); 131901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("statements"); 132001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_VerticalSpace); 132101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightBrace); 1322a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 132301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 1324b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor if (SemaRef.getLangOptions().ObjC1) 1325bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCStatementResults(Results, true); 1326b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 1327d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor if (Results.includeCodePatterns()) { 1328d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor // if (condition) { statements } 1329d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern = new CodeCompletionString; 1330d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddTypedTextChunk("if"); 1331d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 1332d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus) 1333d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddPlaceholderChunk("condition"); 1334d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor else 1335d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddPlaceholderChunk("expression"); 1336d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 1337d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftBrace); 1338d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddPlaceholderChunk("statements"); 1339d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_VerticalSpace); 1340d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightBrace); 1341d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Results.AddResult(Result(Pattern)); 134201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1343d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor // switch (condition) { } 1344d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern = new CodeCompletionString; 1345d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddTypedTextChunk("switch"); 1346d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 1347d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus) 1348d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddPlaceholderChunk("condition"); 1349d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor else 1350d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddPlaceholderChunk("expression"); 1351d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 1352d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftBrace); 1353d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_VerticalSpace); 1354d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightBrace); 1355d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Results.AddResult(Result(Pattern)); 1356d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor } 1357d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor 135801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Switch-specific statements. 1359c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor if (!SemaRef.getSwitchStack().empty()) { 136001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // case expression: 136101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 136201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("case"); 1363c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 136401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("expression"); 136501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_Colon); 1366a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 136701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 136801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // default: 136901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 137001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("default"); 137101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_Colon); 1372a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 137301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 137401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1375d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor if (Results.includeCodePatterns()) { 1376d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor /// while (condition) { statements } 1377d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern = new CodeCompletionString; 1378d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddTypedTextChunk("while"); 1379d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 1380d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus) 1381d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddPlaceholderChunk("condition"); 1382d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor else 1383d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddPlaceholderChunk("expression"); 1384d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 1385d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftBrace); 1386d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddPlaceholderChunk("statements"); 1387d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_VerticalSpace); 1388d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightBrace); 1389d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Results.AddResult(Result(Pattern)); 139001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1391d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor // do { statements } while ( expression ); 1392d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern = new CodeCompletionString; 1393d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddTypedTextChunk("do"); 1394d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftBrace); 1395d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddPlaceholderChunk("statements"); 1396d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_VerticalSpace); 1397d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightBrace); 1398d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddTextChunk("while"); 1399d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 1400d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddPlaceholderChunk("expression"); 1401d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 1402d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Results.AddResult(Result(Pattern)); 140301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1404d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor // for ( for-init-statement ; condition ; expression ) { statements } 1405d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern = new CodeCompletionString; 1406d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddTypedTextChunk("for"); 1407d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 1408d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus || SemaRef.getLangOptions().C99) 1409d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddPlaceholderChunk("init-statement"); 1410d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor else 1411d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddPlaceholderChunk("init-expression"); 1412d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_SemiColon); 1413d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddPlaceholderChunk("condition"); 1414d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_SemiColon); 1415d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddPlaceholderChunk("inc-expression"); 1416d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 1417d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftBrace); 1418d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddPlaceholderChunk("statements"); 1419d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_VerticalSpace); 1420d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightBrace); 1421d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Results.AddResult(Result(Pattern)); 1422d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor } 142301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 142401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (S->getContinueParent()) { 142501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // continue ; 142601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 142701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("continue"); 1428a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 142901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 143001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 143101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (S->getBreakParent()) { 143201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // break ; 143301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 143401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("break"); 1435a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 143601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 143701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 143801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // "return expression ;" or "return ;", depending on whether we 143901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // know the function is void or not. 144001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor bool isVoid = false; 144101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (FunctionDecl *Function = dyn_cast<FunctionDecl>(SemaRef.CurContext)) 144201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor isVoid = Function->getResultType()->isVoidType(); 144301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor else if (ObjCMethodDecl *Method 144401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor = dyn_cast<ObjCMethodDecl>(SemaRef.CurContext)) 144501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor isVoid = Method->getResultType()->isVoidType(); 14469ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor else if (SemaRef.getCurBlock() && 14479ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor !SemaRef.getCurBlock()->ReturnType.isNull()) 14489ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor isVoid = SemaRef.getCurBlock()->ReturnType->isVoidType(); 144901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 145001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("return"); 14519329800d6f4c4ea8778aabd64cde1b712b290b00Douglas Gregor if (!isVoid) { 14529329800d6f4c4ea8778aabd64cde1b712b290b00Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 145301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("expression"); 14549329800d6f4c4ea8778aabd64cde1b712b290b00Douglas Gregor } 1455a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 145601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1457c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // goto identifier ; 1458c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern = new CodeCompletionString; 1459c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddTypedTextChunk("goto"); 1460c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 1461c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("label"); 1462c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Results.AddResult(Result(Pattern)); 146301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1464c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // Using directives 1465c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern = new CodeCompletionString; 1466c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddTypedTextChunk("using"); 1467c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 1468c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddTextChunk("namespace"); 1469c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 1470c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("identifier"); 1471c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Results.AddResult(Result(Pattern)); 147201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 147301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 147401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Fall through (for statement expressions). 1475e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_ForInit: 1476e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_Condition: 1477bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddStorageSpecifiers(CCC, SemaRef.getLangOptions(), Results); 147801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Fall through: conditions and statements can have expressions. 147901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1480e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_Expression: { 148101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor CodeCompletionString *Pattern = 0; 148201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus) { 148301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // 'this', if we're in a non-static member function. 148401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(SemaRef.CurContext)) 148501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (!Method->isStatic()) 1486a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("this")); 148701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 148801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // true, false 1489a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("true")); 1490a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("false")); 149101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1492c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // dynamic_cast < type-id > ( expression ) 1493c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern = new CodeCompletionString; 1494c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddTypedTextChunk("dynamic_cast"); 1495c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftAngle); 1496c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("type"); 1497c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightAngle); 1498c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 1499c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("expression"); 1500c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 1501c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Results.AddResult(Result(Pattern)); 1502c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor 1503c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // static_cast < type-id > ( expression ) 1504c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern = new CodeCompletionString; 1505c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddTypedTextChunk("static_cast"); 1506c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftAngle); 1507c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("type"); 1508c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightAngle); 1509c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 1510c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("expression"); 1511c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 1512c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Results.AddResult(Result(Pattern)); 1513d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor 1514c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // reinterpret_cast < type-id > ( expression ) 1515c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern = new CodeCompletionString; 1516c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddTypedTextChunk("reinterpret_cast"); 1517c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftAngle); 1518c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("type"); 1519c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightAngle); 1520c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 1521c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("expression"); 1522c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 1523c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Results.AddResult(Result(Pattern)); 1524d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor 1525c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // const_cast < type-id > ( expression ) 1526c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern = new CodeCompletionString; 1527c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddTypedTextChunk("const_cast"); 1528c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftAngle); 1529c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("type"); 1530c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightAngle); 1531c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 1532c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("expression"); 1533c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 1534c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Results.AddResult(Result(Pattern)); 1535d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor 1536c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // typeid ( expression-or-type ) 1537c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern = new CodeCompletionString; 1538c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddTypedTextChunk("typeid"); 1539c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 1540c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("expression-or-type"); 1541c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 1542c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Results.AddResult(Result(Pattern)); 154301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1544c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // new T ( ... ) 1545c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern = new CodeCompletionString; 1546c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddTypedTextChunk("new"); 1547c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 1548c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("type"); 1549c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 1550c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("expressions"); 1551c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 1552c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Results.AddResult(Result(Pattern)); 155301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1554c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // new T [ ] ( ... ) 1555c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern = new CodeCompletionString; 1556c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddTypedTextChunk("new"); 1557c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 1558c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("type"); 1559c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftBracket); 1560c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("size"); 1561c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightBracket); 1562c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 1563c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("expressions"); 1564c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 1565c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Results.AddResult(Result(Pattern)); 156601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1567c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // delete expression 1568c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern = new CodeCompletionString; 1569c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddTypedTextChunk("delete"); 1570c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 1571c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("expression"); 1572c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Results.AddResult(Result(Pattern)); 157301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1574c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // delete [] expression 1575c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern = new CodeCompletionString; 1576c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddTypedTextChunk("delete"); 1577c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 1578c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftBracket); 1579c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightBracket); 1580c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 1581c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("expression"); 1582c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Results.AddResult(Result(Pattern)); 1583c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor 1584c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // throw expression 1585c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern = new CodeCompletionString; 1586c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddTypedTextChunk("throw"); 1587c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 1588c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("expression"); 1589c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Results.AddResult(Result(Pattern)); 159012e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor 159112e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor // FIXME: Rethrow? 159201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 159301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 159401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (SemaRef.getLangOptions().ObjC1) { 159501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Add "super", if we're in an Objective-C class with a superclass. 1596681e256048cf9d3d226b9d0699f3df22c2500ef4Ted Kremenek if (ObjCMethodDecl *Method = SemaRef.getCurMethodDecl()) { 1597681e256048cf9d3d226b9d0699f3df22c2500ef4Ted Kremenek // The interface can be NULL. 1598681e256048cf9d3d226b9d0699f3df22c2500ef4Ted Kremenek if (ObjCInterfaceDecl *ID = Method->getClassInterface()) 1599681e256048cf9d3d226b9d0699f3df22c2500ef4Ted Kremenek if (ID->getSuperClass()) 1600681e256048cf9d3d226b9d0699f3df22c2500ef4Ted Kremenek Results.AddResult(Result("super")); 1601681e256048cf9d3d226b9d0699f3df22c2500ef4Ted Kremenek } 1602681e256048cf9d3d226b9d0699f3df22c2500ef4Ted Kremenek 1603bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCExpressionResults(Results, true); 160401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 160501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1606c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // sizeof expression 1607c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern = new CodeCompletionString; 1608c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddTypedTextChunk("sizeof"); 1609c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 1610c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("expression-or-type"); 1611c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 1612c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Results.AddResult(Result(Pattern)); 161301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 161486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 161501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 161601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 16174710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor if (WantTypesInContext(CCC, SemaRef.getLangOptions())) 16184710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor AddTypeSpecifierResults(SemaRef.getLangOptions(), Results); 161901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 162001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus) 1621a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("operator")); 162286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 162386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 1624ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor/// \brief If the given declaration has an associated type, add it as a result 1625ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor/// type chunk. 1626ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregorstatic void AddResultTypeChunk(ASTContext &Context, 1627ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor NamedDecl *ND, 1628ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor CodeCompletionString *Result) { 1629ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor if (!ND) 1630ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor return; 1631ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor 1632ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor // Determine the type of the declaration (if it has a type). 1633ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor QualType T; 1634ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor if (FunctionDecl *Function = dyn_cast<FunctionDecl>(ND)) 1635ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor T = Function->getResultType(); 1636ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor else if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(ND)) 1637ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor T = Method->getResultType(); 1638ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor else if (FunctionTemplateDecl *FunTmpl = dyn_cast<FunctionTemplateDecl>(ND)) 1639ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor T = FunTmpl->getTemplatedDecl()->getResultType(); 1640ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor else if (EnumConstantDecl *Enumerator = dyn_cast<EnumConstantDecl>(ND)) 1641ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor T = Context.getTypeDeclType(cast<TypeDecl>(Enumerator->getDeclContext())); 1642ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor else if (isa<UnresolvedUsingValueDecl>(ND)) { 1643ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor /* Do nothing: ignore unresolved using declarations*/ 1644ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor } else if (ValueDecl *Value = dyn_cast<ValueDecl>(ND)) 1645ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor T = Value->getType(); 1646ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor else if (ObjCPropertyDecl *Property = dyn_cast<ObjCPropertyDecl>(ND)) 1647ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor T = Property->getType(); 1648ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor 1649ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor if (T.isNull() || Context.hasSameType(T, Context.DependentTy)) 1650ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor return; 1651ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor 165284139d6ef8967cfdb70d37378a7a65cc4827d44dDouglas Gregor PrintingPolicy Policy(Context.PrintingPolicy); 165384139d6ef8967cfdb70d37378a7a65cc4827d44dDouglas Gregor Policy.AnonymousTagLocations = false; 165484139d6ef8967cfdb70d37378a7a65cc4827d44dDouglas Gregor 1655ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor std::string TypeStr; 165684139d6ef8967cfdb70d37378a7a65cc4827d44dDouglas Gregor T.getAsStringInternal(TypeStr, Policy); 1657ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor Result->AddResultTypeChunk(TypeStr); 1658ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor} 1659ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor 166086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Add function parameter chunks to the given code completion string. 166186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorstatic void AddFunctionParameterChunks(ASTContext &Context, 166286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor FunctionDecl *Function, 166386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor CodeCompletionString *Result) { 16640c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor typedef CodeCompletionString::Chunk Chunk; 16650c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 166686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor CodeCompletionString *CCStr = Result; 166786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 166886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor for (unsigned P = 0, N = Function->getNumParams(); P != N; ++P) { 166986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ParmVarDecl *Param = Function->getParamDecl(P); 167086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 167186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (Param->hasDefaultArg()) { 167286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // When we see an optional default argument, put that argument and 167386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // the remaining default arguments into a new, optional string. 167486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor CodeCompletionString *Opt = new CodeCompletionString; 167586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor CCStr->AddOptionalChunk(std::auto_ptr<CodeCompletionString>(Opt)); 167686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor CCStr = Opt; 167786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 167886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 167986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (P != 0) 16800c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor CCStr->AddChunk(Chunk(CodeCompletionString::CK_Comma)); 168186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 168286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Format the placeholder string. 168386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor std::string PlaceholderStr; 168486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (Param->getIdentifier()) 168586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr = Param->getIdentifier()->getName(); 168686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 168786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Param->getType().getAsStringInternal(PlaceholderStr, 168886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Context.PrintingPolicy); 168986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 169086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add the placeholder string. 1691660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer CCStr->AddPlaceholderChunk(PlaceholderStr); 169286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 1693b3d4525c65cf456d3f1f4338afdcac83afc7be02Douglas Gregor 1694b3d4525c65cf456d3f1f4338afdcac83afc7be02Douglas Gregor if (const FunctionProtoType *Proto 1695b3d4525c65cf456d3f1f4338afdcac83afc7be02Douglas Gregor = Function->getType()->getAs<FunctionProtoType>()) 1696b3d4525c65cf456d3f1f4338afdcac83afc7be02Douglas Gregor if (Proto->isVariadic()) 1697b3d4525c65cf456d3f1f4338afdcac83afc7be02Douglas Gregor CCStr->AddPlaceholderChunk(", ..."); 169886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 169986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 170086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Add template parameter chunks to the given code completion string. 170186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorstatic void AddTemplateParameterChunks(ASTContext &Context, 170286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor TemplateDecl *Template, 170386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor CodeCompletionString *Result, 170486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor unsigned MaxParameters = 0) { 17050c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor typedef CodeCompletionString::Chunk Chunk; 17060c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 170786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor CodeCompletionString *CCStr = Result; 170886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool FirstParameter = true; 170986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 171086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor TemplateParameterList *Params = Template->getTemplateParameters(); 171186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor TemplateParameterList::iterator PEnd = Params->end(); 171286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (MaxParameters) 171386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PEnd = Params->begin() + MaxParameters; 171486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor for (TemplateParameterList::iterator P = Params->begin(); P != PEnd; ++P) { 171586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool HasDefaultArg = false; 171686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor std::string PlaceholderStr; 171786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(*P)) { 171886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (TTP->wasDeclaredWithTypename()) 171986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr = "typename"; 172086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor else 172186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr = "class"; 172286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 172386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (TTP->getIdentifier()) { 172486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr += ' '; 172586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr += TTP->getIdentifier()->getName(); 172686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 172786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 172886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor HasDefaultArg = TTP->hasDefaultArgument(); 172986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } else if (NonTypeTemplateParmDecl *NTTP 173086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor = dyn_cast<NonTypeTemplateParmDecl>(*P)) { 173186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (NTTP->getIdentifier()) 173286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr = NTTP->getIdentifier()->getName(); 173386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NTTP->getType().getAsStringInternal(PlaceholderStr, 173486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Context.PrintingPolicy); 173586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor HasDefaultArg = NTTP->hasDefaultArgument(); 173686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } else { 173786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor assert(isa<TemplateTemplateParmDecl>(*P)); 173886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor TemplateTemplateParmDecl *TTP = cast<TemplateTemplateParmDecl>(*P); 173986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 174086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Since putting the template argument list into the placeholder would 174186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // be very, very long, we just use an abbreviation. 174286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr = "template<...> class"; 174386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (TTP->getIdentifier()) { 174486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr += ' '; 174586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr += TTP->getIdentifier()->getName(); 174686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 174786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 174886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor HasDefaultArg = TTP->hasDefaultArgument(); 174986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 175086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 175186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (HasDefaultArg) { 175286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // When we see an optional default argument, put that argument and 175386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // the remaining default arguments into a new, optional string. 175486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor CodeCompletionString *Opt = new CodeCompletionString; 175586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor CCStr->AddOptionalChunk(std::auto_ptr<CodeCompletionString>(Opt)); 175686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor CCStr = Opt; 175786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 175886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 175986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (FirstParameter) 176086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor FirstParameter = false; 176186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor else 17620c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor CCStr->AddChunk(Chunk(CodeCompletionString::CK_Comma)); 176386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 176486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add the placeholder string. 1765660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer CCStr->AddPlaceholderChunk(PlaceholderStr); 176686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 176786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 176886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 1769b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor/// \brief Add a qualifier to the given code-completion string, if the 1770b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor/// provided nested-name-specifier is non-NULL. 1771a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregorstatic void 1772a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas GregorAddQualifierToCompletionString(CodeCompletionString *Result, 1773a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor NestedNameSpecifier *Qualifier, 1774a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor bool QualifierIsInformative, 1775a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor ASTContext &Context) { 1776b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor if (!Qualifier) 1777b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor return; 1778b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor 1779b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor std::string PrintedNNS; 1780b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor { 1781b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor llvm::raw_string_ostream OS(PrintedNNS); 1782b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor Qualifier->print(OS, Context.PrintingPolicy); 1783b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor } 17840563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor if (QualifierIsInformative) 1785660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer Result->AddInformativeChunk(PrintedNNS); 17860563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor else 1787660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer Result->AddTextChunk(PrintedNNS); 1788b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor} 1789b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor 1790a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregorstatic void AddFunctionTypeQualsToCompletionString(CodeCompletionString *Result, 1791a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor FunctionDecl *Function) { 1792a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor const FunctionProtoType *Proto 1793a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor = Function->getType()->getAs<FunctionProtoType>(); 1794a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor if (!Proto || !Proto->getTypeQuals()) 1795a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor return; 1796a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor 1797a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor std::string QualsStr; 1798a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor if (Proto->getTypeQuals() & Qualifiers::Const) 1799a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor QualsStr += " const"; 1800a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor if (Proto->getTypeQuals() & Qualifiers::Volatile) 1801a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor QualsStr += " volatile"; 1802a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor if (Proto->getTypeQuals() & Qualifiers::Restrict) 1803a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor QualsStr += " restrict"; 1804a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor Result->AddInformativeChunk(QualsStr); 1805a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor} 1806a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor 180786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief If possible, create a new code completion string for the given 180886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// result. 180986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// 181086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \returns Either a new, heap-allocated code completion string describing 181186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// how to use this result, or NULL to indicate that the string or name of the 181286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// result is all that is needed. 181386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas GregorCodeCompletionString * 18141abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas GregorCodeCompleteConsumer::Result::CreateCodeCompletionString(Sema &S, 18151abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor CodeCompletionString *Result) { 18160c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor typedef CodeCompletionString::Chunk Chunk; 18170c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 18182b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor if (Kind == RK_Pattern) 18191abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor return Pattern->Clone(Result); 18202b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 18211abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor if (!Result) 18221abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor Result = new CodeCompletionString; 18232b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 18242b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor if (Kind == RK_Keyword) { 18252b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor Result->AddTypedTextChunk(Keyword); 18262b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor return Result; 18272b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor } 182886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 18293f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor if (Kind == RK_Macro) { 18303f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor MacroInfo *MI = S.PP.getMacroInfo(Macro); 18312b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor assert(MI && "Not a macro?"); 18322b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 18332b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor Result->AddTypedTextChunk(Macro->getName()); 18342b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 18352b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor if (!MI->isFunctionLike()) 18362b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor return Result; 18373f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor 18383f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor // Format a function-like macro with placeholders for the arguments. 18390c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_LeftParen)); 18403f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor for (MacroInfo::arg_iterator A = MI->arg_begin(), AEnd = MI->arg_end(); 18413f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor A != AEnd; ++A) { 18423f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor if (A != MI->arg_begin()) 18430c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_Comma)); 18443f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor 18453f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor if (!MI->isVariadic() || A != AEnd - 1) { 18463f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor // Non-variadic argument. 1847660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer Result->AddPlaceholderChunk((*A)->getName()); 18483f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor continue; 18493f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor } 18503f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor 18513f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor // Variadic argument; cope with the different between GNU and C99 18523f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor // variadic macros, providing a single placeholder for the rest of the 18533f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor // arguments. 18543f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor if ((*A)->isStr("__VA_ARGS__")) 18553f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor Result->AddPlaceholderChunk("..."); 18563f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor else { 18573f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor std::string Arg = (*A)->getName(); 18583f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor Arg += "..."; 1859660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer Result->AddPlaceholderChunk(Arg); 18603f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor } 18613f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor } 18620c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_RightParen)); 18633f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor return Result; 18643f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor } 18653f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor 1866d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor assert(Kind == RK_Declaration && "Missed a result kind?"); 186786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NamedDecl *ND = Declaration; 186886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 18690c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor if (StartsNestedNameSpecifier) { 1870660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer Result->AddTypedTextChunk(ND->getNameAsString()); 18710c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddTextChunk("::"); 18720c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor return Result; 18730c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor } 18740c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 1875ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor AddResultTypeChunk(S.Context, ND, Result); 1876ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor 187786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (FunctionDecl *Function = dyn_cast<FunctionDecl>(ND)) { 18780563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative, 18790563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor S.Context); 1880660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer Result->AddTypedTextChunk(Function->getNameAsString()); 18810c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_LeftParen)); 188286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor AddFunctionParameterChunks(S.Context, Function, Result); 18830c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_RightParen)); 1884a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor AddFunctionTypeQualsToCompletionString(Result, Function); 188586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return Result; 188686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 188786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 188886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (FunctionTemplateDecl *FunTmpl = dyn_cast<FunctionTemplateDecl>(ND)) { 18890563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative, 18900563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor S.Context); 189186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor FunctionDecl *Function = FunTmpl->getTemplatedDecl(); 1892660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer Result->AddTypedTextChunk(Function->getNameAsString()); 189386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 189486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Figure out which template parameters are deduced (or have default 189586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // arguments). 189686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor llvm::SmallVector<bool, 16> Deduced; 189786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor S.MarkDeducedTemplateParameters(FunTmpl, Deduced); 189886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor unsigned LastDeducibleArgument; 189986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor for (LastDeducibleArgument = Deduced.size(); LastDeducibleArgument > 0; 190086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor --LastDeducibleArgument) { 190186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!Deduced[LastDeducibleArgument - 1]) { 190286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // C++0x: Figure out if the template argument has a default. If so, 190386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // the user doesn't need to type this argument. 190486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // FIXME: We need to abstract template parameters better! 190586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool HasDefaultArg = false; 190686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NamedDecl *Param = FunTmpl->getTemplateParameters()->getParam( 190786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor LastDeducibleArgument - 1); 190886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(Param)) 190986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor HasDefaultArg = TTP->hasDefaultArgument(); 191086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor else if (NonTypeTemplateParmDecl *NTTP 191186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor = dyn_cast<NonTypeTemplateParmDecl>(Param)) 191286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor HasDefaultArg = NTTP->hasDefaultArgument(); 191386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor else { 191486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor assert(isa<TemplateTemplateParmDecl>(Param)); 191586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor HasDefaultArg 19160c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor = cast<TemplateTemplateParmDecl>(Param)->hasDefaultArgument(); 191786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 191886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 191986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!HasDefaultArg) 192086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor break; 192186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 192286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 192386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 192486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (LastDeducibleArgument) { 192586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Some of the function template arguments cannot be deduced from a 192686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // function call, so we introduce an explicit template argument list 192786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // containing all of the arguments up to the first deducible argument. 19280c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_LeftAngle)); 192986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor AddTemplateParameterChunks(S.Context, FunTmpl, Result, 193086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor LastDeducibleArgument); 19310c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_RightAngle)); 193286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 193386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 193486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add the function parameters 19350c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_LeftParen)); 193686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor AddFunctionParameterChunks(S.Context, Function, Result); 19370c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_RightParen)); 1938a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor AddFunctionTypeQualsToCompletionString(Result, Function); 193986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return Result; 194086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 194186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 194286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (TemplateDecl *Template = dyn_cast<TemplateDecl>(ND)) { 19430563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative, 19440563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor S.Context); 1945660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer Result->AddTypedTextChunk(Template->getNameAsString()); 19460c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_LeftAngle)); 194786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor AddTemplateParameterChunks(S.Context, Template, Result); 19480c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_RightAngle)); 194986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return Result; 195086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 195186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 19529630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(ND)) { 19539630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor Selector Sel = Method->getSelector(); 19549630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor if (Sel.isUnarySelector()) { 19559630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor Result->AddTypedTextChunk(Sel.getIdentifierInfoForSlot(0)->getName()); 19569630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor return Result; 19579630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor } 19589630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor 1959d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor std::string SelName = Sel.getIdentifierInfoForSlot(0)->getName().str(); 1960d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor SelName += ':'; 1961d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor if (StartParameter == 0) 1962d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor Result->AddTypedTextChunk(SelName); 1963d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor else { 1964d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor Result->AddInformativeChunk(SelName); 1965d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor 1966d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor // If there is only one parameter, and we're past it, add an empty 1967d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor // typed-text chunk since there is nothing to type. 1968d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor if (Method->param_size() == 1) 1969d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor Result->AddTypedTextChunk(""); 1970d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor } 19719630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor unsigned Idx = 0; 19729630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor for (ObjCMethodDecl::param_iterator P = Method->param_begin(), 19739630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor PEnd = Method->param_end(); 19749630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor P != PEnd; (void)++P, ++Idx) { 19759630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor if (Idx > 0) { 1976d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor std::string Keyword; 1977d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor if (Idx > StartParameter) 1978834389b87451b24618513b907b4dfb5b00d211f3Douglas Gregor Result->AddChunk(CodeCompletionString::CK_HorizontalSpace); 19799630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor if (IdentifierInfo *II = Sel.getIdentifierInfoForSlot(Idx)) 19809630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor Keyword += II->getName().str(); 19819630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor Keyword += ":"; 19821f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor if (Idx < StartParameter || AllParametersAreInformative) 1983d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor Result->AddInformativeChunk(Keyword); 19841f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor else if (Idx == StartParameter) 1985d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor Result->AddTypedTextChunk(Keyword); 1986d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor else 1987d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor Result->AddTextChunk(Keyword); 19889630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor } 1989d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor 1990d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor // If we're before the starting parameter, skip the placeholder. 1991d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor if (Idx < StartParameter) 1992d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor continue; 19939630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor 19949630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor std::string Arg; 19959630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor (*P)->getType().getAsStringInternal(Arg, S.Context.PrintingPolicy); 19969630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor Arg = "(" + Arg + ")"; 19979630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor if (IdentifierInfo *II = (*P)->getIdentifier()) 19989630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor Arg += II->getName().str(); 19991f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor if (DeclaringEntity) 20001f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor Result->AddTextChunk(Arg); 20011f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor else if (AllParametersAreInformative) 20024ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Result->AddInformativeChunk(Arg); 20034ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor else 20044ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Result->AddPlaceholderChunk(Arg); 20059630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor } 20069630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor 20072a17af0c7e05500e25d4cc71341f1f232085ebeaDouglas Gregor if (Method->isVariadic()) { 20081f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor if (DeclaringEntity) 20091f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor Result->AddTextChunk(", ..."); 20101f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor else if (AllParametersAreInformative) 20112a17af0c7e05500e25d4cc71341f1f232085ebeaDouglas Gregor Result->AddInformativeChunk(", ..."); 20122a17af0c7e05500e25d4cc71341f1f232085ebeaDouglas Gregor else 20132a17af0c7e05500e25d4cc71341f1f232085ebeaDouglas Gregor Result->AddPlaceholderChunk(", ..."); 20142a17af0c7e05500e25d4cc71341f1f232085ebeaDouglas Gregor } 20152a17af0c7e05500e25d4cc71341f1f232085ebeaDouglas Gregor 20169630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor return Result; 20179630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor } 20189630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor 20192b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor if (Qualifier) 20200563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative, 20210563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor S.Context); 20222b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 20232b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor Result->AddTypedTextChunk(ND->getNameAsString()); 20242b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor return Result; 202586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 202686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 202786d802e03a267af79663990c39865c67e0645238Douglas GregorCodeCompletionString * 202886d802e03a267af79663990c39865c67e0645238Douglas GregorCodeCompleteConsumer::OverloadCandidate::CreateSignatureString( 202986d802e03a267af79663990c39865c67e0645238Douglas Gregor unsigned CurrentArg, 203086d802e03a267af79663990c39865c67e0645238Douglas Gregor Sema &S) const { 20310c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor typedef CodeCompletionString::Chunk Chunk; 20320c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 203386d802e03a267af79663990c39865c67e0645238Douglas Gregor CodeCompletionString *Result = new CodeCompletionString; 203486d802e03a267af79663990c39865c67e0645238Douglas Gregor FunctionDecl *FDecl = getFunction(); 2035ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor AddResultTypeChunk(S.Context, FDecl, Result); 203686d802e03a267af79663990c39865c67e0645238Douglas Gregor const FunctionProtoType *Proto 203786d802e03a267af79663990c39865c67e0645238Douglas Gregor = dyn_cast<FunctionProtoType>(getFunctionType()); 203886d802e03a267af79663990c39865c67e0645238Douglas Gregor if (!FDecl && !Proto) { 203986d802e03a267af79663990c39865c67e0645238Douglas Gregor // Function without a prototype. Just give the return type and a 204086d802e03a267af79663990c39865c67e0645238Douglas Gregor // highlighted ellipsis. 204186d802e03a267af79663990c39865c67e0645238Douglas Gregor const FunctionType *FT = getFunctionType(); 204286d802e03a267af79663990c39865c67e0645238Douglas Gregor Result->AddTextChunk( 2043660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer FT->getResultType().getAsString(S.Context.PrintingPolicy)); 20440c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_LeftParen)); 20450c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_CurrentParameter, "...")); 20460c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_RightParen)); 204786d802e03a267af79663990c39865c67e0645238Douglas Gregor return Result; 204886d802e03a267af79663990c39865c67e0645238Douglas Gregor } 204986d802e03a267af79663990c39865c67e0645238Douglas Gregor 205086d802e03a267af79663990c39865c67e0645238Douglas Gregor if (FDecl) 2051660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer Result->AddTextChunk(FDecl->getNameAsString()); 205286d802e03a267af79663990c39865c67e0645238Douglas Gregor else 205386d802e03a267af79663990c39865c67e0645238Douglas Gregor Result->AddTextChunk( 2054660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer Proto->getResultType().getAsString(S.Context.PrintingPolicy)); 205586d802e03a267af79663990c39865c67e0645238Douglas Gregor 20560c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_LeftParen)); 205786d802e03a267af79663990c39865c67e0645238Douglas Gregor unsigned NumParams = FDecl? FDecl->getNumParams() : Proto->getNumArgs(); 205886d802e03a267af79663990c39865c67e0645238Douglas Gregor for (unsigned I = 0; I != NumParams; ++I) { 205986d802e03a267af79663990c39865c67e0645238Douglas Gregor if (I) 20600c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_Comma)); 206186d802e03a267af79663990c39865c67e0645238Douglas Gregor 206286d802e03a267af79663990c39865c67e0645238Douglas Gregor std::string ArgString; 206386d802e03a267af79663990c39865c67e0645238Douglas Gregor QualType ArgType; 206486d802e03a267af79663990c39865c67e0645238Douglas Gregor 206586d802e03a267af79663990c39865c67e0645238Douglas Gregor if (FDecl) { 206686d802e03a267af79663990c39865c67e0645238Douglas Gregor ArgString = FDecl->getParamDecl(I)->getNameAsString(); 206786d802e03a267af79663990c39865c67e0645238Douglas Gregor ArgType = FDecl->getParamDecl(I)->getOriginalType(); 206886d802e03a267af79663990c39865c67e0645238Douglas Gregor } else { 206986d802e03a267af79663990c39865c67e0645238Douglas Gregor ArgType = Proto->getArgType(I); 207086d802e03a267af79663990c39865c67e0645238Douglas Gregor } 207186d802e03a267af79663990c39865c67e0645238Douglas Gregor 207286d802e03a267af79663990c39865c67e0645238Douglas Gregor ArgType.getAsStringInternal(ArgString, S.Context.PrintingPolicy); 207386d802e03a267af79663990c39865c67e0645238Douglas Gregor 207486d802e03a267af79663990c39865c67e0645238Douglas Gregor if (I == CurrentArg) 20750c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_CurrentParameter, 2076660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer ArgString)); 207786d802e03a267af79663990c39865c67e0645238Douglas Gregor else 2078660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer Result->AddTextChunk(ArgString); 207986d802e03a267af79663990c39865c67e0645238Douglas Gregor } 208086d802e03a267af79663990c39865c67e0645238Douglas Gregor 208186d802e03a267af79663990c39865c67e0645238Douglas Gregor if (Proto && Proto->isVariadic()) { 20820c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_Comma)); 208386d802e03a267af79663990c39865c67e0645238Douglas Gregor if (CurrentArg < NumParams) 208486d802e03a267af79663990c39865c67e0645238Douglas Gregor Result->AddTextChunk("..."); 208586d802e03a267af79663990c39865c67e0645238Douglas Gregor else 20860c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_CurrentParameter, "...")); 208786d802e03a267af79663990c39865c67e0645238Douglas Gregor } 20880c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_RightParen)); 208986d802e03a267af79663990c39865c67e0645238Douglas Gregor 209086d802e03a267af79663990c39865c67e0645238Douglas Gregor return Result; 209186d802e03a267af79663990c39865c67e0645238Douglas Gregor} 209286d802e03a267af79663990c39865c67e0645238Douglas Gregor 209386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregornamespace { 209486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor struct SortCodeCompleteResult { 209586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor typedef CodeCompleteConsumer::Result Result; 209686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 20976a6840326e9b4ac8e81a5a212165f33743847ab8Douglas Gregor bool isEarlierDeclarationName(DeclarationName X, DeclarationName Y) const { 20982b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor Selector XSel = X.getObjCSelector(); 20992b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor Selector YSel = Y.getObjCSelector(); 21002b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor if (!XSel.isNull() && !YSel.isNull()) { 21012b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor // We are comparing two selectors. 21022b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor unsigned N = std::min(XSel.getNumArgs(), YSel.getNumArgs()); 21032b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor if (N == 0) 21042b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor ++N; 21052b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor for (unsigned I = 0; I != N; ++I) { 21062b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor IdentifierInfo *XId = XSel.getIdentifierInfoForSlot(I); 21072b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor IdentifierInfo *YId = YSel.getIdentifierInfoForSlot(I); 21082b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor if (!XId || !YId) 21092b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor return XId && !YId; 21102b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor 21112b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor switch (XId->getName().compare_lower(YId->getName())) { 21122b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor case -1: return true; 21132b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor case 1: return false; 21142b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor default: break; 21152b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor } 21162b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor } 21172b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor 21182b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor return XSel.getNumArgs() < YSel.getNumArgs(); 21192b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor } 21202b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor 21212b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor // For non-selectors, order by kind. 21222b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor if (X.getNameKind() != Y.getNameKind()) 21236a6840326e9b4ac8e81a5a212165f33743847ab8Douglas Gregor return X.getNameKind() < Y.getNameKind(); 21246a6840326e9b4ac8e81a5a212165f33743847ab8Douglas Gregor 21252b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor // Order identifiers by comparison of their lowercased names. 21262b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor if (IdentifierInfo *XId = X.getAsIdentifierInfo()) 21272b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor return XId->getName().compare_lower( 21282b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor Y.getAsIdentifierInfo()->getName()) < 0; 21292b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor 21302b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor // Order overloaded operators by the order in which they appear 21312b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor // in our list of operators. 21322b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor if (OverloadedOperatorKind XOp = X.getCXXOverloadedOperator()) 21332b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor return XOp < Y.getCXXOverloadedOperator(); 21342b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor 21352b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor // Order C++0x user-defined literal operators lexically by their 21362b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor // lowercased suffixes. 21372b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor if (IdentifierInfo *XLit = X.getCXXLiteralIdentifier()) 21382b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor return XLit->getName().compare_lower( 21392b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor Y.getCXXLiteralIdentifier()->getName()) < 0; 21402b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor 21412b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor // The only stable ordering we have is to turn the name into a 21422b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor // string and then compare the lower-case strings. This is 21432b0cc12cf1f9fd05ceb2551686641837c7800528Douglas Gregor // inefficient, but thankfully does not happen too often. 21440e7049fc6f2cc13d1236630782b702f11f6aaf9fBenjamin Kramer return llvm::StringRef(X.getAsString()).compare_lower( 21450e7049fc6f2cc13d1236630782b702f11f6aaf9fBenjamin Kramer Y.getAsString()) < 0; 21466a6840326e9b4ac8e81a5a212165f33743847ab8Douglas Gregor } 21476a6840326e9b4ac8e81a5a212165f33743847ab8Douglas Gregor 2148ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor /// \brief Retrieve the name that should be used to order a result. 2149ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor /// 2150ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor /// If the name needs to be constructed as a string, that string will be 2151ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor /// saved into Saved and the returned StringRef will refer to it. 2152ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor static llvm::StringRef getOrderedName(const Result &R, 2153ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor std::string &Saved) { 2154ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor switch (R.Kind) { 2155ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor case Result::RK_Keyword: 2156ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor return R.Keyword; 2157ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor 2158ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor case Result::RK_Pattern: 2159ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor return R.Pattern->getTypedText(); 2160ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor 2161ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor case Result::RK_Macro: 2162ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor return R.Macro->getName(); 2163ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor 2164ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor case Result::RK_Declaration: 2165ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor // Handle declarations below. 2166ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor break; 216754f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor } 2168ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor 2169ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor DeclarationName Name = R.Declaration->getDeclName(); 217054f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor 2171ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor // If the name is a simple identifier (by far the common case), or a 2172ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor // zero-argument selector, just return a reference to that identifier. 2173ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor if (IdentifierInfo *Id = Name.getAsIdentifierInfo()) 2174ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor return Id->getName(); 2175ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor if (Name.isObjCZeroArgSelector()) 2176ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor if (IdentifierInfo *Id 2177ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor = Name.getObjCSelector().getIdentifierInfoForSlot(0)) 2178ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor return Id->getName(); 2179ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor 2180ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor Saved = Name.getAsString(); 2181ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor return Saved; 2182ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor } 2183ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor 2184ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor bool operator()(const Result &X, const Result &Y) const { 2185ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor std::string XSaved, YSaved; 2186ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor llvm::StringRef XStr = getOrderedName(X, XSaved); 2187ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor llvm::StringRef YStr = getOrderedName(Y, YSaved); 2188ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor int cmp = XStr.compare_lower(YStr); 2189ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor if (cmp) 2190ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor return cmp < 0; 219186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 219286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Non-hidden names precede hidden names. 219386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (X.Hidden != Y.Hidden) 219486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return !X.Hidden; 219586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 2196eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor // Non-nested-name-specifiers precede nested-name-specifiers. 2197eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor if (X.StartsNestedNameSpecifier != Y.StartsNestedNameSpecifier) 2198eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor return !X.StartsNestedNameSpecifier; 2199eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor 220086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return false; 220186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 220286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor }; 220386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 220486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 2205590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregorstatic void AddMacroResults(Preprocessor &PP, ResultBuilder &Results, 2206590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregor bool TargetTypeIsPointer = false) { 2207590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregor typedef CodeCompleteConsumer::Result Result; 2208590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregor 22093f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor Results.EnterNewScope(); 22100c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor for (Preprocessor::macro_iterator M = PP.macro_begin(), 22110c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor MEnd = PP.macro_end(); 2212590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregor M != MEnd; ++M) { 2213590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregor unsigned Priority = CCP_Macro; 2214590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregor 2215590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregor // Treat the "nil" and "NULL" macros as null pointer constants. 2216590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregor if (M->first->isStr("nil") || M->first->isStr("NULL")) { 2217590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregor Priority = CCP_Constant; 2218590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregor if (TargetTypeIsPointer) 2219590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregor Priority = Priority / CCF_SimilarTypeMatch; 2220590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregor } 2221590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregor 2222590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregor Results.AddResult(Result(M->first, Priority)); 2223590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregor } 22243f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor Results.ExitScope(); 22253f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor} 22263f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor 22273a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbarstatic void HandleCodeCompleteResults(Sema *S, 22283a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar CodeCompleteConsumer *CodeCompleter, 2229e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext Context, 2230e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompleteConsumer::Result *Results, 2231e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor unsigned NumResults) { 223286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor std::stable_sort(Results, Results + NumResults, SortCodeCompleteResult()); 223386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 223486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (CodeCompleter) 2235e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompleter->ProcessCodeCompleteResults(*S, Context, Results, NumResults); 223654f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor 223754f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor for (unsigned I = 0; I != NumResults; ++I) 223854f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor Results[I].Destroy(); 223986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 224086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 2241e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregorstatic enum CodeCompletionContext::Kind mapCodeCompletionContext(Sema &S, 2242e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Sema::ParserCompletionContext PCC) { 2243e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor switch (PCC) { 2244e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_Namespace: 2245e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor return CodeCompletionContext::CCC_TopLevel; 2246e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor 2247e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_Class: 2248e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor return CodeCompletionContext::CCC_ClassStructUnion; 2249e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor 2250e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_ObjCInterface: 2251e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor return CodeCompletionContext::CCC_ObjCInterface; 2252e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor 2253e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_ObjCImplementation: 2254e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor return CodeCompletionContext::CCC_ObjCImplementation; 2255e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor 2256e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_ObjCInstanceVariableList: 2257e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor return CodeCompletionContext::CCC_ObjCIvarList; 2258e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor 2259e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_Template: 2260e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_MemberTemplate: 2261e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_RecoveryInFunction: 2262e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor return CodeCompletionContext::CCC_Other; 2263e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor 2264e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_Expression: 2265e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_ForInit: 2266e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_Condition: 2267e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor return CodeCompletionContext::CCC_Expression; 2268e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor 2269e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_Statement: 2270e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor return CodeCompletionContext::CCC_Statement; 2271e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor } 2272e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor 2273e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor return CodeCompletionContext::CCC_Other; 2274e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor} 2275e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor 227601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregorvoid Sema::CodeCompleteOrdinaryName(Scope *S, 2277e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor ParserCompletionContext CompletionContext) { 22782a7925c4abe45650f3ab27be09468e3a3a98084aDouglas Gregor typedef CodeCompleteConsumer::Result Result; 227901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor ResultBuilder Results(*this); 228001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 228101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Determine how to filter results, e.g., so that the names of 228201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // values (functions, enumerators, function templates, etc.) are 228301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // only allowed where we can have an expression. 228401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor switch (CompletionContext) { 2285e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_Namespace: 2286e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_Class: 2287e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_ObjCInterface: 2288e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_ObjCImplementation: 2289e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_ObjCInstanceVariableList: 2290e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_Template: 2291e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_MemberTemplate: 229201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Results.setFilter(&ResultBuilder::IsOrdinaryNonValueName); 229301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 229401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 2295e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_Expression: 2296e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_Statement: 2297e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_ForInit: 2298e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_Condition: 22994710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor if (WantTypesInContext(CompletionContext, getLangOptions())) 23004710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor Results.setFilter(&ResultBuilder::IsOrdinaryName); 23014710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor else 23024710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor Results.setFilter(&ResultBuilder::IsOrdinaryNonTypeName); 230301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 2304dc8453422bec3bbf70c03920e01498d75783d122Douglas Gregor 2305e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_RecoveryInFunction: 2306dc8453422bec3bbf70c03920e01498d75783d122Douglas Gregor // Unfiltered 2307dc8453422bec3bbf70c03920e01498d75783d122Douglas Gregor break; 230801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 230901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 23101ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 23111ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer); 23122a7925c4abe45650f3ab27be09468e3a3a98084aDouglas Gregor 23132a7925c4abe45650f3ab27be09468e3a3a98084aDouglas Gregor Results.EnterNewScope(); 2314bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddOrdinaryNameResults(CompletionContext, S, *this, Results); 23152a7925c4abe45650f3ab27be09468e3a3a98084aDouglas Gregor Results.ExitScope(); 23162a7925c4abe45650f3ab27be09468e3a3a98084aDouglas Gregor 23170c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor if (CodeCompleter->includeMacros()) 2318bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddMacroResults(PP, Results); 2319e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 2320e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor mapCodeCompletionContext(*this, CompletionContext), 2321e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 2322791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor} 2323791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor 23245ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor/// \brief Perform code-completion in an expression context when we know what 23255ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor/// type we're looking for. 2326f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor/// 2327f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor/// \param IntegralConstantExpression Only permit integral constant 2328f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor/// expressions. 2329f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregorvoid Sema::CodeCompleteExpression(Scope *S, QualType T, 2330f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor bool IntegralConstantExpression) { 23315ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor typedef CodeCompleteConsumer::Result Result; 23325ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor ResultBuilder Results(*this); 23335ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 2334f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor if (IntegralConstantExpression) 2335f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor Results.setFilter(&ResultBuilder::IsIntegralConstantValue); 2336e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor else if (WantTypesInContext(PCC_Expression, getLangOptions())) 23375ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor Results.setFilter(&ResultBuilder::IsOrdinaryName); 23385ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor else 23395ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor Results.setFilter(&ResultBuilder::IsOrdinaryNonTypeName); 23405ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor Results.setPreferredType(T.getNonReferenceType()); 23415ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 23425ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 23435ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer); 23445ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 23455ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor Results.EnterNewScope(); 2346e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor AddOrdinaryNameResults(PCC_Expression, S, *this, Results); 23475ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor Results.ExitScope(); 23485ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 2349590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregor bool PreferredTypeIsPointer = false; 2350590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregor if (!T.isNull()) 2351590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregor PreferredTypeIsPointer = T->isAnyPointerType() || 2352590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregor T->isMemberPointerType() || T->isBlockPointerType(); 2353590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregor 23545ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (CodeCompleter->includeMacros()) 2355590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregor AddMacroResults(PP, Results, PreferredTypeIsPointer); 2356e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 2357e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Expression, 2358e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 23595ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor} 23605ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 23615ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 236295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregorstatic void AddObjCProperties(ObjCContainerDecl *Container, 2363322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor bool AllowCategories, 236495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor DeclContext *CurContext, 236595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor ResultBuilder &Results) { 236695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor typedef CodeCompleteConsumer::Result Result; 236795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 236895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Add properties in this container. 236995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor for (ObjCContainerDecl::prop_iterator P = Container->prop_begin(), 237095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor PEnd = Container->prop_end(); 237195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor P != PEnd; 237295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor ++P) 237395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor Results.MaybeAddResult(Result(*P, 0), CurContext); 237495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 237595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Add properties in referenced protocols. 237695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) { 237795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor for (ObjCProtocolDecl::protocol_iterator P = Protocol->protocol_begin(), 237895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor PEnd = Protocol->protocol_end(); 237995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor P != PEnd; ++P) 2380322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor AddObjCProperties(*P, AllowCategories, CurContext, Results); 238195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } else if (ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container)){ 2382322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor if (AllowCategories) { 2383322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Look through categories. 2384322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor for (ObjCCategoryDecl *Category = IFace->getCategoryList(); 2385322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Category; Category = Category->getNextClassCategory()) 2386322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor AddObjCProperties(Category, AllowCategories, CurContext, Results); 2387322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor } 238895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 238995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Look through protocols. 239095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor for (ObjCInterfaceDecl::protocol_iterator I = IFace->protocol_begin(), 239195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor E = IFace->protocol_end(); 239295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor I != E; ++I) 2393322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor AddObjCProperties(*I, AllowCategories, CurContext, Results); 239495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 239595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Look in the superclass. 239695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (IFace->getSuperClass()) 2397322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor AddObjCProperties(IFace->getSuperClass(), AllowCategories, CurContext, 2398322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Results); 239995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } else if (const ObjCCategoryDecl *Category 240095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor = dyn_cast<ObjCCategoryDecl>(Container)) { 240195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Look through protocols. 240295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor for (ObjCInterfaceDecl::protocol_iterator P = Category->protocol_begin(), 240395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor PEnd = Category->protocol_end(); 240495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor P != PEnd; ++P) 2405322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor AddObjCProperties(*P, AllowCategories, CurContext, Results); 240695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } 240795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor} 240895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 240981b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregorvoid Sema::CodeCompleteMemberReferenceExpr(Scope *S, ExprTy *BaseE, 241081b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor SourceLocation OpLoc, 241181b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor bool IsArrow) { 241281b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor if (!BaseE || !CodeCompleter) 241381b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor return; 241481b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor 241586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor typedef CodeCompleteConsumer::Result Result; 241686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 241781b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor Expr *Base = static_cast<Expr *>(BaseE); 241881b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor QualType BaseType = Base->getType(); 241986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 242086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (IsArrow) { 242186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (const PointerType *Ptr = BaseType->getAs<PointerType>()) 242286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor BaseType = Ptr->getPointeeType(); 242386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor else if (BaseType->isObjCObjectPointerType()) 242486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /*Do nothing*/ ; 242586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor else 242686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return; 242786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 242886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 2429eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor ResultBuilder Results(*this, &ResultBuilder::IsMember); 243095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor Results.EnterNewScope(); 243195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (const RecordType *Record = BaseType->getAs<RecordType>()) { 243295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Access to a C/C++ class, struct, or union. 243345bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor Results.allowNestedNameSpecifiers(); 24340cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 24350cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor LookupVisibleDecls(Record->getDecl(), LookupMemberName, Consumer); 24363a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar 243795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (getLangOptions().CPlusPlus) { 243895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (!Results.empty()) { 243995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // The "template" keyword can follow "->" or "." in the grammar. 244095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // However, we only want to suggest the template keyword if something 244195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // is dependent. 244295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor bool IsDependent = BaseType->isDependentType(); 244395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (!IsDependent) { 244495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor for (Scope *DepScope = S; DepScope; DepScope = DepScope->getParent()) 244595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (DeclContext *Ctx = (DeclContext *)DepScope->getEntity()) { 244695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor IsDependent = Ctx->isDependentContext(); 244795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor break; 244895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } 244995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } 24503a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar 245195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (IsDependent) 2452a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("template")); 245386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 245495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } 245595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } else if (!IsArrow && BaseType->getAsObjCInterfacePointerType()) { 245695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Objective-C property reference. 245795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 245895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Add property results based on our interface. 245995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor const ObjCObjectPointerType *ObjCPtr 246095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor = BaseType->getAsObjCInterfacePointerType(); 246195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor assert(ObjCPtr && "Non-NULL pointer guaranteed above!"); 2462322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor AddObjCProperties(ObjCPtr->getInterfaceDecl(), true, CurContext, Results); 246395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 246495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Add properties from the protocols in a qualified interface. 246595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor for (ObjCObjectPointerType::qual_iterator I = ObjCPtr->qual_begin(), 246695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor E = ObjCPtr->qual_end(); 246795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor I != E; ++I) 2468322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor AddObjCProperties(*I, true, CurContext, Results); 246995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } else if ((IsArrow && BaseType->isObjCObjectPointerType()) || 2470c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall (!IsArrow && BaseType->isObjCObjectType())) { 247195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Objective-C instance variable access. 247295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor ObjCInterfaceDecl *Class = 0; 247395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (const ObjCObjectPointerType *ObjCPtr 247495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor = BaseType->getAs<ObjCObjectPointerType>()) 247595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor Class = ObjCPtr->getInterfaceDecl(); 247695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor else 2477c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall Class = BaseType->getAs<ObjCObjectType>()->getInterface(); 247895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 247995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Add all ivars from this class and its superclasses. 248080f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor if (Class) { 248180f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 248280f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor Results.setFilter(&ResultBuilder::IsObjCIvar); 248380f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor LookupVisibleDecls(Class, LookupMemberName, Consumer); 248486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 248586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 248695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 248795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // FIXME: How do we cope with isa? 248895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 248995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor Results.ExitScope(); 24903a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar 24913a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar // Hand off the results found for code completion. 2492e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 2493e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext(CodeCompletionContext::CCC_MemberAccess, 2494e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor BaseType), 2495e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 249681b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor} 249781b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor 2498374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregorvoid Sema::CodeCompleteTag(Scope *S, unsigned TagSpec) { 2499374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor if (!CodeCompleter) 2500374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor return; 2501374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor 250286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor typedef CodeCompleteConsumer::Result Result; 250386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ResultBuilder::LookupFilter Filter = 0; 2504e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor enum CodeCompletionContext::Kind ContextKind 2505e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor = CodeCompletionContext::CCC_Other; 2506374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor switch ((DeclSpec::TST)TagSpec) { 2507374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor case DeclSpec::TST_enum: 250886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Filter = &ResultBuilder::IsEnum; 2509e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor ContextKind = CodeCompletionContext::CCC_EnumTag; 2510374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor break; 2511374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor 2512374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor case DeclSpec::TST_union: 251386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Filter = &ResultBuilder::IsUnion; 2514e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor ContextKind = CodeCompletionContext::CCC_UnionTag; 2515374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor break; 2516374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor 2517374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor case DeclSpec::TST_struct: 2518374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor case DeclSpec::TST_class: 251986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Filter = &ResultBuilder::IsClassOrStruct; 2520e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor ContextKind = CodeCompletionContext::CCC_ClassOrStructTag; 2521374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor break; 2522374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor 2523374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor default: 2524374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor assert(false && "Unknown type specifier kind in CodeCompleteTag"); 2525374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor return; 2526374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor } 252786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 25280d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCall ResultBuilder Results(*this); 25295d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 25300d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCall 25310d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCall // First pass: look for tags. 25320d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCall Results.setFilter(Filter); 25335d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor LookupVisibleDecls(S, LookupTagName, Consumer); 25340d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCall 25350d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCall // Second pass: look for nested name specifiers. 25360d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCall Results.setFilter(&ResultBuilder::IsNestedNameSpecifier); 25370d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCall LookupVisibleDecls(S, LookupNestedNameSpecifierName, Consumer); 253886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 2539e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, ContextKind, 2540e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 2541374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor} 2542374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor 25433e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregorvoid Sema::CodeCompleteCase(Scope *S) { 25443e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor if (getSwitchStack().empty() || !CodeCompleter) 25453e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor return; 25463e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 25473e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor SwitchStmt *Switch = getSwitchStack().back(); 2548f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor if (!Switch->getCond()->getType()->isEnumeralType()) { 2549f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor CodeCompleteExpression(S, Switch->getCond()->getType(), true); 25503e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor return; 2551f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor } 25523e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 25533e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // Code-complete the cases of a switch statement over an enumeration type 25543e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // by providing the list of 25553e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor EnumDecl *Enum = Switch->getCond()->getType()->getAs<EnumType>()->getDecl(); 25563e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 25573e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // Determine which enumerators we have already seen in the switch statement. 25583e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // FIXME: Ideally, we would also be able to look *past* the code-completion 25593e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // token, in case we are code-completing in the middle of the switch and not 25603e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // at the end. However, we aren't able to do so at the moment. 25613e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor llvm::SmallPtrSet<EnumConstantDecl *, 8> EnumeratorsSeen; 2562b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor NestedNameSpecifier *Qualifier = 0; 25633e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor for (SwitchCase *SC = Switch->getSwitchCaseList(); SC; 25643e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor SC = SC->getNextSwitchCase()) { 25653e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor CaseStmt *Case = dyn_cast<CaseStmt>(SC); 25663e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor if (!Case) 25673e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor continue; 25683e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 25693e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor Expr *CaseVal = Case->getLHS()->IgnoreParenCasts(); 25703e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(CaseVal)) 25713e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor if (EnumConstantDecl *Enumerator 25723e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor = dyn_cast<EnumConstantDecl>(DRE->getDecl())) { 25733e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // We look into the AST of the case statement to determine which 25743e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // enumerator was named. Alternatively, we could compute the value of 25753e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // the integral constant expression, then compare it against the 25763e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // values of each enumerator. However, value-based approach would not 25773e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // work as well with C++ templates where enumerators declared within a 25783e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // template are type- and value-dependent. 25793e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor EnumeratorsSeen.insert(Enumerator); 25803e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 2581b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // If this is a qualified-id, keep track of the nested-name-specifier 2582b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // so that we can reproduce it as part of code completion, e.g., 25833e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // 25843e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // switch (TagD.getKind()) { 25853e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // case TagDecl::TK_enum: 25863e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // break; 25873e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // case XXX 25883e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // 2589b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // At the XXX, our completions are TagDecl::TK_union, 25903e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // TagDecl::TK_struct, and TagDecl::TK_class, rather than TK_union, 25913e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // TK_struct, and TK_class. 2592a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor Qualifier = DRE->getQualifier(); 25933e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor } 25943e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor } 25953e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 2596b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor if (getLangOptions().CPlusPlus && !Qualifier && EnumeratorsSeen.empty()) { 2597b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // If there are no prior enumerators in C++, check whether we have to 2598b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // qualify the names of the enumerators that we suggest, because they 2599b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // may not be visible in this scope. 2600b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor Qualifier = getRequiredQualification(Context, CurContext, 2601b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor Enum->getDeclContext()); 2602b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor 2603b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // FIXME: Scoped enums need to start with "EnumDecl" as the context! 2604b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor } 2605b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor 26063e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // Add any enumerators that have not yet been mentioned. 26073e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor ResultBuilder Results(*this); 26083e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor Results.EnterNewScope(); 26093e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor for (EnumDecl::enumerator_iterator E = Enum->enumerator_begin(), 26103e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor EEnd = Enum->enumerator_end(); 26113e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor E != EEnd; ++E) { 26123e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor if (EnumeratorsSeen.count(*E)) 26133e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor continue; 26143e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 2615608300be1972c43fe99154d25d62d697e7c0a0c2Douglas Gregor Results.AddResult(CodeCompleteConsumer::Result(*E, Qualifier), 2616608300be1972c43fe99154d25d62d697e7c0a0c2Douglas Gregor CurContext, 0, false); 26173e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor } 26183e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor Results.ExitScope(); 26192f880e47ca32d007d7e9e5ff5efa05f5c3432744Douglas Gregor 26200c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor if (CodeCompleter->includeMacros()) 2621bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddMacroResults(PP, Results); 2622e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 2623e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Expression, 2624e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 26253e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor} 26263e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 26279c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregornamespace { 26289c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor struct IsBetterOverloadCandidate { 26299c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor Sema &S; 26305769d6195087229770d7ac90449443e026c47103John McCall SourceLocation Loc; 26319c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 26329c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor public: 26335769d6195087229770d7ac90449443e026c47103John McCall explicit IsBetterOverloadCandidate(Sema &S, SourceLocation Loc) 26345769d6195087229770d7ac90449443e026c47103John McCall : S(S), Loc(Loc) { } 26359c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 26369c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor bool 26379c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor operator()(const OverloadCandidate &X, const OverloadCandidate &Y) const { 26385769d6195087229770d7ac90449443e026c47103John McCall return S.isBetterOverloadCandidate(X, Y, Loc); 26399c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor } 26409c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor }; 26419c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor} 26429c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 2643d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregorstatic bool anyNullArguments(Expr **Args, unsigned NumArgs) { 2644d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor if (NumArgs && !Args) 2645d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor return true; 2646d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor 2647d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor for (unsigned I = 0; I != NumArgs; ++I) 2648d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor if (!Args[I]) 2649d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor return true; 2650d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor 2651d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor return false; 2652d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor} 2653d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor 26549c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregorvoid Sema::CodeCompleteCall(Scope *S, ExprTy *FnIn, 26559c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor ExprTy **ArgsIn, unsigned NumArgs) { 26569c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor if (!CodeCompleter) 26579c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor return; 2658ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor 2659ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor // When we're code-completing for a call, we fall back to ordinary 2660ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor // name code-completion whenever we can't produce specific 2661ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor // results. We may want to revisit this strategy in the future, 2662ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor // e.g., by merging the two kinds of results. 2663ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor 26649c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor Expr *Fn = (Expr *)FnIn; 26659c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor Expr **Args = (Expr **)ArgsIn; 2666ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor 26679c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor // Ignore type-dependent call expressions entirely. 2668d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor if (!Fn || Fn->isTypeDependent() || anyNullArguments(Args, NumArgs) || 2669ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor Expr::hasAnyTypeDependentArguments(Args, NumArgs)) { 2670e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompleteOrdinaryName(S, PCC_Expression); 26719c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor return; 2672ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor } 26739c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 26743b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall // Build an overload candidate set based on the functions we find. 26755769d6195087229770d7ac90449443e026c47103John McCall SourceLocation Loc = Fn->getExprLoc(); 26765769d6195087229770d7ac90449443e026c47103John McCall OverloadCandidateSet CandidateSet(Loc); 26773b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall 26789c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor // FIXME: What if we're calling something that isn't a function declaration? 26799c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor // FIXME: What if we're calling a pseudo-destructor? 26809c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor // FIXME: What if we're calling a member function? 26819c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 2682c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor typedef CodeCompleteConsumer::OverloadCandidate ResultCandidate; 2683c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor llvm::SmallVector<ResultCandidate, 8> Results; 2684c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor 26853b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall Expr *NakedFn = Fn->IgnoreParenCasts(); 26863b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(NakedFn)) 26873b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall AddOverloadedCallCandidates(ULE, Args, NumArgs, CandidateSet, 26883b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall /*PartialOverloading=*/ true); 26893b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall else if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(NakedFn)) { 26903b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall FunctionDecl *FDecl = dyn_cast<FunctionDecl>(DRE->getDecl()); 2691c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor if (FDecl) { 2692d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor if (!getLangOptions().CPlusPlus || 2693d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor !FDecl->getType()->getAs<FunctionProtoType>()) 2694c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor Results.push_back(ResultCandidate(FDecl)); 2695c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor else 269686820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall // FIXME: access? 26979aa472c45d2bd81b7b52c225e8acc560d716db97John McCall AddOverloadCandidate(FDecl, DeclAccessPair::make(FDecl, AS_none), 26989aa472c45d2bd81b7b52c225e8acc560d716db97John McCall Args, NumArgs, CandidateSet, 2699c27d6c58b2c1a7fecfb53c4f4016af6773a9d5baDouglas Gregor false, /*PartialOverloading*/true); 2700c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor } 27013b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall } 27029c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 27035ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor QualType ParamType; 27045ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 2705c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor if (!CandidateSet.empty()) { 2706c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor // Sort the overload candidate set by placing the best overloads first. 2707c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor std::stable_sort(CandidateSet.begin(), CandidateSet.end(), 27085769d6195087229770d7ac90449443e026c47103John McCall IsBetterOverloadCandidate(*this, Loc)); 2709c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor 2710c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor // Add the remaining viable overload candidates as code-completion reslults. 2711c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor for (OverloadCandidateSet::iterator Cand = CandidateSet.begin(), 2712c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor CandEnd = CandidateSet.end(); 2713c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor Cand != CandEnd; ++Cand) { 2714c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor if (Cand->Viable) 2715c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor Results.push_back(ResultCandidate(Cand->Function)); 2716c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor } 27175ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 27185ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor // From the viable candidates, try to determine the type of this parameter. 27195ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor for (unsigned I = 0, N = Results.size(); I != N; ++I) { 27205ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (const FunctionType *FType = Results[I].getFunctionType()) 27215ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (const FunctionProtoType *Proto = dyn_cast<FunctionProtoType>(FType)) 27225ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (NumArgs < Proto->getNumArgs()) { 27235ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (ParamType.isNull()) 27245ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor ParamType = Proto->getArgType(NumArgs); 27255ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor else if (!Context.hasSameUnqualifiedType( 27265ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor ParamType.getNonReferenceType(), 27275ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor Proto->getArgType(NumArgs).getNonReferenceType())) { 27285ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor ParamType = QualType(); 27295ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor break; 27305ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor } 27315ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor } 27325ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor } 27335ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor } else { 27345ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor // Try to determine the parameter type from the type of the expression 27355ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor // being called. 27365ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor QualType FunctionType = Fn->getType(); 27375ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (const PointerType *Ptr = FunctionType->getAs<PointerType>()) 27385ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor FunctionType = Ptr->getPointeeType(); 27395ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor else if (const BlockPointerType *BlockPtr 27405ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor = FunctionType->getAs<BlockPointerType>()) 27415ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor FunctionType = BlockPtr->getPointeeType(); 27425ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor else if (const MemberPointerType *MemPtr 27435ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor = FunctionType->getAs<MemberPointerType>()) 27445ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor FunctionType = MemPtr->getPointeeType(); 27455ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 27465ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (const FunctionProtoType *Proto 27475ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor = FunctionType->getAs<FunctionProtoType>()) { 27485ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (NumArgs < Proto->getNumArgs()) 27495ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor ParamType = Proto->getArgType(NumArgs); 27505ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor } 27519c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor } 2752ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor 27535ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (ParamType.isNull()) 2754e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompleteOrdinaryName(S, PCC_Expression); 27555ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor else 27565ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor CodeCompleteExpression(S, ParamType); 27575ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 27582e4c7a5865739709a310d847da34096aa402d183Douglas Gregor if (!Results.empty()) 2759ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor CodeCompleter->ProcessOverloadCandidates(*this, NumArgs, Results.data(), 2760ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor Results.size()); 27619c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor} 27629c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 27635ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregorvoid Sema::CodeCompleteInitializer(Scope *S, DeclPtrTy D) { 27645ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor ValueDecl *VD = dyn_cast_or_null<ValueDecl>(D.getAs<Decl>()); 27655ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (!VD) { 2766e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompleteOrdinaryName(S, PCC_Expression); 27675ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor return; 27685ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor } 27695ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 27705ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor CodeCompleteExpression(S, VD->getType()); 27715ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor} 27725ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 27735ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregorvoid Sema::CodeCompleteReturn(Scope *S) { 27745ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor QualType ResultType; 27755ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (isa<BlockDecl>(CurContext)) { 27765ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (BlockScopeInfo *BSI = getCurBlock()) 27775ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor ResultType = BSI->ReturnType; 27785ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor } else if (FunctionDecl *Function = dyn_cast<FunctionDecl>(CurContext)) 27795ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor ResultType = Function->getResultType(); 27805ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor else if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(CurContext)) 27815ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor ResultType = Method->getResultType(); 27825ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 27835ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (ResultType.isNull()) 2784e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompleteOrdinaryName(S, PCC_Expression); 27855ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor else 27865ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor CodeCompleteExpression(S, ResultType); 27875ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor} 27885ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 27895ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregorvoid Sema::CodeCompleteAssignmentRHS(Scope *S, ExprTy *LHS) { 27905ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (LHS) 27915ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor CodeCompleteExpression(S, static_cast<Expr *>(LHS)->getType()); 27925ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor else 2793e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompleteOrdinaryName(S, PCC_Expression); 27945ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor} 27955ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 27969ab14541716928894821cf5d53d6b4c95ffdf3a3Jeffrey Yasskinvoid Sema::CodeCompleteQualifiedId(Scope *S, CXXScopeSpec &SS, 279781b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor bool EnteringContext) { 279881b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor if (!SS.getScopeRep() || !CodeCompleter) 279981b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor return; 280081b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor 280186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor DeclContext *Ctx = computeDeclContext(SS, EnteringContext); 280286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!Ctx) 280386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return; 2804d1cd31aeb806077340be94e32429f3192cf139b0Douglas Gregor 2805d1cd31aeb806077340be94e32429f3192cf139b0Douglas Gregor // Try to instantiate any non-dependent declaration contexts before 2806d1cd31aeb806077340be94e32429f3192cf139b0Douglas Gregor // we look in them. 280777bb1aa78bcd26e42c0382043e65a2b03242be4dJohn McCall if (!isDependentScopeSpecifier(SS) && RequireCompleteDeclContext(SS, Ctx)) 2808d1cd31aeb806077340be94e32429f3192cf139b0Douglas Gregor return; 2809d1cd31aeb806077340be94e32429f3192cf139b0Douglas Gregor 281086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ResultBuilder Results(*this); 2811def9107059d460ada5f0eb3d58189c59122e3c3fDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 2812def9107059d460ada5f0eb3d58189c59122e3c3fDouglas Gregor LookupVisibleDecls(Ctx, LookupOrdinaryName, Consumer); 281386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 281486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // The "template" keyword can follow "::" in the grammar, but only 281586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // put it into the grammar if the nested-name-specifier is dependent. 281686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NestedNameSpecifier *NNS = (NestedNameSpecifier *)SS.getScopeRep(); 281786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!Results.empty() && NNS->isDependent()) 2818a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult("template"); 281986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 2820e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 2821e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 2822e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 282381b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor} 282449f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 282549f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregorvoid Sema::CodeCompleteUsing(Scope *S) { 282649f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor if (!CodeCompleter) 282749f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor return; 282849f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 282986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ResultBuilder Results(*this, &ResultBuilder::IsNestedNameSpecifier); 28308e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.EnterNewScope(); 283186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 283286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // If we aren't in class scope, we could see the "namespace" keyword. 283386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!S->isClassScope()) 2834a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(CodeCompleteConsumer::Result("namespace")); 283586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 283686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // After "using", we can see anything that would start a 283786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // nested-name-specifier. 28385d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 28395d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer); 28408e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.ExitScope(); 284186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 2842e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 2843e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 2844e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 284549f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor} 284649f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 284749f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregorvoid Sema::CodeCompleteUsingDirective(Scope *S) { 284849f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor if (!CodeCompleter) 284949f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor return; 285049f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 285186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // After "using namespace", we expect to see a namespace name or namespace 285286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // alias. 285386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ResultBuilder Results(*this, &ResultBuilder::IsNamespaceOrAlias); 28548e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.EnterNewScope(); 28555d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 28565d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer); 28578e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.ExitScope(); 2858e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 2859e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 2860e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 286149f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor} 286249f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 286349f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregorvoid Sema::CodeCompleteNamespaceDecl(Scope *S) { 286449f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor if (!CodeCompleter) 286549f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor return; 286649f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 286786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ResultBuilder Results(*this, &ResultBuilder::IsNamespace); 286886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor DeclContext *Ctx = (DeclContext *)S->getEntity(); 286986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!S->getParent()) 287086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Ctx = Context.getTranslationUnitDecl(); 287186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 287286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (Ctx && Ctx->isFileContext()) { 287386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // We only want to see those namespaces that have already been defined 287486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // within this scope, because its likely that the user is creating an 287586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // extended namespace declaration. Keep track of the most recent 287686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // definition of each namespace. 287786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor std::map<NamespaceDecl *, NamespaceDecl *> OrigToLatest; 287886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor for (DeclContext::specific_decl_iterator<NamespaceDecl> 287986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NS(Ctx->decls_begin()), NSEnd(Ctx->decls_end()); 288086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NS != NSEnd; ++NS) 288186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor OrigToLatest[NS->getOriginalNamespace()] = *NS; 288286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 288386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add the most recent definition (or extended definition) of each 288486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // namespace to the list of results. 28858e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.EnterNewScope(); 288686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor for (std::map<NamespaceDecl *, NamespaceDecl *>::iterator 288786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NS = OrigToLatest.begin(), NSEnd = OrigToLatest.end(); 288886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NS != NSEnd; ++NS) 2889608300be1972c43fe99154d25d62d697e7c0a0c2Douglas Gregor Results.AddResult(CodeCompleteConsumer::Result(NS->second, 0), 2890608300be1972c43fe99154d25d62d697e7c0a0c2Douglas Gregor CurContext, 0, false); 28918e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.ExitScope(); 289286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 289386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 2894e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 2895e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 2896e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 289749f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor} 289849f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 289949f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregorvoid Sema::CodeCompleteNamespaceAliasDecl(Scope *S) { 290049f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor if (!CodeCompleter) 290149f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor return; 290249f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 290386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // After "namespace", we expect to see a namespace or alias. 290486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ResultBuilder Results(*this, &ResultBuilder::IsNamespaceOrAlias); 29055d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 29065d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer); 2907e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 2908e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 2909e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 291049f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor} 291149f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 2912ed8d322b4086b8b1e1f78b21389cabb23457dcb3Douglas Gregorvoid Sema::CodeCompleteOperatorName(Scope *S) { 2913ed8d322b4086b8b1e1f78b21389cabb23457dcb3Douglas Gregor if (!CodeCompleter) 2914ed8d322b4086b8b1e1f78b21389cabb23457dcb3Douglas Gregor return; 291586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 291686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor typedef CodeCompleteConsumer::Result Result; 291786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ResultBuilder Results(*this, &ResultBuilder::IsType); 29188e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.EnterNewScope(); 291986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 292086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add the names of overloadable operators. 292186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 292286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (std::strcmp(Spelling, "?")) \ 2923a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Spelling)); 292486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor#include "clang/Basic/OperatorKinds.def" 292586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 292686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add any type names visible from the current scope 292745bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor Results.allowNestedNameSpecifiers(); 29285d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 29295d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer); 293086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 293186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add any type specifiers 2932bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddTypeSpecifierResults(getLangOptions(), Results); 29338e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.ExitScope(); 2934ed8d322b4086b8b1e1f78b21389cabb23457dcb3Douglas Gregor 2935e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 2936e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 2937e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 2938c464ae8444edb6d07ea49b7a0eae1674c0fa1bb8Douglas Gregor} 2939c464ae8444edb6d07ea49b7a0eae1674c0fa1bb8Douglas Gregor 2940b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor// Macro that expands to @Keyword or Keyword, depending on whether NeedAt is 2941b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor// true or false. 2942b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor#define OBJC_AT_KEYWORD_NAME(NeedAt,Keyword) NeedAt? "@" #Keyword : #Keyword 2943bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCImplementationResults(const LangOptions &LangOpts, 2944b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor ResultBuilder &Results, 2945b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor bool NeedAt) { 2946c464ae8444edb6d07ea49b7a0eae1674c0fa1bb8Douglas Gregor typedef CodeCompleteConsumer::Result Result; 2947b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // Since we have an implementation, we can end it. 2948a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,end))); 2949b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 2950b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor CodeCompletionString *Pattern = 0; 2951b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor if (LangOpts.ObjC2) { 2952b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @dynamic 2953c464ae8444edb6d07ea49b7a0eae1674c0fa1bb8Douglas Gregor Pattern = new CodeCompletionString; 2954b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,dynamic)); 2955834389b87451b24618513b907b4dfb5b00d211f3Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 2956b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddPlaceholderChunk("property"); 2957a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 2958b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 2959b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @synthesize 2960c464ae8444edb6d07ea49b7a0eae1674c0fa1bb8Douglas Gregor Pattern = new CodeCompletionString; 2961b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,synthesize)); 2962834389b87451b24618513b907b4dfb5b00d211f3Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 2963b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddPlaceholderChunk("property"); 2964a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 2965b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor } 2966b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor} 2967c464ae8444edb6d07ea49b7a0eae1674c0fa1bb8Douglas Gregor 2968bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCInterfaceResults(const LangOptions &LangOpts, 2969b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor ResultBuilder &Results, 2970b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor bool NeedAt) { 2971b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor typedef CodeCompleteConsumer::Result Result; 2972b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 2973b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // Since we have an interface or protocol, we can end it. 2974a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,end))); 2975b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 2976b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor if (LangOpts.ObjC2) { 2977b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @property 2978a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,property))); 2979b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 2980b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @required 2981a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,required))); 2982b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 2983b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @optional 2984a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,optional))); 2985b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor } 2986b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor} 2987834389b87451b24618513b907b4dfb5b00d211f3Douglas Gregor 2988bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCTopLevelResults(ResultBuilder &Results, bool NeedAt) { 2989b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor typedef CodeCompleteConsumer::Result Result; 2990b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor CodeCompletionString *Pattern = 0; 2991b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 2992b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @class name ; 2993b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern = new CodeCompletionString; 2994b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,class)); 2995b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 2996c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("name"); 2997a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 2998b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 2999c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor if (Results.includeCodePatterns()) { 3000c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // @interface name 3001c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // FIXME: Could introduce the whole pattern, including superclasses and 3002c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // such. 3003c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern = new CodeCompletionString; 3004c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,interface)); 3005c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 3006c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("class"); 3007c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Results.AddResult(Result(Pattern)); 3008b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 3009c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // @protocol name 3010c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern = new CodeCompletionString; 3011c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,protocol)); 3012c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 3013c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("protocol"); 3014c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Results.AddResult(Result(Pattern)); 3015c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor 3016c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // @implementation name 3017c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern = new CodeCompletionString; 3018c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,implementation)); 3019c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 3020c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("class"); 3021c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Results.AddResult(Result(Pattern)); 3022c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor } 3023b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 3024b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @compatibility_alias name 3025b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern = new CodeCompletionString; 3026b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,compatibility_alias)); 3027b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 3028b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddPlaceholderChunk("alias"); 3029b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 3030b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddPlaceholderChunk("class"); 3031a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 3032b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor} 3033834389b87451b24618513b907b4dfb5b00d211f3Douglas Gregor 3034b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregorvoid Sema::CodeCompleteObjCAtDirective(Scope *S, DeclPtrTy ObjCImpDecl, 3035b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor bool InInterface) { 3036b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor typedef CodeCompleteConsumer::Result Result; 3037b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor ResultBuilder Results(*this); 3038b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Results.EnterNewScope(); 3039b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor if (ObjCImpDecl) 3040bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCImplementationResults(getLangOptions(), Results, false); 3041b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor else if (InInterface) 3042bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCInterfaceResults(getLangOptions(), Results, false); 3043b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor else 3044bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCTopLevelResults(Results, false); 3045c464ae8444edb6d07ea49b7a0eae1674c0fa1bb8Douglas Gregor Results.ExitScope(); 3046e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 3047e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 3048e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 30499a0c85e640a08174569a303db22981612f05d385Douglas Gregor} 30509a0c85e640a08174569a303db22981612f05d385Douglas Gregor 3051bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCExpressionResults(ResultBuilder &Results, bool NeedAt) { 30529a0c85e640a08174569a303db22981612f05d385Douglas Gregor typedef CodeCompleteConsumer::Result Result; 30539a0c85e640a08174569a303db22981612f05d385Douglas Gregor CodeCompletionString *Pattern = 0; 30549a0c85e640a08174569a303db22981612f05d385Douglas Gregor 30559a0c85e640a08174569a303db22981612f05d385Douglas Gregor // @encode ( type-name ) 30569a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern = new CodeCompletionString; 3057b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,encode)); 30589a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 30599a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddPlaceholderChunk("type-name"); 30609a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 3061a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 30629a0c85e640a08174569a303db22981612f05d385Douglas Gregor 30639a0c85e640a08174569a303db22981612f05d385Douglas Gregor // @protocol ( protocol-name ) 30649a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern = new CodeCompletionString; 3065b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,protocol)); 30669a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 30679a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddPlaceholderChunk("protocol-name"); 30689a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 3069a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 30709a0c85e640a08174569a303db22981612f05d385Douglas Gregor 30719a0c85e640a08174569a303db22981612f05d385Douglas Gregor // @selector ( selector ) 30729a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern = new CodeCompletionString; 3073b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,selector)); 30749a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 30759a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddPlaceholderChunk("selector"); 30769a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 3077a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 30789a0c85e640a08174569a303db22981612f05d385Douglas Gregor} 30799a0c85e640a08174569a303db22981612f05d385Douglas Gregor 3080bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCStatementResults(ResultBuilder &Results, bool NeedAt) { 30819a0c85e640a08174569a303db22981612f05d385Douglas Gregor typedef CodeCompleteConsumer::Result Result; 30829a0c85e640a08174569a303db22981612f05d385Douglas Gregor CodeCompletionString *Pattern = 0; 3083b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 3084c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor if (Results.includeCodePatterns()) { 3085c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // @try { statements } @catch ( declaration ) { statements } @finally 3086c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // { statements } 3087c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern = new CodeCompletionString; 3088c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,try)); 3089c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftBrace); 3090c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("statements"); 3091c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightBrace); 3092c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddTextChunk("@catch"); 3093c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 3094c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("parameter"); 3095c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 3096c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftBrace); 3097c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("statements"); 3098c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightBrace); 3099c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddTextChunk("@finally"); 3100c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftBrace); 3101c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("statements"); 3102c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightBrace); 3103c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Results.AddResult(Result(Pattern)); 3104c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor } 3105b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 31069a0c85e640a08174569a303db22981612f05d385Douglas Gregor // @throw 31079a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern = new CodeCompletionString; 3108b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,throw)); 3109834389b87451b24618513b907b4dfb5b00d211f3Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 31109a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddPlaceholderChunk("expression"); 3111a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 3112b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 3113c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor if (Results.includeCodePatterns()) { 3114c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // @synchronized ( expression ) { statements } 3115c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern = new CodeCompletionString; 3116c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,synchronized)); 3117c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 3118c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 3119c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("expression"); 3120c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 3121c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftBrace); 3122c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("statements"); 3123c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightBrace); 3124c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Results.AddResult(Result(Pattern)); 3125c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor } 3126b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor} 31279a0c85e640a08174569a303db22981612f05d385Douglas Gregor 3128bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCVisibilityResults(const LangOptions &LangOpts, 3129c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor ResultBuilder &Results, 3130c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor bool NeedAt) { 3131b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor typedef CodeCompleteConsumer::Result Result; 3132a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,private))); 3133a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,protected))); 3134a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,public))); 3135c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor if (LangOpts.ObjC2) 3136a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,package))); 3137c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor} 3138c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor 3139c38c3e1e726630458154534227d74eda833d26a0Douglas Gregorvoid Sema::CodeCompleteObjCAtVisibility(Scope *S) { 3140c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor ResultBuilder Results(*this); 3141c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor Results.EnterNewScope(); 3142bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCVisibilityResults(getLangOptions(), Results, false); 3143c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor Results.ExitScope(); 3144e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 3145e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 3146e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 3147c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor} 3148c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor 3149c38c3e1e726630458154534227d74eda833d26a0Douglas Gregorvoid Sema::CodeCompleteObjCAtStatement(Scope *S) { 3150b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor ResultBuilder Results(*this); 3151b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Results.EnterNewScope(); 3152bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCStatementResults(Results, false); 3153bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCExpressionResults(Results, false); 31549a0c85e640a08174569a303db22981612f05d385Douglas Gregor Results.ExitScope(); 3155e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 3156e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 3157e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 31589a0c85e640a08174569a303db22981612f05d385Douglas Gregor} 31599a0c85e640a08174569a303db22981612f05d385Douglas Gregor 31609a0c85e640a08174569a303db22981612f05d385Douglas Gregorvoid Sema::CodeCompleteObjCAtExpression(Scope *S) { 31619a0c85e640a08174569a303db22981612f05d385Douglas Gregor ResultBuilder Results(*this); 31629a0c85e640a08174569a303db22981612f05d385Douglas Gregor Results.EnterNewScope(); 3163bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCExpressionResults(Results, false); 31649a0c85e640a08174569a303db22981612f05d385Douglas Gregor Results.ExitScope(); 3165e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 3166e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 3167e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 3168ed8d322b4086b8b1e1f78b21389cabb23457dcb3Douglas Gregor} 316949f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 3170988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor/// \brief Determine whether the addition of the given flag to an Objective-C 3171988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor/// property's attributes will cause a conflict. 3172988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregorstatic bool ObjCPropertyFlagConflicts(unsigned Attributes, unsigned NewFlag) { 3173988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor // Check if we've already added this flag. 3174988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (Attributes & NewFlag) 3175988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor return true; 3176988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor 3177988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor Attributes |= NewFlag; 3178988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor 3179988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor // Check for collisions with "readonly". 3180988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if ((Attributes & ObjCDeclSpec::DQ_PR_readonly) && 3181988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor (Attributes & (ObjCDeclSpec::DQ_PR_readwrite | 3182988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor ObjCDeclSpec::DQ_PR_assign | 3183988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor ObjCDeclSpec::DQ_PR_copy | 3184988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor ObjCDeclSpec::DQ_PR_retain))) 3185988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor return true; 3186988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor 3187988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor // Check for more than one of { assign, copy, retain }. 3188988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor unsigned AssignCopyRetMask = Attributes & (ObjCDeclSpec::DQ_PR_assign | 3189988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor ObjCDeclSpec::DQ_PR_copy | 3190988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor ObjCDeclSpec::DQ_PR_retain); 3191988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (AssignCopyRetMask && 3192988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor AssignCopyRetMask != ObjCDeclSpec::DQ_PR_assign && 3193988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor AssignCopyRetMask != ObjCDeclSpec::DQ_PR_copy && 3194988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor AssignCopyRetMask != ObjCDeclSpec::DQ_PR_retain) 3195988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor return true; 3196988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor 3197988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor return false; 3198988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor} 3199988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor 3200a93b108e025ef2480fa867cc533e7781a40a639bDouglas Gregorvoid Sema::CodeCompleteObjCPropertyFlags(Scope *S, ObjCDeclSpec &ODS) { 3201ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff if (!CodeCompleter) 3202ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff return; 3203d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor 3204ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff unsigned Attributes = ODS.getPropertyAttributes(); 3205ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff 3206ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff typedef CodeCompleteConsumer::Result Result; 3207ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff ResultBuilder Results(*this); 3208ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff Results.EnterNewScope(); 3209988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_readonly)) 3210a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(CodeCompleteConsumer::Result("readonly")); 3211988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_assign)) 3212a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(CodeCompleteConsumer::Result("assign")); 3213988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_readwrite)) 3214a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(CodeCompleteConsumer::Result("readwrite")); 3215988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_retain)) 3216a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(CodeCompleteConsumer::Result("retain")); 3217988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_copy)) 3218a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(CodeCompleteConsumer::Result("copy")); 3219988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_nonatomic)) 3220a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(CodeCompleteConsumer::Result("nonatomic")); 3221988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_setter)) { 322254f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor CodeCompletionString *Setter = new CodeCompletionString; 322354f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor Setter->AddTypedTextChunk("setter"); 322454f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor Setter->AddTextChunk(" = "); 322554f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor Setter->AddPlaceholderChunk("method"); 3226a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(CodeCompleteConsumer::Result(Setter)); 322754f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor } 3228988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_getter)) { 322954f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor CodeCompletionString *Getter = new CodeCompletionString; 323054f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor Getter->AddTypedTextChunk("getter"); 323154f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor Getter->AddTextChunk(" = "); 323254f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor Getter->AddPlaceholderChunk("method"); 3233a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(CodeCompleteConsumer::Result(Getter)); 323454f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor } 3235ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff Results.ExitScope(); 3236e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 3237e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 3238e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 3239ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff} 3240c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff 32414ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor/// \brief Descripts the kind of Objective-C method that we want to find 32424ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor/// via code completion. 32434ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregorenum ObjCMethodKind { 32444ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor MK_Any, //< Any kind of method, provided it means other specified criteria. 32454ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor MK_ZeroArgSelector, //< Zero-argument (unary) selector. 32464ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor MK_OneArgSelector //< One-argument selector. 32474ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor}; 32484ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 32494ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregorstatic bool isAcceptableObjCMethod(ObjCMethodDecl *Method, 32504ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor ObjCMethodKind WantKind, 32514ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor IdentifierInfo **SelIdents, 32524ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor unsigned NumSelIdents) { 32534ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Selector Sel = Method->getSelector(); 32544ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (NumSelIdents > Sel.getNumArgs()) 32554ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor return false; 32564ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 32574ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor switch (WantKind) { 32584ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor case MK_Any: break; 32594ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor case MK_ZeroArgSelector: return Sel.isUnarySelector(); 32604ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor case MK_OneArgSelector: return Sel.getNumArgs() == 1; 32614ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor } 32624ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 32634ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor for (unsigned I = 0; I != NumSelIdents; ++I) 32644ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (SelIdents[I] != Sel.getIdentifierInfoForSlot(I)) 32654ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor return false; 32664ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 32674ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor return true; 32684ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor} 32694ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 327036ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// \brief Add all of the Objective-C methods in the given Objective-C 327136ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// container to the set of results. 327236ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// 327336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// The container will be a class, protocol, category, or implementation of 327436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// any of the above. This mether will recurse to include methods from 327536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// the superclasses of classes along with their categories, protocols, and 327636ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// implementations. 327736ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// 327836ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// \param Container the container in which we'll look to find methods. 327936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// 328036ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// \param WantInstance whether to add instance methods (only); if false, this 328136ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// routine will add factory methods (only). 328236ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// 328336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// \param CurContext the context in which we're performing the lookup that 328436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// finds methods. 328536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// 328636ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// \param Results the structure into which we'll add results. 328736ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregorstatic void AddObjCMethods(ObjCContainerDecl *Container, 328836ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor bool WantInstanceMethods, 32894ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor ObjCMethodKind WantKind, 3290d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor IdentifierInfo **SelIdents, 3291d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor unsigned NumSelIdents, 329236ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor DeclContext *CurContext, 329336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor ResultBuilder &Results) { 329436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor typedef CodeCompleteConsumer::Result Result; 329536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor for (ObjCContainerDecl::method_iterator M = Container->meth_begin(), 329636ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor MEnd = Container->meth_end(); 329736ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor M != MEnd; ++M) { 3298d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor if ((*M)->isInstanceMethod() == WantInstanceMethods) { 3299d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor // Check whether the selector identifiers we've been given are a 3300d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor // subset of the identifiers for this particular method. 33014ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (!isAcceptableObjCMethod(*M, WantKind, SelIdents, NumSelIdents)) 3302d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor continue; 33034ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 3304d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor Result R = Result(*M, 0); 3305d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor R.StartParameter = NumSelIdents; 33064ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor R.AllParametersAreInformative = (WantKind != MK_Any); 3307d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor Results.MaybeAddResult(R, CurContext); 3308d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor } 330936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor } 331036ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 331136ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container); 331236ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor if (!IFace) 331336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor return; 331436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 331536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add methods in protocols. 331636ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor const ObjCList<ObjCProtocolDecl> &Protocols= IFace->getReferencedProtocols(); 331736ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 331836ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor E = Protocols.end(); 331936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor I != E; ++I) 33204ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents, NumSelIdents, 3321d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor CurContext, Results); 332236ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 332336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add methods in categories. 332436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor for (ObjCCategoryDecl *CatDecl = IFace->getCategoryList(); CatDecl; 332536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor CatDecl = CatDecl->getNextClassCategory()) { 33264ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(CatDecl, WantInstanceMethods, WantKind, SelIdents, 33274ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor NumSelIdents, CurContext, Results); 332836ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 332936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add a categories protocol methods. 333036ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor const ObjCList<ObjCProtocolDecl> &Protocols 333136ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor = CatDecl->getReferencedProtocols(); 333236ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 333336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor E = Protocols.end(); 333436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor I != E; ++I) 33354ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents, 33364ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor NumSelIdents, CurContext, Results); 333736ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 333836ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add methods in category implementations. 333936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor if (ObjCCategoryImplDecl *Impl = CatDecl->getImplementation()) 33404ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(Impl, WantInstanceMethods, WantKind, SelIdents, 33414ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor NumSelIdents, CurContext, Results); 334236ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor } 334336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 334436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add methods in superclass. 334536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor if (IFace->getSuperClass()) 33464ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(IFace->getSuperClass(), WantInstanceMethods, WantKind, 33474ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor SelIdents, NumSelIdents, CurContext, Results); 334836ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 334936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add methods in our implementation, if any. 335036ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor if (ObjCImplementationDecl *Impl = IFace->getImplementation()) 33514ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(Impl, WantInstanceMethods, WantKind, SelIdents, 33524ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor NumSelIdents, CurContext, Results); 33534ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor} 33544ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 33554ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 33564ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregorvoid Sema::CodeCompleteObjCPropertyGetter(Scope *S, DeclPtrTy ClassDecl, 33574ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor DeclPtrTy *Methods, 33584ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor unsigned NumMethods) { 33594ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor typedef CodeCompleteConsumer::Result Result; 33604ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 33614ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor // Try to find the interface where getters might live. 33624ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor ObjCInterfaceDecl *Class 33634ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor = dyn_cast_or_null<ObjCInterfaceDecl>(ClassDecl.getAs<Decl>()); 33644ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (!Class) { 33654ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (ObjCCategoryDecl *Category 33664ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor = dyn_cast_or_null<ObjCCategoryDecl>(ClassDecl.getAs<Decl>())) 33674ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Class = Category->getClassInterface(); 33684ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 33694ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (!Class) 33704ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor return; 33714ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor } 33724ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 33734ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor // Find all of the potential getters. 33744ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor ResultBuilder Results(*this); 33754ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Results.EnterNewScope(); 33764ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 33774ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor // FIXME: We need to do this because Objective-C methods don't get 33784ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor // pushed into DeclContexts early enough. Argh! 33794ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor for (unsigned I = 0; I != NumMethods; ++I) { 33804ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (ObjCMethodDecl *Method 33814ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor = dyn_cast_or_null<ObjCMethodDecl>(Methods[I].getAs<Decl>())) 33824ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (Method->isInstanceMethod() && 33834ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor isAcceptableObjCMethod(Method, MK_ZeroArgSelector, 0, 0)) { 33844ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Result R = Result(Method, 0); 33854ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor R.AllParametersAreInformative = true; 33864ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Results.MaybeAddResult(R, CurContext); 33874ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor } 33884ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor } 33894ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 33904ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(Class, true, MK_ZeroArgSelector, 0, 0, CurContext, Results); 33914ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Results.ExitScope(); 3392e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 3393e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 3394e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 33954ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor} 33964ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 33974ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregorvoid Sema::CodeCompleteObjCPropertySetter(Scope *S, DeclPtrTy ObjCImplDecl, 33984ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor DeclPtrTy *Methods, 33994ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor unsigned NumMethods) { 34004ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor typedef CodeCompleteConsumer::Result Result; 34014ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 34024ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor // Try to find the interface where setters might live. 34034ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor ObjCInterfaceDecl *Class 34044ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor = dyn_cast_or_null<ObjCInterfaceDecl>(ObjCImplDecl.getAs<Decl>()); 34054ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (!Class) { 34064ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (ObjCCategoryDecl *Category 34074ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor = dyn_cast_or_null<ObjCCategoryDecl>(ObjCImplDecl.getAs<Decl>())) 34084ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Class = Category->getClassInterface(); 34094ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 34104ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (!Class) 34114ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor return; 34124ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor } 34134ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 34144ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor // Find all of the potential getters. 34154ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor ResultBuilder Results(*this); 34164ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Results.EnterNewScope(); 34174ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 34184ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor // FIXME: We need to do this because Objective-C methods don't get 34194ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor // pushed into DeclContexts early enough. Argh! 34204ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor for (unsigned I = 0; I != NumMethods; ++I) { 34214ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (ObjCMethodDecl *Method 34224ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor = dyn_cast_or_null<ObjCMethodDecl>(Methods[I].getAs<Decl>())) 34234ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (Method->isInstanceMethod() && 34244ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor isAcceptableObjCMethod(Method, MK_OneArgSelector, 0, 0)) { 34254ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Result R = Result(Method, 0); 34264ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor R.AllParametersAreInformative = true; 34274ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Results.MaybeAddResult(R, CurContext); 34284ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor } 34294ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor } 34304ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 34314ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(Class, true, MK_OneArgSelector, 0, 0, CurContext, Results); 34324ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 34334ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Results.ExitScope(); 3434e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 3435e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 3436e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 343736ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor} 343836ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 343922f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor/// \brief When we have an expression with type "id", we may assume 344022f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor/// that it has some more-specific class type based on knowledge of 344122f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor/// common uses of Objective-C. This routine returns that class type, 344222f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor/// or NULL if no better result could be determined. 344322f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregorstatic ObjCInterfaceDecl *GetAssumedMessageSendExprType(Expr *E) { 344422f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor ObjCMessageExpr *Msg = dyn_cast<ObjCMessageExpr>(E); 344522f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor if (!Msg) 344622f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor return 0; 344722f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor 344822f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor Selector Sel = Msg->getSelector(); 344922f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor if (Sel.isNull()) 345022f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor return 0; 345122f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor 345222f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor IdentifierInfo *Id = Sel.getIdentifierInfoForSlot(0); 345322f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor if (!Id) 345422f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor return 0; 345522f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor 345622f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor ObjCMethodDecl *Method = Msg->getMethodDecl(); 345722f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor if (!Method) 345822f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor return 0; 345922f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor 346022f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor // Determine the class that we're sending the message to. 346104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor ObjCInterfaceDecl *IFace = 0; 346204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor switch (Msg->getReceiverKind()) { 346304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor case ObjCMessageExpr::Class: 3464c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (const ObjCObjectType *ObjType 3465c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall = Msg->getClassReceiver()->getAs<ObjCObjectType>()) 3466c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall IFace = ObjType->getInterface(); 346704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor break; 346804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor 346904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor case ObjCMessageExpr::Instance: { 347004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor QualType T = Msg->getInstanceReceiver()->getType(); 347104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor if (const ObjCObjectPointerType *Ptr = T->getAs<ObjCObjectPointerType>()) 347204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor IFace = Ptr->getInterfaceDecl(); 347304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor break; 347404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor } 347504badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor 347604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor case ObjCMessageExpr::SuperInstance: 347704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor case ObjCMessageExpr::SuperClass: 347804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor break; 347922f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor } 348022f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor 348122f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor if (!IFace) 348222f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor return 0; 348322f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor 348422f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor ObjCInterfaceDecl *Super = IFace->getSuperClass(); 348522f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor if (Method->isInstanceMethod()) 348622f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor return llvm::StringSwitch<ObjCInterfaceDecl *>(Id->getName()) 348722f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("retain", IFace) 348822f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("autorelease", IFace) 348922f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("copy", IFace) 349022f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("copyWithZone", IFace) 349122f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("mutableCopy", IFace) 349222f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("mutableCopyWithZone", IFace) 349322f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("awakeFromCoder", IFace) 349422f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("replacementObjectFromCoder", IFace) 349522f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("class", IFace) 349622f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("classForCoder", IFace) 349722f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("superclass", Super) 349822f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Default(0); 349922f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor 350022f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor return llvm::StringSwitch<ObjCInterfaceDecl *>(Id->getName()) 350122f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("new", IFace) 350222f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("alloc", IFace) 350322f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("allocWithZone", IFace) 350422f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("class", IFace) 350522f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("superclass", Super) 350622f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Default(0); 350722f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor} 350822f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor 35098e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregorvoid Sema::CodeCompleteObjCMessageReceiver(Scope *S) { 35108e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor typedef CodeCompleteConsumer::Result Result; 35118e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor ResultBuilder Results(*this); 35128e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 35138e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor // Find anything that looks like it could be a message receiver. 35148e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor Results.setFilter(&ResultBuilder::IsObjCMessageReceiver); 35158e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 35168e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor Results.EnterNewScope(); 35178e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer); 35188e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 35198e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor // If we are in an Objective-C method inside a class that has a superclass, 35208e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor // add "super" as an option. 35218e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor if (ObjCMethodDecl *Method = getCurMethodDecl()) 35228e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor if (ObjCInterfaceDecl *Iface = Method->getClassInterface()) 35238e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor if (Iface->getSuperClass()) 35248e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor Results.AddResult(Result("super")); 35258e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 35268e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor Results.ExitScope(); 35278e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 35288e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor if (CodeCompleter->includeMacros()) 35298e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor AddMacroResults(PP, Results); 3530e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 3531e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_ObjCMessageReceiver, 3532e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(), Results.size()); 35338e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 35348e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor} 35358e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 35362725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregorvoid Sema::CodeCompleteObjCSuperMessage(Scope *S, SourceLocation SuperLoc, 3537d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor IdentifierInfo **SelIdents, 3538d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor unsigned NumSelIdents) { 353924a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor ObjCInterfaceDecl *CDecl = 0; 35402725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) { 35412725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // Figure out which interface we're in. 35422725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor CDecl = CurMethod->getClassInterface(); 35432725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (!CDecl) 35442725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor return; 35452725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor 35462725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // Find the superclass of this class. 35472725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor CDecl = CDecl->getSuperClass(); 35482725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (!CDecl) 35492725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor return; 355024a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor 35512725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (CurMethod->isInstanceMethod()) { 35522725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // We are inside an instance method, which means that the message 35532725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // send [super ...] is actually calling an instance method on the 35542725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // current object. Build the super expression and handle this like 35552725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // an instance method. 35562725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor QualType SuperTy = Context.getObjCInterfaceType(CDecl); 35572725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor SuperTy = Context.getObjCObjectPointerType(SuperTy); 35582725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor OwningExprResult Super 35592725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor = Owned(new (Context) ObjCSuperExpr(SuperLoc, SuperTy)); 35602725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor return CodeCompleteObjCInstanceMessage(S, (Expr *)Super.get(), 35612725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor SelIdents, NumSelIdents); 35622725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor } 356324a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor 35642725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // Fall through to send to the superclass in CDecl. 35652725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor } else { 35662725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // "super" may be the name of a type or variable. Figure out which 35672725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // it is. 35682725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor IdentifierInfo *Super = &Context.Idents.get("super"); 35692725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor NamedDecl *ND = LookupSingleName(S, Super, SuperLoc, 35702725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor LookupOrdinaryName); 35712725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if ((CDecl = dyn_cast_or_null<ObjCInterfaceDecl>(ND))) { 35722725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // "super" names an interface. Use it. 35732725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor } else if (TypeDecl *TD = dyn_cast_or_null<TypeDecl>(ND)) { 3574c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (const ObjCObjectType *Iface 3575c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall = Context.getTypeDeclType(TD)->getAs<ObjCObjectType>()) 3576c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall CDecl = Iface->getInterface(); 35772725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor } else if (ND && isa<UnresolvedUsingTypenameDecl>(ND)) { 35782725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // "super" names an unresolved type; we can't be more specific. 35792725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor } else { 35802725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // Assume that "super" names some kind of value and parse that way. 35812725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor CXXScopeSpec SS; 35822725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor UnqualifiedId id; 35832725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor id.setIdentifier(Super, SuperLoc); 35842725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor OwningExprResult SuperExpr = ActOnIdExpression(S, SS, id, false, false); 35852725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor return CodeCompleteObjCInstanceMessage(S, (Expr *)SuperExpr.get(), 35862725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor SelIdents, NumSelIdents); 35872725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor } 358824a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor 35892725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // Fall through 359024a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor } 359124a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor 35922725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor TypeTy *Receiver = 0; 35932725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (CDecl) 35942725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor Receiver = Context.getObjCInterfaceType(CDecl).getAsOpaquePtr(); 35952725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor return CodeCompleteObjCClassMessage(S, Receiver, SelIdents, 35962725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor NumSelIdents); 35972725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor} 35982725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor 35992725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregorvoid Sema::CodeCompleteObjCClassMessage(Scope *S, TypeTy *Receiver, 36002725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor IdentifierInfo **SelIdents, 36012725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor unsigned NumSelIdents) { 36022725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor typedef CodeCompleteConsumer::Result Result; 36032725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor ObjCInterfaceDecl *CDecl = 0; 36042725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor 360524a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor // If the given name refers to an interface type, retrieve the 360624a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor // corresponding declaration. 36072725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (Receiver) { 36082725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor QualType T = GetTypeFromParser(Receiver, 0); 36092725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (!T.isNull()) 3610c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (const ObjCObjectType *Interface = T->getAs<ObjCObjectType>()) 3611c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall CDecl = Interface->getInterface(); 361224a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor } 361324a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor 361436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add all of the factory methods in this Objective-C class, its protocols, 361536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // superclasses, categories, implementation, etc. 3616c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff ResultBuilder Results(*this); 3617c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff Results.EnterNewScope(); 361813438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor 361913438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor if (CDecl) 362013438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor AddObjCMethods(CDecl, false, MK_Any, SelIdents, NumSelIdents, CurContext, 362113438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor Results); 36222725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor else { 362313438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor // We're messaging "id" as a type; provide all class/factory methods. 362413438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor 3625719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor // If we have an external source, load the entire class method 3626719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor // pool from the PCH file. 3627719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor if (ExternalSource) { 362876bd1f387e6a7b7abfe53f63b3bd429b97bb80f0John McCall for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors(); 362976bd1f387e6a7b7abfe53f63b3bd429b97bb80f0John McCall I != N; ++I) { 363076bd1f387e6a7b7abfe53f63b3bd429b97bb80f0John McCall Selector Sel = ExternalSource->GetExternalSelector(I); 3631db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl if (Sel.isNull() || MethodPool.count(Sel)) 3632719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor continue; 3633719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor 3634db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl ReadMethodPool(Sel); 3635719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor } 3636719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor } 3637719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor 3638db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl for (GlobalMethodPool::iterator M = MethodPool.begin(), 3639db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl MEnd = MethodPool.end(); 3640db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl M != MEnd; ++M) { 3641db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl for (ObjCMethodList *MethList = &M->second.second; 3642db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl MethList && MethList->Method; 364313438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor MethList = MethList->Next) { 364413438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor if (!isAcceptableObjCMethod(MethList->Method, MK_Any, SelIdents, 364513438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor NumSelIdents)) 364613438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor continue; 364713438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor 364813438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor Result R(MethList->Method, 0); 364913438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor R.StartParameter = NumSelIdents; 365013438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor R.AllParametersAreInformative = false; 365113438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor Results.MaybeAddResult(R, CurContext); 365213438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor } 365313438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor } 365413438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor } 365513438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor 3656c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff Results.ExitScope(); 3657e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 3658e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 3659e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 3660c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff} 3661c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff 3662d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregorvoid Sema::CodeCompleteObjCInstanceMessage(Scope *S, ExprTy *Receiver, 3663d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor IdentifierInfo **SelIdents, 3664d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor unsigned NumSelIdents) { 3665c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff typedef CodeCompleteConsumer::Result Result; 3666c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff 3667c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff Expr *RecExpr = static_cast<Expr *>(Receiver); 3668c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff 366936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // If necessary, apply function/array conversion to the receiver. 367036ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // C99 6.7.5.3p[7,8]. 3671a873dfc9e7314681bb37efd9ab185045de121e43Douglas Gregor DefaultFunctionArrayLvalueConversion(RecExpr); 367236ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor QualType ReceiverType = RecExpr->getType(); 3673c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff 367436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Build the set of methods we can see. 367536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor ResultBuilder Results(*this); 367636ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor Results.EnterNewScope(); 367722f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor 367822f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor // If we're messaging an expression with type "id" or "Class", check 367922f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor // whether we know something special about the receiver that allows 368022f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor // us to assume a more-specific receiver type. 368122f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor if (ReceiverType->isObjCIdType() || ReceiverType->isObjCClassType()) 368222f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor if (ObjCInterfaceDecl *IFace = GetAssumedMessageSendExprType(RecExpr)) 368322f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor ReceiverType = Context.getObjCObjectPointerType( 368422f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor Context.getObjCInterfaceType(IFace)); 368536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 3686f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // Handle messages to Class. This really isn't a message to an instance 3687f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // method, so we treat it the same way we would treat a message send to a 3688f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // class method. 3689f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor if (ReceiverType->isObjCClassType() || 3690f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor ReceiverType->isObjCQualifiedClassType()) { 3691f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) { 3692f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor if (ObjCInterfaceDecl *ClassDecl = CurMethod->getClassInterface()) 36934ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(ClassDecl, false, MK_Any, SelIdents, NumSelIdents, 36944ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor CurContext, Results); 3695f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor } 3696f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor } 3697f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // Handle messages to a qualified ID ("id<foo>"). 3698f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor else if (const ObjCObjectPointerType *QualID 3699f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor = ReceiverType->getAsObjCQualifiedIdType()) { 3700f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // Search protocols for instance methods. 3701f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor for (ObjCObjectPointerType::qual_iterator I = QualID->qual_begin(), 3702f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor E = QualID->qual_end(); 3703f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor I != E; ++I) 37044ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(*I, true, MK_Any, SelIdents, NumSelIdents, CurContext, 37054ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Results); 3706f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor } 3707f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // Handle messages to a pointer to interface type. 3708f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor else if (const ObjCObjectPointerType *IFacePtr 3709f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor = ReceiverType->getAsObjCInterfacePointerType()) { 3710f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // Search the class, its superclasses, etc., for instance methods. 37114ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(IFacePtr->getInterfaceDecl(), true, MK_Any, SelIdents, 37124ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor NumSelIdents, CurContext, Results); 3713f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor 3714f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // Search protocols for instance methods. 3715f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor for (ObjCObjectPointerType::qual_iterator I = IFacePtr->qual_begin(), 3716f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor E = IFacePtr->qual_end(); 3717f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor I != E; ++I) 37184ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(*I, true, MK_Any, SelIdents, NumSelIdents, CurContext, 37194ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Results); 3720f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor } 372113438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor // Handle messages to "id". 372213438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor else if (ReceiverType->isObjCIdType()) { 3723719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor // We're messaging "id", so provide all instance methods we know 3724719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor // about as code-completion results. 3725719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor 3726719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor // If we have an external source, load the entire class method 3727719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor // pool from the PCH file. 3728719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor if (ExternalSource) { 372976bd1f387e6a7b7abfe53f63b3bd429b97bb80f0John McCall for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors(); 373076bd1f387e6a7b7abfe53f63b3bd429b97bb80f0John McCall I != N; ++I) { 373176bd1f387e6a7b7abfe53f63b3bd429b97bb80f0John McCall Selector Sel = ExternalSource->GetExternalSelector(I); 3732db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl if (Sel.isNull() || MethodPool.count(Sel)) 3733719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor continue; 3734719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor 3735db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl ReadMethodPool(Sel); 3736719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor } 3737719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor } 3738719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor 3739db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl for (GlobalMethodPool::iterator M = MethodPool.begin(), 3740db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl MEnd = MethodPool.end(); 3741db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl M != MEnd; ++M) { 3742db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl for (ObjCMethodList *MethList = &M->second.first; 3743db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl MethList && MethList->Method; 374413438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor MethList = MethList->Next) { 374513438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor if (!isAcceptableObjCMethod(MethList->Method, MK_Any, SelIdents, 374613438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor NumSelIdents)) 374713438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor continue; 374813438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor 374913438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor Result R(MethList->Method, 0); 375013438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor R.StartParameter = NumSelIdents; 375113438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor R.AllParametersAreInformative = false; 375213438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor Results.MaybeAddResult(R, CurContext); 375313438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor } 375413438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor } 375513438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor } 375613438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor 3757f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor Results.ExitScope(); 3758e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 3759e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 3760e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 3761c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff} 376255385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor 376355385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor/// \brief Add all of the protocol declarations that we find in the given 376455385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor/// (translation unit) context. 376555385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregorstatic void AddProtocolResults(DeclContext *Ctx, DeclContext *CurContext, 3766083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor bool OnlyForwardDeclarations, 376755385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor ResultBuilder &Results) { 376855385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor typedef CodeCompleteConsumer::Result Result; 376955385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor 377055385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor for (DeclContext::decl_iterator D = Ctx->decls_begin(), 377155385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor DEnd = Ctx->decls_end(); 377255385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor D != DEnd; ++D) { 377355385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor // Record any protocols we find. 377455385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor if (ObjCProtocolDecl *Proto = dyn_cast<ObjCProtocolDecl>(*D)) 3775083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor if (!OnlyForwardDeclarations || Proto->isForwardDecl()) 3776608300be1972c43fe99154d25d62d697e7c0a0c2Douglas Gregor Results.AddResult(Result(Proto, 0), CurContext, 0, false); 377755385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor 377855385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor // Record any forward-declared protocols we find. 377955385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor if (ObjCForwardProtocolDecl *Forward 378055385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor = dyn_cast<ObjCForwardProtocolDecl>(*D)) { 378155385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor for (ObjCForwardProtocolDecl::protocol_iterator 378255385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor P = Forward->protocol_begin(), 378355385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor PEnd = Forward->protocol_end(); 378455385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor P != PEnd; ++P) 3785083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor if (!OnlyForwardDeclarations || (*P)->isForwardDecl()) 3786608300be1972c43fe99154d25d62d697e7c0a0c2Douglas Gregor Results.AddResult(Result(*P, 0), CurContext, 0, false); 378755385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor } 378855385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor } 378955385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor} 379055385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor 379155385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregorvoid Sema::CodeCompleteObjCProtocolReferences(IdentifierLocPair *Protocols, 379255385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor unsigned NumProtocols) { 379355385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor ResultBuilder Results(*this); 379455385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor Results.EnterNewScope(); 379555385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor 379655385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor // Tell the result set to ignore all of the protocols we have 379755385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor // already seen. 379855385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor for (unsigned I = 0; I != NumProtocols; ++I) 3799c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor if (ObjCProtocolDecl *Protocol = LookupProtocol(Protocols[I].first, 3800c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor Protocols[I].second)) 380155385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor Results.Ignore(Protocol); 380255385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor 380355385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor // Add all protocols. 3804083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor AddProtocolResults(Context.getTranslationUnitDecl(), CurContext, false, 3805083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor Results); 3806083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor 3807083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor Results.ExitScope(); 3808e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 3809e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_ObjCProtocolName, 3810e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 3811083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor} 3812083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor 3813083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregorvoid Sema::CodeCompleteObjCProtocolDecl(Scope *) { 3814083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor ResultBuilder Results(*this); 3815083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor Results.EnterNewScope(); 3816083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor 3817083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor // Add all protocols. 3818083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor AddProtocolResults(Context.getTranslationUnitDecl(), CurContext, true, 3819083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor Results); 382055385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor 382155385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor Results.ExitScope(); 3822e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 3823e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_ObjCProtocolName, 3824e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 382555385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor} 38263b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 38273b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor/// \brief Add all of the Objective-C interface declarations that we find in 38283b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor/// the given (translation unit) context. 38293b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregorstatic void AddInterfaceResults(DeclContext *Ctx, DeclContext *CurContext, 38303b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor bool OnlyForwardDeclarations, 38313b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor bool OnlyUnimplemented, 38323b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor ResultBuilder &Results) { 38333b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor typedef CodeCompleteConsumer::Result Result; 38343b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 38353b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor for (DeclContext::decl_iterator D = Ctx->decls_begin(), 38363b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor DEnd = Ctx->decls_end(); 38373b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor D != DEnd; ++D) { 3838deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor // Record any interfaces we find. 3839deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor if (ObjCInterfaceDecl *Class = dyn_cast<ObjCInterfaceDecl>(*D)) 3840deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor if ((!OnlyForwardDeclarations || Class->isForwardDecl()) && 3841deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor (!OnlyUnimplemented || !Class->getImplementation())) 3842deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor Results.AddResult(Result(Class, 0), CurContext, 0, false); 38433b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 38443b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor // Record any forward-declared interfaces we find. 38453b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor if (ObjCClassDecl *Forward = dyn_cast<ObjCClassDecl>(*D)) { 38463b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor for (ObjCClassDecl::iterator C = Forward->begin(), CEnd = Forward->end(); 3847deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor C != CEnd; ++C) 3848deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor if ((!OnlyForwardDeclarations || C->getInterface()->isForwardDecl()) && 3849deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor (!OnlyUnimplemented || !C->getInterface()->getImplementation())) 3850deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor Results.AddResult(Result(C->getInterface(), 0), CurContext, 3851608300be1972c43fe99154d25d62d697e7c0a0c2Douglas Gregor 0, false); 38523b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor } 38533b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor } 38543b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor} 38553b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 38563b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregorvoid Sema::CodeCompleteObjCInterfaceDecl(Scope *S) { 38573b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor ResultBuilder Results(*this); 38583b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.EnterNewScope(); 38593b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 38603b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor // Add all classes. 38613b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, true, 38623b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor false, Results); 38633b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 38643b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.ExitScope(); 3865e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 3866e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 3867e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 38683b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor} 38693b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 3870c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregorvoid Sema::CodeCompleteObjCSuperclass(Scope *S, IdentifierInfo *ClassName, 3871c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor SourceLocation ClassNameLoc) { 38723b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor ResultBuilder Results(*this); 38733b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.EnterNewScope(); 38743b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 38753b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor // Make sure that we ignore the class we're currently defining. 38763b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor NamedDecl *CurClass 3877c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor = LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName); 387833ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor if (CurClass && isa<ObjCInterfaceDecl>(CurClass)) 38793b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.Ignore(CurClass); 38803b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 38813b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor // Add all classes. 38823b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false, 38833b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor false, Results); 38843b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 38853b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.ExitScope(); 3886e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 3887e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 3888e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 38893b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor} 38903b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 38913b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregorvoid Sema::CodeCompleteObjCImplementationDecl(Scope *S) { 38923b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor ResultBuilder Results(*this); 38933b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.EnterNewScope(); 38943b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 38953b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor // Add all unimplemented classes. 38963b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false, 38973b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor true, Results); 38983b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 38993b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.ExitScope(); 3900e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 3901e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 3902e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 39033b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor} 390433ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 390533ced0b8550f3e7169f326944731ee02e9338659Douglas Gregorvoid Sema::CodeCompleteObjCInterfaceCategory(Scope *S, 3906c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor IdentifierInfo *ClassName, 3907c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor SourceLocation ClassNameLoc) { 390833ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor typedef CodeCompleteConsumer::Result Result; 390933ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 391033ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor ResultBuilder Results(*this); 391133ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 391233ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // Ignore any categories we find that have already been implemented by this 391333ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // interface. 391433ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor llvm::SmallPtrSet<IdentifierInfo *, 16> CategoryNames; 391533ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor NamedDecl *CurClass 3916c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor = LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName); 391733ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor if (ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurClass)) 391833ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor for (ObjCCategoryDecl *Category = Class->getCategoryList(); Category; 391933ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Category = Category->getNextClassCategory()) 392033ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor CategoryNames.insert(Category->getIdentifier()); 392133ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 392233ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // Add all of the categories we know about. 392333ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Results.EnterNewScope(); 392433ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor TranslationUnitDecl *TU = Context.getTranslationUnitDecl(); 392533ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor for (DeclContext::decl_iterator D = TU->decls_begin(), 392633ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor DEnd = TU->decls_end(); 392733ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor D != DEnd; ++D) 392833ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(*D)) 392933ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor if (CategoryNames.insert(Category->getIdentifier())) 3930608300be1972c43fe99154d25d62d697e7c0a0c2Douglas Gregor Results.AddResult(Result(Category, 0), CurContext, 0, false); 393133ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Results.ExitScope(); 393233ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 3933e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 3934e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 3935e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 393633ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor} 393733ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 393833ced0b8550f3e7169f326944731ee02e9338659Douglas Gregorvoid Sema::CodeCompleteObjCImplementationCategory(Scope *S, 3939c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor IdentifierInfo *ClassName, 3940c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor SourceLocation ClassNameLoc) { 394133ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor typedef CodeCompleteConsumer::Result Result; 394233ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 394333ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // Find the corresponding interface. If we couldn't find the interface, the 394433ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // program itself is ill-formed. However, we'll try to be helpful still by 394533ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // providing the list of all of the categories we know about. 394633ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor NamedDecl *CurClass 3947c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor = LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName); 394833ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurClass); 394933ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor if (!Class) 3950c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor return CodeCompleteObjCInterfaceCategory(S, ClassName, ClassNameLoc); 395133ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 395233ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor ResultBuilder Results(*this); 395333ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 395433ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // Add all of the categories that have have corresponding interface 395533ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // declarations in this class and any of its superclasses, except for 395633ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // already-implemented categories in the class itself. 395733ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor llvm::SmallPtrSet<IdentifierInfo *, 16> CategoryNames; 395833ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Results.EnterNewScope(); 395933ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor bool IgnoreImplemented = true; 396033ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor while (Class) { 396133ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor for (ObjCCategoryDecl *Category = Class->getCategoryList(); Category; 396233ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Category = Category->getNextClassCategory()) 396333ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor if ((!IgnoreImplemented || !Category->getImplementation()) && 396433ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor CategoryNames.insert(Category->getIdentifier())) 3965608300be1972c43fe99154d25d62d697e7c0a0c2Douglas Gregor Results.AddResult(Result(Category, 0), CurContext, 0, false); 396633ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 396733ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Class = Class->getSuperClass(); 396833ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor IgnoreImplemented = false; 396933ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor } 397033ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Results.ExitScope(); 397133ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 3972e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 3973e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 3974e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 397533ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor} 3976322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 3977424b2a546dbd09cf70d43087771c7fff851ca158Douglas Gregorvoid Sema::CodeCompleteObjCPropertyDefinition(Scope *S, DeclPtrTy ObjCImpDecl) { 3978322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor typedef CodeCompleteConsumer::Result Result; 3979322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor ResultBuilder Results(*this); 3980322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 3981322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Figure out where this @synthesize lives. 3982322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor ObjCContainerDecl *Container 3983322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor = dyn_cast_or_null<ObjCContainerDecl>(ObjCImpDecl.getAs<Decl>()); 3984322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor if (!Container || 3985322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor (!isa<ObjCImplementationDecl>(Container) && 3986322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor !isa<ObjCCategoryImplDecl>(Container))) 3987322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor return; 3988322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 3989322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Ignore any properties that have already been implemented. 3990322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor for (DeclContext::decl_iterator D = Container->decls_begin(), 3991322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor DEnd = Container->decls_end(); 3992322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor D != DEnd; ++D) 3993322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor if (ObjCPropertyImplDecl *PropertyImpl = dyn_cast<ObjCPropertyImplDecl>(*D)) 3994322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Results.Ignore(PropertyImpl->getPropertyDecl()); 3995322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 3996322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Add any properties that we find. 3997322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Results.EnterNewScope(); 3998322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor if (ObjCImplementationDecl *ClassImpl 3999322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor = dyn_cast<ObjCImplementationDecl>(Container)) 4000322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor AddObjCProperties(ClassImpl->getClassInterface(), false, CurContext, 4001322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Results); 4002322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor else 4003322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor AddObjCProperties(cast<ObjCCategoryImplDecl>(Container)->getCategoryDecl(), 4004322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor false, CurContext, Results); 4005322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Results.ExitScope(); 4006322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 4007e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 4008e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 4009e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 4010322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor} 4011322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 4012322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregorvoid Sema::CodeCompleteObjCPropertySynthesizeIvar(Scope *S, 4013322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor IdentifierInfo *PropertyName, 4014322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor DeclPtrTy ObjCImpDecl) { 4015322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor typedef CodeCompleteConsumer::Result Result; 4016322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor ResultBuilder Results(*this); 4017322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 4018322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Figure out where this @synthesize lives. 4019322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor ObjCContainerDecl *Container 4020322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor = dyn_cast_or_null<ObjCContainerDecl>(ObjCImpDecl.getAs<Decl>()); 4021322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor if (!Container || 4022322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor (!isa<ObjCImplementationDecl>(Container) && 4023322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor !isa<ObjCCategoryImplDecl>(Container))) 4024322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor return; 4025322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 4026322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Figure out which interface we're looking into. 4027322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor ObjCInterfaceDecl *Class = 0; 4028322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor if (ObjCImplementationDecl *ClassImpl 4029322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor = dyn_cast<ObjCImplementationDecl>(Container)) 4030322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Class = ClassImpl->getClassInterface(); 4031322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor else 4032322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Class = cast<ObjCCategoryImplDecl>(Container)->getCategoryDecl() 4033322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor ->getClassInterface(); 4034322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 4035322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Add all of the instance variables in this class and its superclasses. 4036322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Results.EnterNewScope(); 4037322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor for(; Class; Class = Class->getSuperClass()) { 4038322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // FIXME: We could screen the type of each ivar for compatibility with 4039322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // the property, but is that being too paternal? 4040322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor for (ObjCInterfaceDecl::ivar_iterator IVar = Class->ivar_begin(), 4041322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor IVarEnd = Class->ivar_end(); 4042322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor IVar != IVarEnd; ++IVar) 4043608300be1972c43fe99154d25d62d697e7c0a0c2Douglas Gregor Results.AddResult(Result(*IVar, 0), CurContext, 0, false); 4044322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor } 4045322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Results.ExitScope(); 4046322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 4047e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 4048e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 4049e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 4050322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor} 4051e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 4052e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregortypedef llvm::DenseMap<Selector, ObjCMethodDecl *> KnownMethodsMap; 4053e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 4054e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor/// \brief Find all of the methods that reside in the given container 4055e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor/// (and its superclasses, protocols, etc.) that meet the given 4056e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor/// criteria. Insert those methods into the map of known methods, 4057e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor/// indexed by selector so they can be easily found. 4058e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregorstatic void FindImplementableMethods(ASTContext &Context, 4059e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor ObjCContainerDecl *Container, 4060e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor bool WantInstanceMethods, 4061e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor QualType ReturnType, 4062e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor bool IsInImplementation, 4063e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor KnownMethodsMap &KnownMethods) { 4064e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container)) { 4065e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Recurse into protocols. 4066e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor const ObjCList<ObjCProtocolDecl> &Protocols 4067e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor = IFace->getReferencedProtocols(); 4068e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 4069e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor E = Protocols.end(); 4070e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor I != E; ++I) 4071e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType, 4072e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor IsInImplementation, KnownMethods); 4073e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 4074e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // If we're not in the implementation of a class, also visit the 4075e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // superclass. 4076e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (!IsInImplementation && IFace->getSuperClass()) 4077e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor FindImplementableMethods(Context, IFace->getSuperClass(), 4078e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor WantInstanceMethods, ReturnType, 4079e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor IsInImplementation, KnownMethods); 4080e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 4081e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Add methods from any class extensions (but not from categories; 4082e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // those should go into category implementations). 408380aa1cd7973561889e51c1c152c8990a8de9c953Fariborz Jahanian for (const ObjCCategoryDecl *Cat = IFace->getFirstClassExtension(); Cat; 408480aa1cd7973561889e51c1c152c8990a8de9c953Fariborz Jahanian Cat = Cat->getNextClassExtension()) 408580aa1cd7973561889e51c1c152c8990a8de9c953Fariborz Jahanian FindImplementableMethods(Context, const_cast<ObjCCategoryDecl*>(Cat), 408680aa1cd7973561889e51c1c152c8990a8de9c953Fariborz Jahanian WantInstanceMethods, ReturnType, 4087e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor IsInImplementation, KnownMethods); 4088e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 4089e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 4090e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(Container)) { 4091e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Recurse into protocols. 4092e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor const ObjCList<ObjCProtocolDecl> &Protocols 4093e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor = Category->getReferencedProtocols(); 4094e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 4095e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor E = Protocols.end(); 4096e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor I != E; ++I) 4097e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType, 4098e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor IsInImplementation, KnownMethods); 4099e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 4100e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 4101e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) { 4102e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Recurse into protocols. 4103e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor const ObjCList<ObjCProtocolDecl> &Protocols 4104e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor = Protocol->getReferencedProtocols(); 4105e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 4106e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor E = Protocols.end(); 4107e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor I != E; ++I) 4108e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType, 4109e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor IsInImplementation, KnownMethods); 4110e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 4111e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 4112e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Add methods in this container. This operation occurs last because 4113e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // we want the methods from this container to override any methods 4114e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // we've previously seen with the same selector. 4115e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor for (ObjCContainerDecl::method_iterator M = Container->meth_begin(), 4116e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor MEnd = Container->meth_end(); 4117e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor M != MEnd; ++M) { 4118e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if ((*M)->isInstanceMethod() == WantInstanceMethods) { 4119e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (!ReturnType.isNull() && 4120e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor !Context.hasSameUnqualifiedType(ReturnType, (*M)->getResultType())) 4121e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor continue; 4122e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 4123e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor KnownMethods[(*M)->getSelector()] = *M; 4124e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 4125e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 4126e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor} 4127e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 4128e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregorvoid Sema::CodeCompleteObjCMethodDecl(Scope *S, 4129e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor bool IsInstanceMethod, 4130e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor TypeTy *ReturnTy, 4131e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor DeclPtrTy IDecl) { 4132e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Determine the return type of the method we're declaring, if 4133e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // provided. 4134e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor QualType ReturnType = GetTypeFromParser(ReturnTy); 4135e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 4136e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Determine where we should start searching for methods, and where we 4137e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor ObjCContainerDecl *SearchDecl = 0, *CurrentDecl = 0; 4138e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor bool IsInImplementation = false; 4139e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (Decl *D = IDecl.getAs<Decl>()) { 4140e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (ObjCImplementationDecl *Impl = dyn_cast<ObjCImplementationDecl>(D)) { 4141e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor SearchDecl = Impl->getClassInterface(); 4142e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor CurrentDecl = Impl; 4143e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor IsInImplementation = true; 4144e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } else if (ObjCCategoryImplDecl *CatImpl 4145e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor = dyn_cast<ObjCCategoryImplDecl>(D)) { 4146e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor SearchDecl = CatImpl->getCategoryDecl(); 4147e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor CurrentDecl = CatImpl; 4148e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor IsInImplementation = true; 4149e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } else { 4150e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor SearchDecl = dyn_cast<ObjCContainerDecl>(D); 4151e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor CurrentDecl = SearchDecl; 4152e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 4153e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 4154e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 4155e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (!SearchDecl && S) { 4156e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (DeclContext *DC = static_cast<DeclContext *>(S->getEntity())) { 4157e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor SearchDecl = dyn_cast<ObjCContainerDecl>(DC); 4158e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor CurrentDecl = SearchDecl; 4159e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 4160e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 4161e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 4162e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (!SearchDecl || !CurrentDecl) { 4163e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 4164e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 4165e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor 0, 0); 4166e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor return; 4167e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 4168e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 4169e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Find all of the methods that we could declare/implement here. 4170e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor KnownMethodsMap KnownMethods; 4171e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor FindImplementableMethods(Context, SearchDecl, IsInstanceMethod, 4172e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor ReturnType, IsInImplementation, KnownMethods); 4173e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 4174e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Erase any methods that have already been declared or 4175e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // implemented here. 4176e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor for (ObjCContainerDecl::method_iterator M = CurrentDecl->meth_begin(), 4177e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor MEnd = CurrentDecl->meth_end(); 4178e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor M != MEnd; ++M) { 4179e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if ((*M)->isInstanceMethod() != IsInstanceMethod) 4180e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor continue; 4181e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 4182e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor KnownMethodsMap::iterator Pos = KnownMethods.find((*M)->getSelector()); 4183e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (Pos != KnownMethods.end()) 4184e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor KnownMethods.erase(Pos); 4185e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 4186e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 4187e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Add declarations or definitions for each of the known methods. 4188e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor typedef CodeCompleteConsumer::Result Result; 4189e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor ResultBuilder Results(*this); 4190e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Results.EnterNewScope(); 4191e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor PrintingPolicy Policy(Context.PrintingPolicy); 4192e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Policy.AnonymousTagLocations = false; 4193e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor for (KnownMethodsMap::iterator M = KnownMethods.begin(), 4194e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor MEnd = KnownMethods.end(); 4195e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor M != MEnd; ++M) { 4196e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor ObjCMethodDecl *Method = M->second; 4197e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor CodeCompletionString *Pattern = new CodeCompletionString; 4198e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 4199e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // If the result type was not already provided, add it to the 4200e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // pattern as (type). 4201e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (ReturnType.isNull()) { 4202e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor std::string TypeStr; 4203e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Method->getResultType().getAsStringInternal(TypeStr, Policy); 4204e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 4205e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Pattern->AddTextChunk(TypeStr); 4206e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 4207e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 4208e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 4209e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Selector Sel = Method->getSelector(); 4210e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 4211e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Add the first part of the selector to the pattern. 4212e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Pattern->AddTypedTextChunk(Sel.getIdentifierInfoForSlot(0)->getName()); 4213e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 4214e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Add parameters to the pattern. 4215e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor unsigned I = 0; 4216e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor for (ObjCMethodDecl::param_iterator P = Method->param_begin(), 4217e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor PEnd = Method->param_end(); 4218e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor P != PEnd; (void)++P, ++I) { 4219e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Add the part of the selector name. 4220e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (I == 0) 4221e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_Colon); 4222e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor else if (I < Sel.getNumArgs()) { 4223e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 4224e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Pattern->AddTextChunk(Sel.getIdentifierInfoForSlot(1)->getName()); 4225e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_Colon); 4226e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } else 4227e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor break; 4228e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 4229e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Add the parameter type. 4230e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor std::string TypeStr; 4231e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor (*P)->getOriginalType().getAsStringInternal(TypeStr, Policy); 4232e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 4233e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Pattern->AddTextChunk(TypeStr); 4234e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 4235e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 4236e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (IdentifierInfo *Id = (*P)->getIdentifier()) 4237e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Pattern->AddTextChunk(Id->getName()); 4238e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 4239e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 4240e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (Method->isVariadic()) { 4241e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (Method->param_size() > 0) 4242e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_Comma); 4243e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Pattern->AddTextChunk("..."); 4244e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 4245e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 4246447107dfff705ab79d1dbf33ce79b524d63572fdDouglas Gregor if (IsInImplementation && Results.includeCodePatterns()) { 4247e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // We will be defining the method here, so add a compound statement. 4248e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 4249e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftBrace); 4250e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_VerticalSpace); 4251e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (!Method->getResultType()->isVoidType()) { 4252e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // If the result type is not void, add a return clause. 4253e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Pattern->AddTextChunk("return"); 4254e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 4255e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Pattern->AddPlaceholderChunk("expression"); 4256e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_SemiColon); 4257e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } else 4258e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Pattern->AddPlaceholderChunk("statements"); 4259e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 4260e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_VerticalSpace); 4261e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightBrace); 4262e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 4263e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 4264e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Results.AddResult(Result(Pattern)); 4265e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 4266e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 4267e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Results.ExitScope(); 4268e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 4269e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 4270e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 4271e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 4272e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor} 42731f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 42741f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregorvoid Sema::CodeCompleteObjCMethodDeclSelector(Scope *S, 42751f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor bool IsInstanceMethod, 427640ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor bool AtParameterName, 42771f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor TypeTy *ReturnTy, 42781f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor IdentifierInfo **SelIdents, 42791f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor unsigned NumSelIdents) { 42801f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor // If we have an external source, load the entire class method 42811f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor // pool from the PCH file. 42821f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor if (ExternalSource) { 42831f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors(); 42841f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor I != N; ++I) { 42851f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor Selector Sel = ExternalSource->GetExternalSelector(I); 4286db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl if (Sel.isNull() || MethodPool.count(Sel)) 42871f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor continue; 4288db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl 4289db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl ReadMethodPool(Sel); 42901f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor } 42911f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor } 42921f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 42931f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor // Build the set of methods we can see. 42941f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor typedef CodeCompleteConsumer::Result Result; 42951f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor ResultBuilder Results(*this); 42961f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 42971f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor if (ReturnTy) 42981f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor Results.setPreferredType(GetTypeFromParser(ReturnTy).getNonReferenceType()); 4299db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl 43001f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor Results.EnterNewScope(); 4301db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl for (GlobalMethodPool::iterator M = MethodPool.begin(), 4302db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl MEnd = MethodPool.end(); 4303db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl M != MEnd; ++M) { 4304db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl for (ObjCMethodList *MethList = IsInstanceMethod ? &M->second.first : 4305db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl &M->second.second; 4306db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl MethList && MethList->Method; 43071f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor MethList = MethList->Next) { 43081f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor if (!isAcceptableObjCMethod(MethList->Method, MK_Any, SelIdents, 43091f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor NumSelIdents)) 43101f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor continue; 43111f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 431240ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor if (AtParameterName) { 431340ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor // Suggest parameter names we've seen before. 431440ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor if (NumSelIdents && NumSelIdents <= MethList->Method->param_size()) { 431540ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor ParmVarDecl *Param = MethList->Method->param_begin()[NumSelIdents-1]; 431640ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor if (Param->getIdentifier()) { 431740ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor CodeCompletionString *Pattern = new CodeCompletionString; 431840ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor Pattern->AddTypedTextChunk(Param->getIdentifier()->getName()); 431940ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor Results.AddResult(Pattern); 432040ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor } 432140ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor } 432240ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor 432340ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor continue; 432440ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor } 432540ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor 43261f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor Result R(MethList->Method, 0); 43271f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor R.StartParameter = NumSelIdents; 43281f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor R.AllParametersAreInformative = false; 43291f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor R.DeclaringEntity = true; 43301f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor Results.MaybeAddResult(R, CurContext); 43311f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor } 43321f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor } 43331f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 43341f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor Results.ExitScope(); 4335e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 4336e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 4337e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 43381f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor} 433987c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor 434087c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregorvoid Sema::GatherGlobalCodeCompletions( 434187c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor llvm::SmallVectorImpl<CodeCompleteConsumer::Result> &Results) { 434287c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor ResultBuilder Builder(*this); 434387c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor 434487c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor#if 0 434587c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor // FIXME: We need a name lookup that means "look for everything", 434687c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor CodeCompletionDeclConsumer Consumer(Builder, 434787c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor Context.getTranslationUnitDecl()); 434887c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor LookupVisibleDecls(Context.getTranslationUnitDecl(), LookupOrdinaryName, 434987c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor Consumer); 435087c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor#endif 435187c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor 435287c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor if (!CodeCompleter || CodeCompleter->includeMacros()) 435387c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor AddMacroResults(PP, Builder); 435487c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor 435587c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor Results.clear(); 435687c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor Results.insert(Results.end(), 435787c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor Builder.data(), Builder.data() + Builder.size()); 435887c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor} 4359