SemaCodeComplete.cpp revision aaa107acc8f906203101af259e8d764b5027700a
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; 242fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor bool IsObjCCollection(NamedDecl *ND) const; 24386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor //@} 24486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor }; 24586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 24686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 247fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregorclass ResultBuilder::ShadowMapEntry::iterator { 248fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor llvm::PointerUnion<NamedDecl*, const DeclIndexPair*> DeclOrIterator; 249fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor unsigned SingleDeclIndex; 250fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 251fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregorpublic: 252fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor typedef DeclIndexPair value_type; 253fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor typedef value_type reference; 254fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor typedef std::ptrdiff_t difference_type; 255fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor typedef std::input_iterator_tag iterator_category; 256fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 257fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor class pointer { 258fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor DeclIndexPair Value; 259fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 260fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor public: 261fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor pointer(const DeclIndexPair &Value) : Value(Value) { } 262fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 263fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor const DeclIndexPair *operator->() const { 264fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return &Value; 265fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 266fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor }; 267fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 268fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor iterator() : DeclOrIterator((NamedDecl *)0), SingleDeclIndex(0) { } 269fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 270fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor iterator(NamedDecl *SingleDecl, unsigned Index) 271fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor : DeclOrIterator(SingleDecl), SingleDeclIndex(Index) { } 272fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 273fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor iterator(const DeclIndexPair *Iterator) 274fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor : DeclOrIterator(Iterator), SingleDeclIndex(0) { } 275fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 276fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor iterator &operator++() { 277fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (DeclOrIterator.is<NamedDecl *>()) { 278fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor DeclOrIterator = (NamedDecl *)0; 279fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor SingleDeclIndex = 0; 280fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return *this; 281fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 282fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 283fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor const DeclIndexPair *I = DeclOrIterator.get<const DeclIndexPair*>(); 284fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ++I; 285fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor DeclOrIterator = I; 286fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return *this; 287fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 288fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 289fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor iterator operator++(int) { 290fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor iterator tmp(*this); 291fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ++(*this); 292fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return tmp; 293fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 294fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 295fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor reference operator*() const { 296fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (NamedDecl *ND = DeclOrIterator.dyn_cast<NamedDecl *>()) 297fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return reference(ND, SingleDeclIndex); 298fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 299d490f953e812a9bb1729637cc70a6db7d997ced0Douglas Gregor return *DeclOrIterator.get<const DeclIndexPair*>(); 300fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 301fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 302fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor pointer operator->() const { 303fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return pointer(**this); 304fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 305fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 306fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor friend bool operator==(const iterator &X, const iterator &Y) { 307d490f953e812a9bb1729637cc70a6db7d997ced0Douglas Gregor return X.DeclOrIterator.getOpaqueValue() 308d490f953e812a9bb1729637cc70a6db7d997ced0Douglas Gregor == Y.DeclOrIterator.getOpaqueValue() && 309fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor X.SingleDeclIndex == Y.SingleDeclIndex; 310fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 311fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 312fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor friend bool operator!=(const iterator &X, const iterator &Y) { 313d490f953e812a9bb1729637cc70a6db7d997ced0Douglas Gregor return !(X == Y); 314fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 315fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor}; 316fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 317fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas GregorResultBuilder::ShadowMapEntry::iterator 318fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas GregorResultBuilder::ShadowMapEntry::begin() const { 319fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (DeclOrVector.isNull()) 320fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return iterator(); 321fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 322fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (NamedDecl *ND = DeclOrVector.dyn_cast<NamedDecl *>()) 323fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return iterator(ND, SingleDeclIndex); 324fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 325fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return iterator(DeclOrVector.get<DeclIndexPairVector *>()->begin()); 326fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor} 327fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 328fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas GregorResultBuilder::ShadowMapEntry::iterator 329fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas GregorResultBuilder::ShadowMapEntry::end() const { 330fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (DeclOrVector.is<NamedDecl *>() || DeclOrVector.isNull()) 331fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return iterator(); 332fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 333fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor return iterator(DeclOrVector.get<DeclIndexPairVector *>()->end()); 334fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor} 335fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 336456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// \brief Compute the qualification required to get from the current context 337456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// (\p CurContext) to the target context (\p TargetContext). 338456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// 339456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// \param Context the AST context in which the qualification will be used. 340456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// 341456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// \param CurContext the context where an entity is being named, which is 342456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// typically based on the current scope. 343456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// 344456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// \param TargetContext the context in which the named entity actually 345456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// resides. 346456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// 347456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// \returns a nested name specifier that refers into the target context, or 348456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor/// NULL if no qualification is needed. 349456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregorstatic NestedNameSpecifier * 350456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas GregorgetRequiredQualification(ASTContext &Context, 351456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor DeclContext *CurContext, 352456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor DeclContext *TargetContext) { 353456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor llvm::SmallVector<DeclContext *, 4> TargetParents; 354456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor 355456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor for (DeclContext *CommonAncestor = TargetContext; 356456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor CommonAncestor && !CommonAncestor->Encloses(CurContext); 357456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor CommonAncestor = CommonAncestor->getLookupParent()) { 358456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor if (CommonAncestor->isTransparentContext() || 359456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor CommonAncestor->isFunctionOrMethod()) 360456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor continue; 361456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor 362456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor TargetParents.push_back(CommonAncestor); 363456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor } 364456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor 365456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor NestedNameSpecifier *Result = 0; 366456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor while (!TargetParents.empty()) { 367456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor DeclContext *Parent = TargetParents.back(); 368456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor TargetParents.pop_back(); 369456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor 370fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor if (NamespaceDecl *Namespace = dyn_cast<NamespaceDecl>(Parent)) { 371fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor if (!Namespace->getIdentifier()) 372fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor continue; 373fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor 374456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor Result = NestedNameSpecifier::Create(Context, Result, Namespace); 375fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor } 376456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor else if (TagDecl *TD = dyn_cast<TagDecl>(Parent)) 377456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor Result = NestedNameSpecifier::Create(Context, Result, 378456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor false, 379456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor Context.getTypeDeclType(TD).getTypePtr()); 3800c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor } 381456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor return Result; 382456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor} 383456c4a17f4f02d660188dc9b2619c160dfbe3b68Douglas Gregor 38445bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregorbool ResultBuilder::isInterestingDecl(NamedDecl *ND, 38545bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor bool &AsNestedNameSpecifier) const { 38645bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor AsNestedNameSpecifier = false; 38745bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor 388e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor ND = ND->getUnderlyingDecl(); 389e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor unsigned IDNS = ND->getIdentifierNamespace(); 390f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor 391f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor // Skip unnamed entities. 392e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor if (!ND->getDeclName()) 393e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return false; 39486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 39586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Friend declarations and declarations introduced due to friends are never 39686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // added as results. 39792b7f70c924cbf4514e9e434cea7def51ab49860John McCall if (IDNS & (Decl::IDNS_OrdinaryFriend | Decl::IDNS_TagFriend)) 398e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return false; 399e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 4007628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor // Class template (partial) specializations are never added as results. 401e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor if (isa<ClassTemplateSpecializationDecl>(ND) || 402e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor isa<ClassTemplatePartialSpecializationDecl>(ND)) 403e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return false; 40486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 4057628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor // Using declarations themselves are never added as results. 406e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor if (isa<UsingDecl>(ND)) 407e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return false; 408e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 409e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor // Some declarations have reserved names that we don't want to ever show. 410e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor if (const IdentifierInfo *Id = ND->getIdentifier()) { 41186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // __va_list_tag is a freak of nature. Find it and skip it. 41286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (Id->isStr("__va_list_tag") || Id->isStr("__builtin_va_list")) 413e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return false; 41486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 415f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor // Filter out names reserved for the implementation (C99 7.1.3, 416797efb51ce0825eb4cce2864a5cea2b30e85f06cDouglas Gregor // C++ [lib.global.names]) if they come from a system header. 417e013d685c6689ac7ae103ee88acf573422d1ed6aDaniel Dunbar // 418e013d685c6689ac7ae103ee88acf573422d1ed6aDaniel Dunbar // FIXME: Add predicate for this. 419f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor if (Id->getLength() >= 2) { 420e013d685c6689ac7ae103ee88acf573422d1ed6aDaniel Dunbar const char *Name = Id->getNameStart(); 421f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor if (Name[0] == '_' && 422797efb51ce0825eb4cce2864a5cea2b30e85f06cDouglas Gregor (Name[1] == '_' || (Name[1] >= 'A' && Name[1] <= 'Z')) && 423797efb51ce0825eb4cce2864a5cea2b30e85f06cDouglas Gregor (ND->getLocation().isInvalid() || 424797efb51ce0825eb4cce2864a5cea2b30e85f06cDouglas Gregor SemaRef.SourceMgr.isInSystemHeader( 425797efb51ce0825eb4cce2864a5cea2b30e85f06cDouglas Gregor SemaRef.SourceMgr.getSpellingLoc(ND->getLocation())))) 426e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return false; 427f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor } 42886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 429e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 43086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // C++ constructors are never found by name lookup. 431e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor if (isa<CXXConstructorDecl>(ND)) 432e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return false; 43386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 434a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor if (Filter == &ResultBuilder::IsNestedNameSpecifier || 435a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor ((isa<NamespaceDecl>(ND) || isa<NamespaceAliasDecl>(ND)) && 436a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor Filter != &ResultBuilder::IsNamespace && 437a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor Filter != &ResultBuilder::IsNamespaceOrAlias)) 438a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor AsNestedNameSpecifier = true; 439a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor 44086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Filter out any unwanted results. 44145bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor if (Filter && !(this->*Filter)(ND)) { 44245bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor // Check whether it is interesting as a nested-name-specifier. 44345bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor if (AllowNestedNameSpecifiers && SemaRef.getLangOptions().CPlusPlus && 44445bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor IsNestedNameSpecifier(ND) && 44545bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor (Filter != &ResultBuilder::IsMember || 44645bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor (isa<CXXRecordDecl>(ND) && 44745bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor cast<CXXRecordDecl>(ND)->isInjectedClassName()))) { 44845bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor AsNestedNameSpecifier = true; 44945bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor return true; 45045bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor } 45145bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor 452e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return false; 453a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor } 454e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor // ... then it must be interesting! 455e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return true; 456e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor} 457e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 4586660d845af8edb99098a08cf2539233a3be650b3Douglas Gregorbool ResultBuilder::CheckHiddenResult(Result &R, DeclContext *CurContext, 4596660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor NamedDecl *Hiding) { 4606660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor // In C, there is no way to refer to a hidden name. 4616660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor // FIXME: This isn't true; we can find a tag name hidden by an ordinary 4626660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor // name if we introduce the tag type. 4636660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor if (!SemaRef.getLangOptions().CPlusPlus) 4646660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor return true; 4656660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor 4666660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor DeclContext *HiddenCtx = R.Declaration->getDeclContext()->getLookupContext(); 4676660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor 4686660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor // There is no way to qualify a name declared in a function or method. 4696660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor if (HiddenCtx->isFunctionOrMethod()) 4706660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor return true; 4716660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor 4726660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor if (HiddenCtx == Hiding->getDeclContext()->getLookupContext()) 4736660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor return true; 4746660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor 4756660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor // We can refer to the result with the appropriate qualification. Do it. 4766660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor R.Hidden = true; 4776660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor R.QualifierIsInformative = false; 4786660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor 4796660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor if (!R.Qualifier) 4806660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor R.Qualifier = getRequiredQualification(SemaRef.Context, 4816660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor CurContext, 4826660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor R.Declaration->getDeclContext()); 4836660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor return false; 4846660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor} 4856660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor 4861f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor/// \brief A simplified classification of types used to determine whether two 4871f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor/// types are "similar enough" when adjusting priorities. 4881827e10051638770ad9ccf3e285caf95f995afd1Douglas GregorSimplifiedTypeClass clang::getSimplifiedTypeClass(CanQualType T) { 4891f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor switch (T->getTypeClass()) { 4901f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::Builtin: 4911f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor switch (cast<BuiltinType>(T)->getKind()) { 4921f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case BuiltinType::Void: 4931f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Void; 4941f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 4951f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case BuiltinType::NullPtr: 4961f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Pointer; 4971f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 4981f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case BuiltinType::Overload: 4991f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case BuiltinType::Dependent: 5001f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case BuiltinType::UndeducedAuto: 5011f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Other; 5021f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 5031f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case BuiltinType::ObjCId: 5041f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case BuiltinType::ObjCClass: 5051f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case BuiltinType::ObjCSel: 5061f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_ObjectiveC; 5071f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 5081f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor default: 5091f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Arithmetic; 5101f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor } 5111f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Other; 5121f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 5131f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::Complex: 5141f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Arithmetic; 5151f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 5161f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::Pointer: 5171f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Pointer; 5181f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 5191f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::BlockPointer: 5201f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Block; 5211f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 5221f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::LValueReference: 5231f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::RValueReference: 5241f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return getSimplifiedTypeClass(T->getAs<ReferenceType>()->getPointeeType()); 5251f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 5261f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::ConstantArray: 5271f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::IncompleteArray: 5281f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::VariableArray: 5291f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::DependentSizedArray: 5301f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Array; 5311f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 5321f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::DependentSizedExtVector: 5331f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::Vector: 5341f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::ExtVector: 5351f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Arithmetic; 5361f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 5371f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::FunctionProto: 5381f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::FunctionNoProto: 5391f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Function; 5401f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 5411f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::Record: 5421f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Record; 5431f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 5441f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::Enum: 5451f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Arithmetic; 5461f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 5471f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::ObjCObject: 5481f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::ObjCInterface: 5491f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor case Type::ObjCObjectPointer: 5501f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_ObjectiveC; 5511f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 5521f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor default: 5531f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return STC_Other; 5541f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor } 5551f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor} 5561f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 5571f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor/// \brief Get the type that a given expression will have if this declaration 5581f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor/// is used as an expression in its "typical" code-completion form. 5591827e10051638770ad9ccf3e285caf95f995afd1Douglas GregorQualType clang::getDeclUsageType(ASTContext &C, NamedDecl *ND) { 5601f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor ND = cast<NamedDecl>(ND->getUnderlyingDecl()); 5611f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 5621f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor if (TypeDecl *Type = dyn_cast<TypeDecl>(ND)) 5631f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return C.getTypeDeclType(Type); 5641f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor if (ObjCInterfaceDecl *Iface = dyn_cast<ObjCInterfaceDecl>(ND)) 5651f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return C.getObjCInterfaceType(Iface); 5661f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 5671f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor QualType T; 5681f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor if (FunctionDecl *Function = dyn_cast<FunctionDecl>(ND)) 5695291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor T = Function->getCallResultType(); 5701f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor else if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(ND)) 5715291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor T = Method->getSendResultType(); 5721f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor else if (FunctionTemplateDecl *FunTmpl = dyn_cast<FunctionTemplateDecl>(ND)) 5735291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor T = FunTmpl->getTemplatedDecl()->getCallResultType(); 5741f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor else if (EnumConstantDecl *Enumerator = dyn_cast<EnumConstantDecl>(ND)) 5751f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor T = C.getTypeDeclType(cast<EnumDecl>(Enumerator->getDeclContext())); 5761f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor else if (ObjCPropertyDecl *Property = dyn_cast<ObjCPropertyDecl>(ND)) 5771f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor T = Property->getType(); 5781f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor else if (ValueDecl *Value = dyn_cast<ValueDecl>(ND)) 5791f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor T = Value->getType(); 5801f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor else 5811f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return QualType(); 5821f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 5831f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return T.getNonReferenceType(); 5841f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor} 5851f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 5861f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregorvoid ResultBuilder::AdjustResultPriorityForPreferredType(Result &R) { 5871f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor QualType T = getDeclUsageType(SemaRef.Context, R.Declaration); 5881f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor if (T.isNull()) 5891f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor return; 5901f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 5911f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor CanQualType TC = SemaRef.Context.getCanonicalType(T); 5921f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor // Check for exactly-matching types (modulo qualifiers). 5931f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor if (SemaRef.Context.hasSameUnqualifiedType(PreferredType, TC)) 5941f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor R.Priority /= CCF_ExactTypeMatch; 5951f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor // Check for nearly-matching types, based on classification of each. 5961f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor else if ((getSimplifiedTypeClass(PreferredType) 5971f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor == getSimplifiedTypeClass(TC)) && 5981f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor !(PreferredType->isEnumeralType() && TC->isEnumeralType())) 5991f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor R.Priority /= CCF_SimilarTypeMatch; 6001f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor} 6011f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 602e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregorvoid ResultBuilder::MaybeAddResult(Result R, DeclContext *CurContext) { 603e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor assert(!ShadowMaps.empty() && "Must enter into a results scope"); 604e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 605e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor if (R.Kind != Result::RK_Declaration) { 606e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor // For non-declaration results, just add the result. 607e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor Results.push_back(R); 608e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return; 609e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor } 610e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 611e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor // Look through using declarations. 612e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor if (UsingShadowDecl *Using = dyn_cast<UsingShadowDecl>(R.Declaration)) { 613e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor MaybeAddResult(Result(Using->getTargetDecl(), R.Qualifier), CurContext); 61486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return; 615e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor } 61686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 617e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor Decl *CanonDecl = R.Declaration->getCanonicalDecl(); 618e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor unsigned IDNS = CanonDecl->getIdentifierNamespace(); 619e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 62045bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor bool AsNestedNameSpecifier = false; 62145bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor if (!isInterestingDecl(R.Declaration, AsNestedNameSpecifier)) 622e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor return; 623e495b7f7b4fffbba7e61229d2a4205a0b164cbe8Douglas Gregor 62486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ShadowMap &SMap = ShadowMaps.back(); 625fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ShadowMapEntry::iterator I, IEnd; 626fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ShadowMap::iterator NamePos = SMap.find(R.Declaration->getDeclName()); 627fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (NamePos != SMap.end()) { 628fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor I = NamePos->second.begin(); 629fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor IEnd = NamePos->second.end(); 630fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 631fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 632fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor for (; I != IEnd; ++I) { 633fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor NamedDecl *ND = I->first; 634fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor unsigned Index = I->second; 63586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (ND->getCanonicalDecl() == CanonDecl) { 63686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // This is a redeclaration. Always pick the newer declaration. 63786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Results[Index].Declaration = R.Declaration; 63886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 63986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // We're done. 64086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return; 64186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 64286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 64386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 64486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // This is a new declaration in this scope. However, check whether this 64586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // declaration name is hidden by a similarly-named declaration in an outer 64686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // scope. 64786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor std::list<ShadowMap>::iterator SM, SMEnd = ShadowMaps.end(); 64886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor --SMEnd; 64986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor for (SM = ShadowMaps.begin(); SM != SMEnd; ++SM) { 650fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ShadowMapEntry::iterator I, IEnd; 651fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ShadowMap::iterator NamePos = SM->find(R.Declaration->getDeclName()); 652fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (NamePos != SM->end()) { 653fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor I = NamePos->second.begin(); 654fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor IEnd = NamePos->second.end(); 655fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor } 656fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor for (; I != IEnd; ++I) { 65786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // A tag declaration does not hide a non-tag declaration. 6580d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCall if (I->first->hasTagIdentifierNamespace() && 65986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor (IDNS & (Decl::IDNS_Member | Decl::IDNS_Ordinary | 66086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Decl::IDNS_ObjCProtocol))) 66186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor continue; 66286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 66386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Protocols are in distinct namespaces from everything else. 664fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor if (((I->first->getIdentifierNamespace() & Decl::IDNS_ObjCProtocol) 66586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor || (IDNS & Decl::IDNS_ObjCProtocol)) && 666fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor I->first->getIdentifierNamespace() != IDNS) 66786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor continue; 66886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 66986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // The newly-added result is hidden by an entry in the shadow map. 6706660d845af8edb99098a08cf2539233a3be650b3Douglas Gregor if (CheckHiddenResult(R, CurContext, I->first)) 67186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return; 67286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 67386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor break; 67486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 67586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 67686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 67786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Make sure that any given declaration only shows up in the result set once. 67886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!AllDeclsFound.insert(CanonDecl)) 67986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return; 68086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 681eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor // If the filter is for nested-name-specifiers, then this result starts a 682eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor // nested-name-specifier. 68312e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor if (AsNestedNameSpecifier) { 684eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor R.StartsNestedNameSpecifier = true; 68512e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor R.Priority = CCP_NestedNameSpecifier; 6861f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor } else if (!PreferredType.isNull()) 6871f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor AdjustResultPriorityForPreferredType(R); 6881f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 6890563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor // If this result is supposed to have an informative qualifier, add one. 690eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor if (R.QualifierIsInformative && !R.Qualifier && 691eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor !R.StartsNestedNameSpecifier) { 6920563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor DeclContext *Ctx = R.Declaration->getDeclContext(); 6930563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor if (NamespaceDecl *Namespace = dyn_cast<NamespaceDecl>(Ctx)) 6940563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor R.Qualifier = NestedNameSpecifier::Create(SemaRef.Context, 0, Namespace); 6950563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor else if (TagDecl *Tag = dyn_cast<TagDecl>(Ctx)) 6960563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor R.Qualifier = NestedNameSpecifier::Create(SemaRef.Context, 0, false, 6970563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor SemaRef.Context.getTypeDeclType(Tag).getTypePtr()); 6980563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor else 6990563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor R.QualifierIsInformative = false; 7000563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor } 701eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor 70286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Insert this result into the set of results and into the current shadow 70386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // map. 704fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor SMap[R.Declaration->getDeclName()].Add(R.Declaration, Results.size()); 70586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Results.push_back(R); 70686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 70786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 7081ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregorvoid ResultBuilder::AddResult(Result R, DeclContext *CurContext, 7090cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor NamedDecl *Hiding, bool InBaseClass = false) { 710a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor if (R.Kind != Result::RK_Declaration) { 711a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor // For non-declaration results, just add the result. 712a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.push_back(R); 713a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor return; 714a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor } 715a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor 7161ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor // Look through using declarations. 7171ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor if (UsingShadowDecl *Using = dyn_cast<UsingShadowDecl>(R.Declaration)) { 7181ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor AddResult(Result(Using->getTargetDecl(), R.Qualifier), CurContext, Hiding); 7191ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor return; 7201ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor } 7211ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 72245bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor bool AsNestedNameSpecifier = false; 72345bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor if (!isInterestingDecl(R.Declaration, AsNestedNameSpecifier)) 7241ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor return; 7251ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 7261ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor if (Hiding && CheckHiddenResult(R, CurContext, Hiding)) 7271ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor return; 7281ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 7291ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor // Make sure that any given declaration only shows up in the result set once. 7301ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor if (!AllDeclsFound.insert(R.Declaration->getCanonicalDecl())) 7311ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor return; 7321ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 7331ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor // If the filter is for nested-name-specifiers, then this result starts a 7341ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor // nested-name-specifier. 73512e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor if (AsNestedNameSpecifier) { 7361ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor R.StartsNestedNameSpecifier = true; 73712e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor R.Priority = CCP_NestedNameSpecifier; 73812e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor } 7390cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor else if (Filter == &ResultBuilder::IsMember && !R.Qualifier && InBaseClass && 7400cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor isa<CXXRecordDecl>(R.Declaration->getDeclContext() 7410cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor ->getLookupContext())) 7420cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor R.QualifierIsInformative = true; 7430cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor 7441ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor // If this result is supposed to have an informative qualifier, add one. 7451ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor if (R.QualifierIsInformative && !R.Qualifier && 7461ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor !R.StartsNestedNameSpecifier) { 7471ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor DeclContext *Ctx = R.Declaration->getDeclContext(); 7481ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor if (NamespaceDecl *Namespace = dyn_cast<NamespaceDecl>(Ctx)) 7491ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor R.Qualifier = NestedNameSpecifier::Create(SemaRef.Context, 0, Namespace); 7501ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor else if (TagDecl *Tag = dyn_cast<TagDecl>(Ctx)) 7511ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor R.Qualifier = NestedNameSpecifier::Create(SemaRef.Context, 0, false, 75245bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor SemaRef.Context.getTypeDeclType(Tag).getTypePtr()); 7531ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor else 7541ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor R.QualifierIsInformative = false; 7551ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor } 7561ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 75712e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor // Adjust the priority if this result comes from a base class. 75812e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor if (InBaseClass) 75912e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor R.Priority += CCD_InBaseClass; 76012e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor 7611f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor if (!PreferredType.isNull()) 7621f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor AdjustResultPriorityForPreferredType(R); 7635ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 7641ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor // Insert this result into the set of results. 7651ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor Results.push_back(R); 7661ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor} 7671ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 768a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregorvoid ResultBuilder::AddResult(Result R) { 769a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor assert(R.Kind != Result::RK_Declaration && 770a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor "Declaration results need more context"); 771a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.push_back(R); 772a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor} 773a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor 77486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Enter into a new scope. 77586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorvoid ResultBuilder::EnterNewScope() { 77686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ShadowMaps.push_back(ShadowMap()); 77786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 77886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 77986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Exit from the current scope. 78086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorvoid ResultBuilder::ExitScope() { 781fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor for (ShadowMap::iterator E = ShadowMaps.back().begin(), 782fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor EEnd = ShadowMaps.back().end(); 783fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor E != EEnd; 784fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor ++E) 785fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor E->second.Destroy(); 786fbcb5d60d0cac6279ac0dd1411937218146237c7Douglas Gregor 78786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ShadowMaps.pop_back(); 78886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 78986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 790791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor/// \brief Determines whether this given declaration will be found by 791791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor/// ordinary name lookup. 792791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregorbool ResultBuilder::IsOrdinaryName(NamedDecl *ND) const { 7934710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor ND = cast<NamedDecl>(ND->getUnderlyingDecl()); 7944710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor 795791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor unsigned IDNS = Decl::IDNS_Ordinary; 796791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus) 7979b30b267e77d1778e1e9b7c44b6852489c2c5096Douglas Gregor IDNS |= Decl::IDNS_Tag | Decl::IDNS_Namespace | Decl::IDNS_Member; 7981ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor else if (SemaRef.getLangOptions().ObjC1 && isa<ObjCIvarDecl>(ND)) 7991ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor return true; 8001ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 801791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor return ND->getIdentifierNamespace() & IDNS; 802791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor} 803791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor 80401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor/// \brief Determines whether this given declaration will be found by 8054710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor/// ordinary name lookup but is not a type name. 8064710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregorbool ResultBuilder::IsOrdinaryNonTypeName(NamedDecl *ND) const { 8074710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor ND = cast<NamedDecl>(ND->getUnderlyingDecl()); 8084710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor if (isa<TypeDecl>(ND) || isa<ObjCInterfaceDecl>(ND)) 8094710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor return false; 8104710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor 8114710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor unsigned IDNS = Decl::IDNS_Ordinary; 8124710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus) 8139b30b267e77d1778e1e9b7c44b6852489c2c5096Douglas Gregor IDNS |= Decl::IDNS_Tag | Decl::IDNS_Namespace | Decl::IDNS_Member; 8144710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor else if (SemaRef.getLangOptions().ObjC1 && isa<ObjCIvarDecl>(ND)) 8154710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor return true; 8164710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor 8174710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor return ND->getIdentifierNamespace() & IDNS; 8184710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor} 8194710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor 820f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregorbool ResultBuilder::IsIntegralConstantValue(NamedDecl *ND) const { 821f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor if (!IsOrdinaryNonTypeName(ND)) 822f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor return 0; 823f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor 824f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor if (ValueDecl *VD = dyn_cast<ValueDecl>(ND->getUnderlyingDecl())) 825f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor if (VD->getType()->isIntegralOrEnumerationType()) 826f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor return true; 827f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor 828f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor return false; 829f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor} 830f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor 8314710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor/// \brief Determines whether this given declaration will be found by 83201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor/// ordinary name lookup. 83301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregorbool ResultBuilder::IsOrdinaryNonValueName(NamedDecl *ND) const { 8344710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor ND = cast<NamedDecl>(ND->getUnderlyingDecl()); 8354710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor 83601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor unsigned IDNS = Decl::IDNS_Ordinary; 83701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus) 8380d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCall IDNS |= Decl::IDNS_Tag | Decl::IDNS_Namespace; 83901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 84001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor return (ND->getIdentifierNamespace() & IDNS) && 8414710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor !isa<ValueDecl>(ND) && !isa<FunctionTemplateDecl>(ND) && 8424710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor !isa<ObjCPropertyDecl>(ND); 84301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor} 84401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 84586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Determines whether the given declaration is suitable as the 84686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// start of a C++ nested-name-specifier, e.g., a class or namespace. 84786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsNestedNameSpecifier(NamedDecl *ND) const { 84886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Allow us to find class templates, too. 84986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (ClassTemplateDecl *ClassTemplate = dyn_cast<ClassTemplateDecl>(ND)) 85086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ND = ClassTemplate->getTemplatedDecl(); 85186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 85286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return SemaRef.isAcceptableNestedNameSpecifier(ND); 85386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 85486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 85586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Determines whether the given declaration is an enumeration. 85686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsEnum(NamedDecl *ND) const { 85786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return isa<EnumDecl>(ND); 85886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 85986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 86086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Determines whether the given declaration is a class or struct. 86186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsClassOrStruct(NamedDecl *ND) const { 86286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Allow us to find class templates, too. 86386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (ClassTemplateDecl *ClassTemplate = dyn_cast<ClassTemplateDecl>(ND)) 86486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ND = ClassTemplate->getTemplatedDecl(); 86586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 86686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (RecordDecl *RD = dyn_cast<RecordDecl>(ND)) 867465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara return RD->getTagKind() == TTK_Class || 868465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara RD->getTagKind() == TTK_Struct; 86986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 87086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return false; 87186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 87286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 87386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Determines whether the given declaration is a union. 87486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsUnion(NamedDecl *ND) const { 87586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Allow us to find class templates, too. 87686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (ClassTemplateDecl *ClassTemplate = dyn_cast<ClassTemplateDecl>(ND)) 87786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ND = ClassTemplate->getTemplatedDecl(); 87886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 87986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (RecordDecl *RD = dyn_cast<RecordDecl>(ND)) 880465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara return RD->getTagKind() == TTK_Union; 88186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 88286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return false; 88386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 88486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 88586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Determines whether the given declaration is a namespace. 88686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsNamespace(NamedDecl *ND) const { 88786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return isa<NamespaceDecl>(ND); 88886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 88986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 89086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Determines whether the given declaration is a namespace or 89186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// namespace alias. 89286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsNamespaceOrAlias(NamedDecl *ND) const { 89386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return isa<NamespaceDecl>(ND) || isa<NamespaceAliasDecl>(ND); 89486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 89586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 8967628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor/// \brief Determines whether the given declaration is a type. 89786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorbool ResultBuilder::IsType(NamedDecl *ND) const { 89886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return isa<TypeDecl>(ND); 89986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 90086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 9017628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor/// \brief Determines which members of a class should be visible via 9027628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor/// "." or "->". Only value declarations, nested name specifiers, and 9037628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor/// using declarations thereof should show up. 904eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregorbool ResultBuilder::IsMember(NamedDecl *ND) const { 9057628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor if (UsingShadowDecl *Using = dyn_cast<UsingShadowDecl>(ND)) 9067628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor ND = Using->getTargetDecl(); 9077628294ee86c2f5459b6bf476434fdc8f4f7055eDouglas Gregor 908ce82196076cd15f5ecfa029fcda8b58dc0146cf1Douglas Gregor return isa<ValueDecl>(ND) || isa<FunctionTemplateDecl>(ND) || 909ce82196076cd15f5ecfa029fcda8b58dc0146cf1Douglas Gregor isa<ObjCPropertyDecl>(ND); 910eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor} 911eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor 9128e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregorstatic bool isObjCReceiverType(ASTContext &C, QualType T) { 9138e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor T = C.getCanonicalType(T); 9148e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor switch (T->getTypeClass()) { 9158e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor case Type::ObjCObject: 9168e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor case Type::ObjCInterface: 9178e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor case Type::ObjCObjectPointer: 9188e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor return true; 9198e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 9208e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor case Type::Builtin: 9218e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor switch (cast<BuiltinType>(T)->getKind()) { 9228e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor case BuiltinType::ObjCId: 9238e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor case BuiltinType::ObjCClass: 9248e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor case BuiltinType::ObjCSel: 9258e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor return true; 9268e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 9278e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor default: 9288e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor break; 9298e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor } 9308e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor return false; 9318e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 9328e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor default: 9338e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor break; 9348e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor } 9358e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 9368e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor if (!C.getLangOptions().CPlusPlus) 9378e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor return false; 9388e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 9398e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor // FIXME: We could perform more analysis here to determine whether a 9408e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor // particular class type has any conversions to Objective-C types. For now, 9418e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor // just accept all class types. 9428e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor return T->isDependentType() || T->isRecordType(); 9438e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor} 9448e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 9458e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregorbool ResultBuilder::IsObjCMessageReceiver(NamedDecl *ND) const { 9468e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor QualType T = getDeclUsageType(SemaRef.Context, ND); 9478e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor if (T.isNull()) 9488e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor return false; 9498e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 9508e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor T = SemaRef.Context.getBaseElementType(T); 9518e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor return isObjCReceiverType(SemaRef.Context, T); 9528e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor} 9538e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 954fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregorbool ResultBuilder::IsObjCCollection(NamedDecl *ND) const { 955fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor if ((SemaRef.getLangOptions().CPlusPlus && !IsOrdinaryName(ND)) || 956fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor (!SemaRef.getLangOptions().CPlusPlus && !IsOrdinaryNonTypeName(ND))) 957fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor return false; 958fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor 959fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor QualType T = getDeclUsageType(SemaRef.Context, ND); 960fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor if (T.isNull()) 961fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor return false; 962fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor 963fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor T = SemaRef.Context.getBaseElementType(T); 964fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor return T->isObjCObjectType() || T->isObjCObjectPointerType() || 965fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor T->isObjCIdType() || 966fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor (SemaRef.getLangOptions().CPlusPlus && T->isRecordType()); 967fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor} 9688e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 96980f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor/// \rief Determines whether the given declaration is an Objective-C 97080f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor/// instance variable. 97180f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregorbool ResultBuilder::IsObjCIvar(NamedDecl *ND) const { 97280f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor return isa<ObjCIvarDecl>(ND); 97380f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor} 97480f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor 9751ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregornamespace { 9761ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// \brief Visible declaration consumer that adds a code-completion result 9771ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor /// for each visible declaration. 9781ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor class CodeCompletionDeclConsumer : public VisibleDeclConsumer { 9791ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor ResultBuilder &Results; 9801ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor DeclContext *CurContext; 9811ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 9821ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor public: 9831ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor CodeCompletionDeclConsumer(ResultBuilder &Results, DeclContext *CurContext) 9841ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor : Results(Results), CurContext(CurContext) { } 9851ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 9860cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor virtual void FoundDecl(NamedDecl *ND, NamedDecl *Hiding, bool InBaseClass) { 9870cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor Results.AddResult(ND, CurContext, Hiding, InBaseClass); 9881ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor } 9891ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor }; 9901ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor} 9911ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor 99286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Add type specifiers for the current language as keyword results. 993bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddTypeSpecifierResults(const LangOptions &LangOpts, 99486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ResultBuilder &Results) { 99586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor typedef CodeCompleteConsumer::Result Result; 99612e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("short", CCP_Type)); 99712e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("long", CCP_Type)); 99812e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("signed", CCP_Type)); 99912e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("unsigned", CCP_Type)); 100012e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("void", CCP_Type)); 100112e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("char", CCP_Type)); 100212e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("int", CCP_Type)); 100312e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("float", CCP_Type)); 100412e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("double", CCP_Type)); 100512e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("enum", CCP_Type)); 100612e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("struct", CCP_Type)); 100712e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("union", CCP_Type)); 100812e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("const", CCP_Type)); 100912e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("volatile", CCP_Type)); 101001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 101186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (LangOpts.C99) { 101286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // C99-specific 101312e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("_Complex", CCP_Type)); 101412e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("_Imaginary", CCP_Type)); 101512e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("_Bool", CCP_Type)); 101612e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("restrict", CCP_Type)); 101786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 101886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 101986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (LangOpts.CPlusPlus) { 102086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // C++-specific 102112e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("bool", CCP_Type)); 102212e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("class", CCP_Type)); 102312e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("wchar_t", CCP_Type)); 102486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 1025c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // typename qualified-id 1026c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor CodeCompletionString *Pattern = new CodeCompletionString; 1027c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddTypedTextChunk("typename"); 1028c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 1029c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("qualifier"); 1030c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddTextChunk("::"); 1031c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("name"); 1032c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Results.AddResult(Result(Pattern)); 1033d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor 103486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (LangOpts.CPlusPlus0x) { 103512e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("auto", CCP_Type)); 103612e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("char16_t", CCP_Type)); 103712e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Results.AddResult(Result("char32_t", CCP_Type)); 1038c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor 1039c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor CodeCompletionString *Pattern = new CodeCompletionString; 1040c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddTypedTextChunk("decltype"); 1041c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 1042c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("expression"); 1043c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 1044c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Results.AddResult(Result(Pattern)); 104586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 104686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 104786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 104886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // GNU extensions 104986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (LangOpts.GNUMode) { 105086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // FIXME: Enable when we actually support decimal floating point. 1051a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor // Results.AddResult(Result("_Decimal32")); 1052a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor // Results.AddResult(Result("_Decimal64")); 1053a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor // Results.AddResult(Result("_Decimal128")); 105401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1055c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor CodeCompletionString *Pattern = new CodeCompletionString; 1056c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddTypedTextChunk("typeof"); 1057c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 1058c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("expression"); 1059c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Results.AddResult(Result(Pattern)); 1060c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor 1061c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern = new CodeCompletionString; 1062c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddTypedTextChunk("typeof"); 1063c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 1064c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("type"); 1065c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 1066c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Results.AddResult(Result(Pattern)); 106701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 106801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor} 106901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1070e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregorstatic void AddStorageSpecifiers(Action::ParserCompletionContext CCC, 107101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor const LangOptions &LangOpts, 107201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor ResultBuilder &Results) { 107301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor typedef CodeCompleteConsumer::Result Result; 107401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Note: we don't suggest either "auto" or "register", because both 107501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // are pointless as storage specifiers. Elsewhere, we suggest "auto" 107601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // in C++0x as a type specifier. 1077a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("extern")); 1078a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("static")); 107901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor} 108001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1081e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregorstatic void AddFunctionSpecifiers(Action::ParserCompletionContext CCC, 108201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor const LangOptions &LangOpts, 108301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor ResultBuilder &Results) { 108401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor typedef CodeCompleteConsumer::Result Result; 108501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor switch (CCC) { 1086e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_Class: 1087e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_MemberTemplate: 108801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (LangOpts.CPlusPlus) { 1089a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("explicit")); 1090a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("friend")); 1091a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("mutable")); 1092a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("virtual")); 109301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 109401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Fall through 109501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1096e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_ObjCInterface: 1097e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_ObjCImplementation: 1098e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_Namespace: 1099e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_Template: 110001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (LangOpts.CPlusPlus || LangOpts.C99) 1101a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("inline")); 110201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 110301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1104e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_ObjCInstanceVariableList: 1105e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_Expression: 1106e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_Statement: 1107e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_ForInit: 1108e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_Condition: 1109e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_RecoveryInFunction: 111001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 111101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 111201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor} 111301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1114bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCExpressionResults(ResultBuilder &Results, bool NeedAt); 1115bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCStatementResults(ResultBuilder &Results, bool NeedAt); 1116bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCVisibilityResults(const LangOptions &LangOpts, 1117c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor ResultBuilder &Results, 1118c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor bool NeedAt); 1119bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCImplementationResults(const LangOptions &LangOpts, 1120b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor ResultBuilder &Results, 1121b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor bool NeedAt); 1122bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCInterfaceResults(const LangOptions &LangOpts, 1123b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor ResultBuilder &Results, 1124b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor bool NeedAt); 1125bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCTopLevelResults(ResultBuilder &Results, bool NeedAt); 1126b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 1127c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregorstatic void AddTypedefResult(ResultBuilder &Results) { 1128c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor CodeCompletionString *Pattern = new CodeCompletionString; 1129c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddTypedTextChunk("typedef"); 1130c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 1131c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("type"); 1132c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 1133c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("name"); 1134c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Results.AddResult(CodeCompleteConsumer::Result(Pattern)); 1135c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor} 1136c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor 1137e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregorstatic bool WantTypesInContext(Action::ParserCompletionContext CCC, 11384710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor const LangOptions &LangOpts) { 11394710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor if (LangOpts.CPlusPlus) 11404710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor return true; 11414710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor 11424710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor switch (CCC) { 1143e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_Namespace: 1144e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_Class: 1145e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_ObjCInstanceVariableList: 1146e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_Template: 1147e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_MemberTemplate: 1148e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_Statement: 1149e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_RecoveryInFunction: 11504710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor return true; 11514710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor 1152e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_ObjCInterface: 1153e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_ObjCImplementation: 1154e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_Expression: 1155e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_Condition: 11564710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor return false; 11574710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor 1158e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_ForInit: 11594710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor return LangOpts.ObjC1 || LangOpts.C99; 11604710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor } 11614710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor 11624710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor return false; 11634710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor} 11644710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor 116501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor/// \brief Add language constructs that show up for "ordinary" names. 1166e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregorstatic void AddOrdinaryNameResults(Action::ParserCompletionContext CCC, 116701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Scope *S, 116801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Sema &SemaRef, 116901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor ResultBuilder &Results) { 117001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor typedef CodeCompleteConsumer::Result Result; 117101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor switch (CCC) { 1172e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_Namespace: 1173c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor if (SemaRef.getLangOptions().CPlusPlus) { 1174c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor CodeCompletionString *Pattern = 0; 1175c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor 1176c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor if (Results.includeCodePatterns()) { 1177c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // namespace <identifier> { declarations } 1178c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor CodeCompletionString *Pattern = new CodeCompletionString; 1179c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddTypedTextChunk("namespace"); 1180c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 1181c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("identifier"); 1182c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftBrace); 1183c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("declarations"); 1184c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_VerticalSpace); 1185c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightBrace); 1186c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Results.AddResult(Result(Pattern)); 1187c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor } 1188c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor 118901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // namespace identifier = identifier ; 119001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 119101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("namespace"); 119201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 1193c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("name"); 119401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_Equal); 1195c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("namespace"); 1196a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 119701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 119801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Using directives 119901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 120001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("using"); 120101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 120201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTextChunk("namespace"); 120301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 120401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("identifier"); 1205a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 120601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 120701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // asm(string-literal) 120801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 120901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("asm"); 121001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 121101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("string-literal"); 121201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 1213a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 121401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1215c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor if (Results.includeCodePatterns()) { 1216c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // Explicit template instantiation 1217c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern = new CodeCompletionString; 1218c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddTypedTextChunk("template"); 1219c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 1220c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("declaration"); 1221c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Results.AddResult(Result(Pattern)); 1222c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor } 122301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 1224b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 1225b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor if (SemaRef.getLangOptions().ObjC1) 1226bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCTopLevelResults(Results, true); 1227b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 1228c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor AddTypedefResult(Results); 122901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Fall through 123001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1231e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_Class: 1232c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor if (SemaRef.getLangOptions().CPlusPlus) { 123301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Using declaration 123401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor CodeCompletionString *Pattern = new CodeCompletionString; 123501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("using"); 123601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 1237c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("qualifier"); 1238c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddTextChunk("::"); 1239c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("name"); 1240a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 124101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1242c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // using typename qualifier::name (only in a dependent context) 124301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (SemaRef.CurContext->isDependentContext()) { 124401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 124501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("using"); 124601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 124701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTextChunk("typename"); 124801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 1249c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("qualifier"); 1250c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddTextChunk("::"); 1251c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("name"); 1252a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 125301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 125401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1255e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor if (CCC == Action::PCC_Class) { 1256c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor AddTypedefResult(Results); 1257c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor 125801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // public: 125901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 126001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("public"); 126101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_Colon); 1262a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 126301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 126401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // protected: 126501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 126601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("protected"); 126701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_Colon); 1268a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 126901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 127001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // private: 127101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 127201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("private"); 127301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_Colon); 1274a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 127501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 127601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 127701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Fall through 127801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1279e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_Template: 1280e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_MemberTemplate: 1281d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus && Results.includeCodePatterns()) { 128201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // template < parameters > 128301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor CodeCompletionString *Pattern = new CodeCompletionString; 128401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("template"); 128501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftAngle); 128601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("parameters"); 128701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightAngle); 1288a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 128901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 129001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1291bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddStorageSpecifiers(CCC, SemaRef.getLangOptions(), Results); 1292bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddFunctionSpecifiers(CCC, SemaRef.getLangOptions(), Results); 129301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 129401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1295e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_ObjCInterface: 1296bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCInterfaceResults(SemaRef.getLangOptions(), Results, true); 1297bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddStorageSpecifiers(CCC, SemaRef.getLangOptions(), Results); 1298bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddFunctionSpecifiers(CCC, SemaRef.getLangOptions(), Results); 1299b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor break; 1300b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 1301e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_ObjCImplementation: 1302bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCImplementationResults(SemaRef.getLangOptions(), Results, true); 1303bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddStorageSpecifiers(CCC, SemaRef.getLangOptions(), Results); 1304bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddFunctionSpecifiers(CCC, SemaRef.getLangOptions(), Results); 1305b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor break; 1306b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 1307e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_ObjCInstanceVariableList: 1308bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCVisibilityResults(SemaRef.getLangOptions(), Results, true); 1309c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor break; 1310c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor 1311e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_RecoveryInFunction: 1312e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_Statement: { 1313c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor AddTypedefResult(Results); 131401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 131501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor CodeCompletionString *Pattern = 0; 1316d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus && Results.includeCodePatterns()) { 131701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 131801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("try"); 131901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftBrace); 132001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("statements"); 132101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_VerticalSpace); 132201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightBrace); 132301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTextChunk("catch"); 132401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 132501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("declaration"); 132601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 132701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftBrace); 132801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("statements"); 132901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_VerticalSpace); 133001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightBrace); 1331a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 133201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 1333b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor if (SemaRef.getLangOptions().ObjC1) 1334bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCStatementResults(Results, true); 1335b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 1336d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor if (Results.includeCodePatterns()) { 1337d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor // if (condition) { statements } 1338d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern = new CodeCompletionString; 1339d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddTypedTextChunk("if"); 1340d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 1341d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus) 1342d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddPlaceholderChunk("condition"); 1343d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor else 1344d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddPlaceholderChunk("expression"); 1345d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 1346d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftBrace); 1347d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddPlaceholderChunk("statements"); 1348d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_VerticalSpace); 1349d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightBrace); 1350d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Results.AddResult(Result(Pattern)); 135101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1352d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor // switch (condition) { } 1353d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern = new CodeCompletionString; 1354d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddTypedTextChunk("switch"); 1355d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 1356d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus) 1357d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddPlaceholderChunk("condition"); 1358d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor else 1359d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddPlaceholderChunk("expression"); 1360d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 1361d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftBrace); 1362d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_VerticalSpace); 1363d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightBrace); 1364d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Results.AddResult(Result(Pattern)); 1365d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor } 1366d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor 136701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Switch-specific statements. 1368c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor if (!SemaRef.getSwitchStack().empty()) { 136901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // case expression: 137001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 137101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("case"); 1372c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 137301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("expression"); 137401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_Colon); 1375a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 137601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 137701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // default: 137801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 137901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("default"); 138001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_Colon); 1381a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 138201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 138301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1384d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor if (Results.includeCodePatterns()) { 1385d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor /// while (condition) { statements } 1386d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern = new CodeCompletionString; 1387d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddTypedTextChunk("while"); 1388d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 1389d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus) 1390d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddPlaceholderChunk("condition"); 1391d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor else 1392d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddPlaceholderChunk("expression"); 1393d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 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 Results.AddResult(Result(Pattern)); 139901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1400d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor // do { statements } while ( expression ); 1401d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern = new CodeCompletionString; 1402d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddTypedTextChunk("do"); 1403d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftBrace); 1404d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddPlaceholderChunk("statements"); 1405d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_VerticalSpace); 1406d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightBrace); 1407d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddTextChunk("while"); 1408d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 1409d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddPlaceholderChunk("expression"); 1410d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 1411d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Results.AddResult(Result(Pattern)); 141201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1413d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor // for ( for-init-statement ; condition ; expression ) { statements } 1414d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern = new CodeCompletionString; 1415d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddTypedTextChunk("for"); 1416d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 1417d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus || SemaRef.getLangOptions().C99) 1418d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddPlaceholderChunk("init-statement"); 1419d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor else 1420d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddPlaceholderChunk("init-expression"); 1421d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_SemiColon); 1422d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddPlaceholderChunk("condition"); 1423d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_SemiColon); 1424d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddPlaceholderChunk("inc-expression"); 1425d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 1426d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftBrace); 1427d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddPlaceholderChunk("statements"); 1428d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_VerticalSpace); 1429d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightBrace); 1430d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor Results.AddResult(Result(Pattern)); 1431d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor } 143201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 143301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (S->getContinueParent()) { 143401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // continue ; 143501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 143601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("continue"); 1437a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 143801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 143901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 144001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (S->getBreakParent()) { 144101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // break ; 144201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 144301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("break"); 1444a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 144501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 144601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 144701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // "return expression ;" or "return ;", depending on whether we 144801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // know the function is void or not. 144901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor bool isVoid = false; 145001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (FunctionDecl *Function = dyn_cast<FunctionDecl>(SemaRef.CurContext)) 145101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor isVoid = Function->getResultType()->isVoidType(); 145201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor else if (ObjCMethodDecl *Method 145301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor = dyn_cast<ObjCMethodDecl>(SemaRef.CurContext)) 145401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor isVoid = Method->getResultType()->isVoidType(); 14559ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor else if (SemaRef.getCurBlock() && 14569ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor !SemaRef.getCurBlock()->ReturnType.isNull()) 14579ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor isVoid = SemaRef.getCurBlock()->ReturnType->isVoidType(); 145801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern = new CodeCompletionString; 145901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddTypedTextChunk("return"); 14609329800d6f4c4ea8778aabd64cde1b712b290b00Douglas Gregor if (!isVoid) { 14619329800d6f4c4ea8778aabd64cde1b712b290b00Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 146201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Pattern->AddPlaceholderChunk("expression"); 14639329800d6f4c4ea8778aabd64cde1b712b290b00Douglas Gregor } 1464a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 146501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1466c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // goto identifier ; 1467c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern = new CodeCompletionString; 1468c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddTypedTextChunk("goto"); 1469c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 1470c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("label"); 1471c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Results.AddResult(Result(Pattern)); 147201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1473c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // Using directives 1474c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern = new CodeCompletionString; 1475c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddTypedTextChunk("using"); 1476c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 1477c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddTextChunk("namespace"); 1478c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 1479c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("identifier"); 1480c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Results.AddResult(Result(Pattern)); 148101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 148201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 148301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Fall through (for statement expressions). 1484e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_ForInit: 1485e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_Condition: 1486bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddStorageSpecifiers(CCC, SemaRef.getLangOptions(), Results); 148701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Fall through: conditions and statements can have expressions. 148801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1489e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_Expression: { 149001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor CodeCompletionString *Pattern = 0; 149101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus) { 149201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // 'this', if we're in a non-static member function. 149301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(SemaRef.CurContext)) 149401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (!Method->isStatic()) 1495a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("this")); 149601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 149701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // true, false 1498a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("true")); 1499a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("false")); 150001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1501c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // dynamic_cast < type-id > ( expression ) 1502c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern = new CodeCompletionString; 1503c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddTypedTextChunk("dynamic_cast"); 1504c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftAngle); 1505c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("type"); 1506c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightAngle); 1507c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 1508c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("expression"); 1509c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 1510c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Results.AddResult(Result(Pattern)); 1511c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor 1512c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // static_cast < type-id > ( expression ) 1513c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern = new CodeCompletionString; 1514c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddTypedTextChunk("static_cast"); 1515c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftAngle); 1516c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("type"); 1517c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightAngle); 1518c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 1519c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("expression"); 1520c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 1521c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Results.AddResult(Result(Pattern)); 1522d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor 1523c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // reinterpret_cast < type-id > ( expression ) 1524c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern = new CodeCompletionString; 1525c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddTypedTextChunk("reinterpret_cast"); 1526c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftAngle); 1527c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("type"); 1528c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightAngle); 1529c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 1530c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("expression"); 1531c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 1532c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Results.AddResult(Result(Pattern)); 1533d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor 1534c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // const_cast < type-id > ( expression ) 1535c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern = new CodeCompletionString; 1536c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddTypedTextChunk("const_cast"); 1537c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftAngle); 1538c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("type"); 1539c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightAngle); 1540c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 1541c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("expression"); 1542c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 1543c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Results.AddResult(Result(Pattern)); 1544d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor 1545c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // typeid ( expression-or-type ) 1546c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern = new CodeCompletionString; 1547c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddTypedTextChunk("typeid"); 1548c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 1549c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("expression-or-type"); 1550c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 1551c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Results.AddResult(Result(Pattern)); 155201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1553c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // new T ( ... ) 1554c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern = new CodeCompletionString; 1555c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddTypedTextChunk("new"); 1556c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 1557c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("type"); 1558c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 1559c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("expressions"); 1560c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 1561c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Results.AddResult(Result(Pattern)); 156201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1563c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // new T [ ] ( ... ) 1564c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern = new CodeCompletionString; 1565c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddTypedTextChunk("new"); 1566c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 1567c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("type"); 1568c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftBracket); 1569c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("size"); 1570c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightBracket); 1571c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 1572c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("expressions"); 1573c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 1574c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Results.AddResult(Result(Pattern)); 157501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1576c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // delete expression 1577c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern = new CodeCompletionString; 1578c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddTypedTextChunk("delete"); 1579c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 1580c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("expression"); 1581c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Results.AddResult(Result(Pattern)); 158201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1583c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // delete [] expression 1584c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern = new CodeCompletionString; 1585c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddTypedTextChunk("delete"); 1586c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 1587c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftBracket); 1588c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightBracket); 1589c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 1590c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("expression"); 1591c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Results.AddResult(Result(Pattern)); 1592c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor 1593c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // throw expression 1594c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern = new CodeCompletionString; 1595c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddTypedTextChunk("throw"); 1596c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 1597c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("expression"); 1598c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Results.AddResult(Result(Pattern)); 159912e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor 160012e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor // FIXME: Rethrow? 160101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 160201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 160301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (SemaRef.getLangOptions().ObjC1) { 160401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Add "super", if we're in an Objective-C class with a superclass. 1605681e256048cf9d3d226b9d0699f3df22c2500ef4Ted Kremenek if (ObjCMethodDecl *Method = SemaRef.getCurMethodDecl()) { 1606681e256048cf9d3d226b9d0699f3df22c2500ef4Ted Kremenek // The interface can be NULL. 1607681e256048cf9d3d226b9d0699f3df22c2500ef4Ted Kremenek if (ObjCInterfaceDecl *ID = Method->getClassInterface()) 1608681e256048cf9d3d226b9d0699f3df22c2500ef4Ted Kremenek if (ID->getSuperClass()) 1609681e256048cf9d3d226b9d0699f3df22c2500ef4Ted Kremenek Results.AddResult(Result("super")); 1610681e256048cf9d3d226b9d0699f3df22c2500ef4Ted Kremenek } 1611681e256048cf9d3d226b9d0699f3df22c2500ef4Ted Kremenek 1612bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCExpressionResults(Results, true); 161301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 161401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 1615c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // sizeof expression 1616c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern = new CodeCompletionString; 1617c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddTypedTextChunk("sizeof"); 1618c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 1619c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("expression-or-type"); 1620c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 1621c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Results.AddResult(Result(Pattern)); 162201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 162386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 162401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 162501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 16264710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor if (WantTypesInContext(CCC, SemaRef.getLangOptions())) 16274710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor AddTypeSpecifierResults(SemaRef.getLangOptions(), Results); 162801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 162901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor if (SemaRef.getLangOptions().CPlusPlus) 1630a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("operator")); 163186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 163286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 1633ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor/// \brief If the given declaration has an associated type, add it as a result 1634ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor/// type chunk. 1635ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregorstatic void AddResultTypeChunk(ASTContext &Context, 1636ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor NamedDecl *ND, 1637ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor CodeCompletionString *Result) { 1638ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor if (!ND) 1639ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor return; 1640ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor 1641ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor // Determine the type of the declaration (if it has a type). 1642ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor QualType T; 1643ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor if (FunctionDecl *Function = dyn_cast<FunctionDecl>(ND)) 1644ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor T = Function->getResultType(); 1645ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor else if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(ND)) 1646ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor T = Method->getResultType(); 1647ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor else if (FunctionTemplateDecl *FunTmpl = dyn_cast<FunctionTemplateDecl>(ND)) 1648ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor T = FunTmpl->getTemplatedDecl()->getResultType(); 1649ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor else if (EnumConstantDecl *Enumerator = dyn_cast<EnumConstantDecl>(ND)) 1650ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor T = Context.getTypeDeclType(cast<TypeDecl>(Enumerator->getDeclContext())); 1651ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor else if (isa<UnresolvedUsingValueDecl>(ND)) { 1652ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor /* Do nothing: ignore unresolved using declarations*/ 1653ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor } else if (ValueDecl *Value = dyn_cast<ValueDecl>(ND)) 1654ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor T = Value->getType(); 1655ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor else if (ObjCPropertyDecl *Property = dyn_cast<ObjCPropertyDecl>(ND)) 1656ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor T = Property->getType(); 1657ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor 1658ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor if (T.isNull() || Context.hasSameType(T, Context.DependentTy)) 1659ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor return; 1660ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor 166184139d6ef8967cfdb70d37378a7a65cc4827d44dDouglas Gregor PrintingPolicy Policy(Context.PrintingPolicy); 166284139d6ef8967cfdb70d37378a7a65cc4827d44dDouglas Gregor Policy.AnonymousTagLocations = false; 166384139d6ef8967cfdb70d37378a7a65cc4827d44dDouglas Gregor 1664ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor std::string TypeStr; 166584139d6ef8967cfdb70d37378a7a65cc4827d44dDouglas Gregor T.getAsStringInternal(TypeStr, Policy); 1666ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor Result->AddResultTypeChunk(TypeStr); 1667ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor} 1668ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor 1669aaa107acc8f906203101af259e8d764b5027700aDouglas Gregorstatic void MaybeAddSentinel(ASTContext &Context, NamedDecl *FunctionOrMethod, 1670aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor CodeCompletionString *Result) { 1671aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor if (SentinelAttr *Sentinel = FunctionOrMethod->getAttr<SentinelAttr>()) 1672aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor if (Sentinel->getSentinel() == 0) { 1673aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor if (Context.getLangOptions().ObjC1 && 1674aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor Context.Idents.get("nil").hasMacroDefinition()) 1675aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor Result->AddTextChunk(", nil"); 1676aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor else if (Context.Idents.get("NULL").hasMacroDefinition()) 1677aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor Result->AddTextChunk(", NULL"); 1678aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor else 1679aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor Result->AddTextChunk(", (void*)0"); 1680aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor } 1681aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor} 1682aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor 168386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Add function parameter chunks to the given code completion string. 168486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorstatic void AddFunctionParameterChunks(ASTContext &Context, 168586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor FunctionDecl *Function, 168686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor CodeCompletionString *Result) { 16870c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor typedef CodeCompletionString::Chunk Chunk; 16880c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 168986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor CodeCompletionString *CCStr = Result; 169086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 169186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor for (unsigned P = 0, N = Function->getNumParams(); P != N; ++P) { 169286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ParmVarDecl *Param = Function->getParamDecl(P); 169386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 169486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (Param->hasDefaultArg()) { 169586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // When we see an optional default argument, put that argument and 169686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // the remaining default arguments into a new, optional string. 169786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor CodeCompletionString *Opt = new CodeCompletionString; 169886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor CCStr->AddOptionalChunk(std::auto_ptr<CodeCompletionString>(Opt)); 169986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor CCStr = Opt; 170086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 170186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 170286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (P != 0) 17030c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor CCStr->AddChunk(Chunk(CodeCompletionString::CK_Comma)); 170486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 170586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Format the placeholder string. 170686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor std::string PlaceholderStr; 170786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (Param->getIdentifier()) 170886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr = Param->getIdentifier()->getName(); 170986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 171086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Param->getType().getAsStringInternal(PlaceholderStr, 171186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Context.PrintingPolicy); 171286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 171386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add the placeholder string. 1714660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer CCStr->AddPlaceholderChunk(PlaceholderStr); 171586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 1716b3d4525c65cf456d3f1f4338afdcac83afc7be02Douglas Gregor 1717b3d4525c65cf456d3f1f4338afdcac83afc7be02Douglas Gregor if (const FunctionProtoType *Proto 1718b3d4525c65cf456d3f1f4338afdcac83afc7be02Douglas Gregor = Function->getType()->getAs<FunctionProtoType>()) 1719aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor if (Proto->isVariadic()) { 1720b3d4525c65cf456d3f1f4338afdcac83afc7be02Douglas Gregor CCStr->AddPlaceholderChunk(", ..."); 1721aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor 1722aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor MaybeAddSentinel(Context, Function, CCStr); 1723aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor } 172486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 172586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 172686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief Add template parameter chunks to the given code completion string. 172786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregorstatic void AddTemplateParameterChunks(ASTContext &Context, 172886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor TemplateDecl *Template, 172986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor CodeCompletionString *Result, 173086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor unsigned MaxParameters = 0) { 17310c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor typedef CodeCompletionString::Chunk Chunk; 17320c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 173386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor CodeCompletionString *CCStr = Result; 173486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool FirstParameter = true; 173586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 173686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor TemplateParameterList *Params = Template->getTemplateParameters(); 173786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor TemplateParameterList::iterator PEnd = Params->end(); 173886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (MaxParameters) 173986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PEnd = Params->begin() + MaxParameters; 174086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor for (TemplateParameterList::iterator P = Params->begin(); P != PEnd; ++P) { 174186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool HasDefaultArg = false; 174286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor std::string PlaceholderStr; 174386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(*P)) { 174486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (TTP->wasDeclaredWithTypename()) 174586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr = "typename"; 174686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor else 174786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr = "class"; 174886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 174986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (TTP->getIdentifier()) { 175086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr += ' '; 175186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr += TTP->getIdentifier()->getName(); 175286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 175386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 175486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor HasDefaultArg = TTP->hasDefaultArgument(); 175586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } else if (NonTypeTemplateParmDecl *NTTP 175686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor = dyn_cast<NonTypeTemplateParmDecl>(*P)) { 175786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (NTTP->getIdentifier()) 175886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr = NTTP->getIdentifier()->getName(); 175986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NTTP->getType().getAsStringInternal(PlaceholderStr, 176086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Context.PrintingPolicy); 176186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor HasDefaultArg = NTTP->hasDefaultArgument(); 176286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } else { 176386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor assert(isa<TemplateTemplateParmDecl>(*P)); 176486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor TemplateTemplateParmDecl *TTP = cast<TemplateTemplateParmDecl>(*P); 176586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 176686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Since putting the template argument list into the placeholder would 176786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // be very, very long, we just use an abbreviation. 176886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr = "template<...> class"; 176986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (TTP->getIdentifier()) { 177086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr += ' '; 177186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor PlaceholderStr += TTP->getIdentifier()->getName(); 177286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 177386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 177486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor HasDefaultArg = TTP->hasDefaultArgument(); 177586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 177686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 177786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (HasDefaultArg) { 177886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // When we see an optional default argument, put that argument and 177986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // the remaining default arguments into a new, optional string. 178086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor CodeCompletionString *Opt = new CodeCompletionString; 178186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor CCStr->AddOptionalChunk(std::auto_ptr<CodeCompletionString>(Opt)); 178286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor CCStr = Opt; 178386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 178486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 178586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (FirstParameter) 178686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor FirstParameter = false; 178786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor else 17880c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor CCStr->AddChunk(Chunk(CodeCompletionString::CK_Comma)); 178986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 179086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add the placeholder string. 1791660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer CCStr->AddPlaceholderChunk(PlaceholderStr); 179286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 179386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 179486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 1795b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor/// \brief Add a qualifier to the given code-completion string, if the 1796b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor/// provided nested-name-specifier is non-NULL. 1797a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregorstatic void 1798a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas GregorAddQualifierToCompletionString(CodeCompletionString *Result, 1799a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor NestedNameSpecifier *Qualifier, 1800a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor bool QualifierIsInformative, 1801a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor ASTContext &Context) { 1802b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor if (!Qualifier) 1803b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor return; 1804b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor 1805b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor std::string PrintedNNS; 1806b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor { 1807b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor llvm::raw_string_ostream OS(PrintedNNS); 1808b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor Qualifier->print(OS, Context.PrintingPolicy); 1809b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor } 18100563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor if (QualifierIsInformative) 1811660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer Result->AddInformativeChunk(PrintedNNS); 18120563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor else 1813660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer Result->AddTextChunk(PrintedNNS); 1814b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor} 1815b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor 1816a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregorstatic void AddFunctionTypeQualsToCompletionString(CodeCompletionString *Result, 1817a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor FunctionDecl *Function) { 1818a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor const FunctionProtoType *Proto 1819a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor = Function->getType()->getAs<FunctionProtoType>(); 1820a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor if (!Proto || !Proto->getTypeQuals()) 1821a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor return; 1822a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor 1823a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor std::string QualsStr; 1824a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor if (Proto->getTypeQuals() & Qualifiers::Const) 1825a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor QualsStr += " const"; 1826a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor if (Proto->getTypeQuals() & Qualifiers::Volatile) 1827a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor QualsStr += " volatile"; 1828a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor if (Proto->getTypeQuals() & Qualifiers::Restrict) 1829a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor QualsStr += " restrict"; 1830a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor Result->AddInformativeChunk(QualsStr); 1831a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor} 1832a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor 183386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \brief If possible, create a new code completion string for the given 183486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// result. 183586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// 183686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// \returns Either a new, heap-allocated code completion string describing 183786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// how to use this result, or NULL to indicate that the string or name of the 183886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor/// result is all that is needed. 183986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas GregorCodeCompletionString * 18401abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas GregorCodeCompleteConsumer::Result::CreateCodeCompletionString(Sema &S, 18411abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor CodeCompletionString *Result) { 18420c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor typedef CodeCompletionString::Chunk Chunk; 18430c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 18442b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor if (Kind == RK_Pattern) 18451abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor return Pattern->Clone(Result); 18462b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 18471abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor if (!Result) 18481abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor Result = new CodeCompletionString; 18492b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 18502b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor if (Kind == RK_Keyword) { 18512b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor Result->AddTypedTextChunk(Keyword); 18522b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor return Result; 18532b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor } 185486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 18553f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor if (Kind == RK_Macro) { 18563f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor MacroInfo *MI = S.PP.getMacroInfo(Macro); 18572b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor assert(MI && "Not a macro?"); 18582b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 18592b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor Result->AddTypedTextChunk(Macro->getName()); 18602b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 18612b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor if (!MI->isFunctionLike()) 18622b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor return Result; 18633f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor 18643f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor // Format a function-like macro with placeholders for the arguments. 18650c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_LeftParen)); 18663f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor for (MacroInfo::arg_iterator A = MI->arg_begin(), AEnd = MI->arg_end(); 18673f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor A != AEnd; ++A) { 18683f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor if (A != MI->arg_begin()) 18690c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_Comma)); 18703f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor 18713f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor if (!MI->isVariadic() || A != AEnd - 1) { 18723f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor // Non-variadic argument. 1873660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer Result->AddPlaceholderChunk((*A)->getName()); 18743f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor continue; 18753f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor } 18763f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor 18773f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor // Variadic argument; cope with the different between GNU and C99 18783f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor // variadic macros, providing a single placeholder for the rest of the 18793f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor // arguments. 18803f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor if ((*A)->isStr("__VA_ARGS__")) 18813f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor Result->AddPlaceholderChunk("..."); 18823f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor else { 18833f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor std::string Arg = (*A)->getName(); 18843f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor Arg += "..."; 1885660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer Result->AddPlaceholderChunk(Arg); 18863f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor } 18873f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor } 18880c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_RightParen)); 18893f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor return Result; 18903f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor } 18913f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor 1892d8e8a58ee35ab334ab9d0c2154dca029c1822e8aDouglas Gregor assert(Kind == RK_Declaration && "Missed a result kind?"); 189386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NamedDecl *ND = Declaration; 189486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 18950c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor if (StartsNestedNameSpecifier) { 1896660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer Result->AddTypedTextChunk(ND->getNameAsString()); 18970c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddTextChunk("::"); 18980c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor return Result; 18990c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor } 19000c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 1901ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor AddResultTypeChunk(S.Context, ND, Result); 1902ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor 190386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (FunctionDecl *Function = dyn_cast<FunctionDecl>(ND)) { 19040563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative, 19050563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor S.Context); 1906660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer Result->AddTypedTextChunk(Function->getNameAsString()); 19070c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_LeftParen)); 190886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor AddFunctionParameterChunks(S.Context, Function, Result); 19090c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_RightParen)); 1910a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor AddFunctionTypeQualsToCompletionString(Result, Function); 191186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return Result; 191286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 191386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 191486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (FunctionTemplateDecl *FunTmpl = dyn_cast<FunctionTemplateDecl>(ND)) { 19150563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative, 19160563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor S.Context); 191786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor FunctionDecl *Function = FunTmpl->getTemplatedDecl(); 1918660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer Result->AddTypedTextChunk(Function->getNameAsString()); 191986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 192086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Figure out which template parameters are deduced (or have default 192186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // arguments). 192286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor llvm::SmallVector<bool, 16> Deduced; 192386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor S.MarkDeducedTemplateParameters(FunTmpl, Deduced); 192486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor unsigned LastDeducibleArgument; 192586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor for (LastDeducibleArgument = Deduced.size(); LastDeducibleArgument > 0; 192686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor --LastDeducibleArgument) { 192786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!Deduced[LastDeducibleArgument - 1]) { 192886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // C++0x: Figure out if the template argument has a default. If so, 192986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // the user doesn't need to type this argument. 193086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // FIXME: We need to abstract template parameters better! 193186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor bool HasDefaultArg = false; 193286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NamedDecl *Param = FunTmpl->getTemplateParameters()->getParam( 193386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor LastDeducibleArgument - 1); 193486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(Param)) 193586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor HasDefaultArg = TTP->hasDefaultArgument(); 193686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor else if (NonTypeTemplateParmDecl *NTTP 193786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor = dyn_cast<NonTypeTemplateParmDecl>(Param)) 193886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor HasDefaultArg = NTTP->hasDefaultArgument(); 193986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor else { 194086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor assert(isa<TemplateTemplateParmDecl>(Param)); 194186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor HasDefaultArg 19420c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor = cast<TemplateTemplateParmDecl>(Param)->hasDefaultArgument(); 194386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 194486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 194586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!HasDefaultArg) 194686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor break; 194786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 194886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 194986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 195086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (LastDeducibleArgument) { 195186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Some of the function template arguments cannot be deduced from a 195286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // function call, so we introduce an explicit template argument list 195386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // containing all of the arguments up to the first deducible argument. 19540c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_LeftAngle)); 195586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor AddTemplateParameterChunks(S.Context, FunTmpl, Result, 195686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor LastDeducibleArgument); 19570c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_RightAngle)); 195886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 195986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 196086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add the function parameters 19610c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_LeftParen)); 196286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor AddFunctionParameterChunks(S.Context, Function, Result); 19630c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_RightParen)); 1964a61a87980d64d1d49872a9a7eeca7eaeb7f95d30Douglas Gregor AddFunctionTypeQualsToCompletionString(Result, Function); 196586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return Result; 196686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 196786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 196886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (TemplateDecl *Template = dyn_cast<TemplateDecl>(ND)) { 19690563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative, 19700563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor S.Context); 1971660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer Result->AddTypedTextChunk(Template->getNameAsString()); 19720c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_LeftAngle)); 197386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor AddTemplateParameterChunks(S.Context, Template, Result); 19740c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_RightAngle)); 197586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return Result; 197686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 197786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 19789630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(ND)) { 19799630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor Selector Sel = Method->getSelector(); 19809630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor if (Sel.isUnarySelector()) { 19819630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor Result->AddTypedTextChunk(Sel.getIdentifierInfoForSlot(0)->getName()); 19829630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor return Result; 19839630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor } 19849630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor 1985d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor std::string SelName = Sel.getIdentifierInfoForSlot(0)->getName().str(); 1986d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor SelName += ':'; 1987d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor if (StartParameter == 0) 1988d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor Result->AddTypedTextChunk(SelName); 1989d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor else { 1990d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor Result->AddInformativeChunk(SelName); 1991d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor 1992d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor // If there is only one parameter, and we're past it, add an empty 1993d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor // typed-text chunk since there is nothing to type. 1994d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor if (Method->param_size() == 1) 1995d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor Result->AddTypedTextChunk(""); 1996d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor } 19979630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor unsigned Idx = 0; 19989630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor for (ObjCMethodDecl::param_iterator P = Method->param_begin(), 19999630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor PEnd = Method->param_end(); 20009630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor P != PEnd; (void)++P, ++Idx) { 20019630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor if (Idx > 0) { 2002d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor std::string Keyword; 2003d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor if (Idx > StartParameter) 2004834389b87451b24618513b907b4dfb5b00d211f3Douglas Gregor Result->AddChunk(CodeCompletionString::CK_HorizontalSpace); 20059630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor if (IdentifierInfo *II = Sel.getIdentifierInfoForSlot(Idx)) 20069630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor Keyword += II->getName().str(); 20079630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor Keyword += ":"; 20081f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor if (Idx < StartParameter || AllParametersAreInformative) 2009d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor Result->AddInformativeChunk(Keyword); 20101f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor else if (Idx == StartParameter) 2011d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor Result->AddTypedTextChunk(Keyword); 2012d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor else 2013d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor Result->AddTextChunk(Keyword); 20149630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor } 2015d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor 2016d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor // If we're before the starting parameter, skip the placeholder. 2017d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor if (Idx < StartParameter) 2018d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor continue; 20199630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor 20209630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor std::string Arg; 20219630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor (*P)->getType().getAsStringInternal(Arg, S.Context.PrintingPolicy); 20229630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor Arg = "(" + Arg + ")"; 20239630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor if (IdentifierInfo *II = (*P)->getIdentifier()) 20249630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor Arg += II->getName().str(); 20251f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor if (DeclaringEntity) 20261f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor Result->AddTextChunk(Arg); 20271f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor else if (AllParametersAreInformative) 20284ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Result->AddInformativeChunk(Arg); 20294ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor else 20304ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Result->AddPlaceholderChunk(Arg); 20319630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor } 20329630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor 20332a17af0c7e05500e25d4cc71341f1f232085ebeaDouglas Gregor if (Method->isVariadic()) { 20341f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor if (DeclaringEntity) 20351f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor Result->AddTextChunk(", ..."); 20361f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor else if (AllParametersAreInformative) 20372a17af0c7e05500e25d4cc71341f1f232085ebeaDouglas Gregor Result->AddInformativeChunk(", ..."); 20382a17af0c7e05500e25d4cc71341f1f232085ebeaDouglas Gregor else 20392a17af0c7e05500e25d4cc71341f1f232085ebeaDouglas Gregor Result->AddPlaceholderChunk(", ..."); 2040aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor 2041aaa107acc8f906203101af259e8d764b5027700aDouglas Gregor MaybeAddSentinel(S.Context, Method, Result); 20422a17af0c7e05500e25d4cc71341f1f232085ebeaDouglas Gregor } 20432a17af0c7e05500e25d4cc71341f1f232085ebeaDouglas Gregor 20449630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor return Result; 20459630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor } 20469630eb6e375c4477d7fd7fd72ddfa64bb6685a03Douglas Gregor 20472b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor if (Qualifier) 20480563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative, 20490563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor S.Context); 20502b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 20512b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor Result->AddTypedTextChunk(ND->getNameAsString()); 20522b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor return Result; 205386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 205486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 205586d802e03a267af79663990c39865c67e0645238Douglas GregorCodeCompletionString * 205686d802e03a267af79663990c39865c67e0645238Douglas GregorCodeCompleteConsumer::OverloadCandidate::CreateSignatureString( 205786d802e03a267af79663990c39865c67e0645238Douglas Gregor unsigned CurrentArg, 205886d802e03a267af79663990c39865c67e0645238Douglas Gregor Sema &S) const { 20590c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor typedef CodeCompletionString::Chunk Chunk; 20600c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 206186d802e03a267af79663990c39865c67e0645238Douglas Gregor CodeCompletionString *Result = new CodeCompletionString; 206286d802e03a267af79663990c39865c67e0645238Douglas Gregor FunctionDecl *FDecl = getFunction(); 2063ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor AddResultTypeChunk(S.Context, FDecl, Result); 206486d802e03a267af79663990c39865c67e0645238Douglas Gregor const FunctionProtoType *Proto 206586d802e03a267af79663990c39865c67e0645238Douglas Gregor = dyn_cast<FunctionProtoType>(getFunctionType()); 206686d802e03a267af79663990c39865c67e0645238Douglas Gregor if (!FDecl && !Proto) { 206786d802e03a267af79663990c39865c67e0645238Douglas Gregor // Function without a prototype. Just give the return type and a 206886d802e03a267af79663990c39865c67e0645238Douglas Gregor // highlighted ellipsis. 206986d802e03a267af79663990c39865c67e0645238Douglas Gregor const FunctionType *FT = getFunctionType(); 207086d802e03a267af79663990c39865c67e0645238Douglas Gregor Result->AddTextChunk( 2071660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer FT->getResultType().getAsString(S.Context.PrintingPolicy)); 20720c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_LeftParen)); 20730c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_CurrentParameter, "...")); 20740c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_RightParen)); 207586d802e03a267af79663990c39865c67e0645238Douglas Gregor return Result; 207686d802e03a267af79663990c39865c67e0645238Douglas Gregor } 207786d802e03a267af79663990c39865c67e0645238Douglas Gregor 207886d802e03a267af79663990c39865c67e0645238Douglas Gregor if (FDecl) 2079660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer Result->AddTextChunk(FDecl->getNameAsString()); 208086d802e03a267af79663990c39865c67e0645238Douglas Gregor else 208186d802e03a267af79663990c39865c67e0645238Douglas Gregor Result->AddTextChunk( 2082660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer Proto->getResultType().getAsString(S.Context.PrintingPolicy)); 208386d802e03a267af79663990c39865c67e0645238Douglas Gregor 20840c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_LeftParen)); 208586d802e03a267af79663990c39865c67e0645238Douglas Gregor unsigned NumParams = FDecl? FDecl->getNumParams() : Proto->getNumArgs(); 208686d802e03a267af79663990c39865c67e0645238Douglas Gregor for (unsigned I = 0; I != NumParams; ++I) { 208786d802e03a267af79663990c39865c67e0645238Douglas Gregor if (I) 20880c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_Comma)); 208986d802e03a267af79663990c39865c67e0645238Douglas Gregor 209086d802e03a267af79663990c39865c67e0645238Douglas Gregor std::string ArgString; 209186d802e03a267af79663990c39865c67e0645238Douglas Gregor QualType ArgType; 209286d802e03a267af79663990c39865c67e0645238Douglas Gregor 209386d802e03a267af79663990c39865c67e0645238Douglas Gregor if (FDecl) { 209486d802e03a267af79663990c39865c67e0645238Douglas Gregor ArgString = FDecl->getParamDecl(I)->getNameAsString(); 209586d802e03a267af79663990c39865c67e0645238Douglas Gregor ArgType = FDecl->getParamDecl(I)->getOriginalType(); 209686d802e03a267af79663990c39865c67e0645238Douglas Gregor } else { 209786d802e03a267af79663990c39865c67e0645238Douglas Gregor ArgType = Proto->getArgType(I); 209886d802e03a267af79663990c39865c67e0645238Douglas Gregor } 209986d802e03a267af79663990c39865c67e0645238Douglas Gregor 210086d802e03a267af79663990c39865c67e0645238Douglas Gregor ArgType.getAsStringInternal(ArgString, S.Context.PrintingPolicy); 210186d802e03a267af79663990c39865c67e0645238Douglas Gregor 210286d802e03a267af79663990c39865c67e0645238Douglas Gregor if (I == CurrentArg) 21030c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_CurrentParameter, 2104660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer ArgString)); 210586d802e03a267af79663990c39865c67e0645238Douglas Gregor else 2106660cc18ba28dac6785ab00350974b4ca57e62adaBenjamin Kramer Result->AddTextChunk(ArgString); 210786d802e03a267af79663990c39865c67e0645238Douglas Gregor } 210886d802e03a267af79663990c39865c67e0645238Douglas Gregor 210986d802e03a267af79663990c39865c67e0645238Douglas Gregor if (Proto && Proto->isVariadic()) { 21100c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_Comma)); 211186d802e03a267af79663990c39865c67e0645238Douglas Gregor if (CurrentArg < NumParams) 211286d802e03a267af79663990c39865c67e0645238Douglas Gregor Result->AddTextChunk("..."); 211386d802e03a267af79663990c39865c67e0645238Douglas Gregor else 21140c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_CurrentParameter, "...")); 211586d802e03a267af79663990c39865c67e0645238Douglas Gregor } 21160c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor Result->AddChunk(Chunk(CodeCompletionString::CK_RightParen)); 211786d802e03a267af79663990c39865c67e0645238Douglas Gregor 211886d802e03a267af79663990c39865c67e0645238Douglas Gregor return Result; 211986d802e03a267af79663990c39865c67e0645238Douglas Gregor} 212086d802e03a267af79663990c39865c67e0645238Douglas Gregor 212186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregornamespace { 212286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor struct SortCodeCompleteResult { 212386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor typedef CodeCompleteConsumer::Result Result; 212486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 2125ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor /// \brief Retrieve the name that should be used to order a result. 2126ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor /// 2127ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor /// If the name needs to be constructed as a string, that string will be 2128ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor /// saved into Saved and the returned StringRef will refer to it. 2129ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor static llvm::StringRef getOrderedName(const Result &R, 2130ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor std::string &Saved) { 2131ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor switch (R.Kind) { 2132ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor case Result::RK_Keyword: 2133ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor return R.Keyword; 2134ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor 2135ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor case Result::RK_Pattern: 2136ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor return R.Pattern->getTypedText(); 2137ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor 2138ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor case Result::RK_Macro: 2139ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor return R.Macro->getName(); 2140ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor 2141ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor case Result::RK_Declaration: 2142ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor // Handle declarations below. 2143ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor break; 214454f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor } 2145ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor 2146ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor DeclarationName Name = R.Declaration->getDeclName(); 214754f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor 2148ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor // If the name is a simple identifier (by far the common case), or a 2149ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor // zero-argument selector, just return a reference to that identifier. 2150ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor if (IdentifierInfo *Id = Name.getAsIdentifierInfo()) 2151ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor return Id->getName(); 2152ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor if (Name.isObjCZeroArgSelector()) 2153ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor if (IdentifierInfo *Id 2154ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor = Name.getObjCSelector().getIdentifierInfoForSlot(0)) 2155ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor return Id->getName(); 2156ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor 2157ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor Saved = Name.getAsString(); 2158ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor return Saved; 2159ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor } 2160ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor 2161ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor bool operator()(const Result &X, const Result &Y) const { 2162ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor std::string XSaved, YSaved; 2163ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor llvm::StringRef XStr = getOrderedName(X, XSaved); 2164ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor llvm::StringRef YStr = getOrderedName(Y, YSaved); 2165ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor int cmp = XStr.compare_lower(YStr); 2166ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor if (cmp) 2167ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor return cmp < 0; 216886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 216986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Non-hidden names precede hidden names. 217086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (X.Hidden != Y.Hidden) 217186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return !X.Hidden; 217286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 2173eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor // Non-nested-name-specifiers precede nested-name-specifiers. 2174eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor if (X.StartsNestedNameSpecifier != Y.StartsNestedNameSpecifier) 2175eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor return !X.StartsNestedNameSpecifier; 2176eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor 217786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return false; 217886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 217986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor }; 218086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 218186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 21821827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregorunsigned clang::getMacroUsagePriority(llvm::StringRef MacroName, 21831827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor bool PreferredTypeIsPointer) { 21841827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor unsigned Priority = CCP_Macro; 21851827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor 21861827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor // Treat the "nil" and "NULL" macros as null pointer constants. 21871827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor if (MacroName.equals("nil") || MacroName.equals("NULL")) { 21881827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor Priority = CCP_Constant; 21891827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor if (PreferredTypeIsPointer) 21901827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor Priority = Priority / CCF_SimilarTypeMatch; 21911827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor } 21921827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor 21931827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor return Priority; 21941827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor} 21951827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor 2196590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregorstatic void AddMacroResults(Preprocessor &PP, ResultBuilder &Results, 2197590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregor bool TargetTypeIsPointer = false) { 2198590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregor typedef CodeCompleteConsumer::Result Result; 2199590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregor 22003f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor Results.EnterNewScope(); 22010c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor for (Preprocessor::macro_iterator M = PP.macro_begin(), 22020c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor MEnd = PP.macro_end(); 2203590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregor M != MEnd; ++M) { 22041827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor Results.AddResult(Result(M->first, 22051827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor getMacroUsagePriority(M->first->getName(), 22061827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor TargetTypeIsPointer))); 2207590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregor } 22083f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor Results.ExitScope(); 22093f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor} 22103f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor 2211aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregorstatic void AddPrettyFunctionResults(const LangOptions &LangOpts, 2212aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor ResultBuilder &Results) { 2213aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor typedef CodeCompleteConsumer::Result Result; 2214aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor 2215aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor Results.EnterNewScope(); 2216aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor Results.AddResult(Result("__PRETTY_FUNCTION__", CCP_Constant)); 2217aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor Results.AddResult(Result("__FUNCTION__", CCP_Constant)); 2218aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor if (LangOpts.C99 || LangOpts.CPlusPlus0x) 2219aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor Results.AddResult(Result("__func__", CCP_Constant)); 2220aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor Results.ExitScope(); 2221aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor} 2222aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor 22233a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbarstatic void HandleCodeCompleteResults(Sema *S, 22243a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar CodeCompleteConsumer *CodeCompleter, 2225e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext Context, 2226e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompleteConsumer::Result *Results, 2227e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor unsigned NumResults) { 222886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor std::stable_sort(Results, Results + NumResults, SortCodeCompleteResult()); 222986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 223086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (CodeCompleter) 2231e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompleter->ProcessCodeCompleteResults(*S, Context, Results, NumResults); 223254f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor 223354f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor for (unsigned I = 0; I != NumResults; ++I) 223454f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor Results[I].Destroy(); 223586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor} 223686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 2237e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregorstatic enum CodeCompletionContext::Kind mapCodeCompletionContext(Sema &S, 2238e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Sema::ParserCompletionContext PCC) { 2239e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor switch (PCC) { 2240e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_Namespace: 2241e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor return CodeCompletionContext::CCC_TopLevel; 2242e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor 2243e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_Class: 2244e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor return CodeCompletionContext::CCC_ClassStructUnion; 2245e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor 2246e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_ObjCInterface: 2247e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor return CodeCompletionContext::CCC_ObjCInterface; 2248e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor 2249e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_ObjCImplementation: 2250e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor return CodeCompletionContext::CCC_ObjCImplementation; 2251e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor 2252e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_ObjCInstanceVariableList: 2253e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor return CodeCompletionContext::CCC_ObjCIvarList; 2254e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor 2255e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_Template: 2256e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_MemberTemplate: 2257e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_RecoveryInFunction: 2258e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor return CodeCompletionContext::CCC_Other; 2259e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor 2260e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_Expression: 2261e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_ForInit: 2262e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_Condition: 2263e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor return CodeCompletionContext::CCC_Expression; 2264e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor 2265e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case Action::PCC_Statement: 2266e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor return CodeCompletionContext::CCC_Statement; 2267e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor } 2268e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor 2269e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor return CodeCompletionContext::CCC_Other; 2270e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor} 2271e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor 227201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregorvoid Sema::CodeCompleteOrdinaryName(Scope *S, 2273e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor ParserCompletionContext CompletionContext) { 22742a7925c4abe45650f3ab27be09468e3a3a98084aDouglas Gregor typedef CodeCompleteConsumer::Result Result; 22752ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor ResultBuilder Results(*this); 227601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 227701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // Determine how to filter results, e.g., so that the names of 227801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // values (functions, enumerators, function templates, etc.) are 227901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor // only allowed where we can have an expression. 228001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor switch (CompletionContext) { 2281e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_Namespace: 2282e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_Class: 2283e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_ObjCInterface: 2284e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_ObjCImplementation: 2285e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_ObjCInstanceVariableList: 2286e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_Template: 2287e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_MemberTemplate: 228801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor Results.setFilter(&ResultBuilder::IsOrdinaryNonValueName); 228901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 229001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 2291e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_Expression: 2292e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_Statement: 2293e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_ForInit: 2294e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_Condition: 22954710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor if (WantTypesInContext(CompletionContext, getLangOptions())) 22964710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor Results.setFilter(&ResultBuilder::IsOrdinaryName); 22974710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor else 22984710e5b12b58dda87d82c5875f13ab9c8979cd8cDouglas Gregor Results.setFilter(&ResultBuilder::IsOrdinaryNonTypeName); 229901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 2300dc8453422bec3bbf70c03920e01498d75783d122Douglas Gregor 2301e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor case PCC_RecoveryInFunction: 2302dc8453422bec3bbf70c03920e01498d75783d122Douglas Gregor // Unfiltered 2303dc8453422bec3bbf70c03920e01498d75783d122Douglas Gregor break; 230401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor } 230501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 23061ca6ae865cc632e9f626faacd4937e666eb05f6bDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 23078071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 23088071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompleter->includeGlobals()); 23092a7925c4abe45650f3ab27be09468e3a3a98084aDouglas Gregor 23102a7925c4abe45650f3ab27be09468e3a3a98084aDouglas Gregor Results.EnterNewScope(); 2311bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddOrdinaryNameResults(CompletionContext, S, *this, Results); 23122a7925c4abe45650f3ab27be09468e3a3a98084aDouglas Gregor Results.ExitScope(); 23132a7925c4abe45650f3ab27be09468e3a3a98084aDouglas Gregor 2314aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor switch (CompletionContext) { 2315aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor case PCC_Expression: 2316aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor case PCC_Statement: 2317aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor case PCC_RecoveryInFunction: 2318aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor if (S->getFnParent()) 2319aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor AddPrettyFunctionResults(PP.getLangOptions(), Results); 2320aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor break; 2321aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor 2322aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor case PCC_Namespace: 2323aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor case PCC_Class: 2324aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor case PCC_ObjCInterface: 2325aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor case PCC_ObjCImplementation: 2326aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor case PCC_ObjCInstanceVariableList: 2327aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor case PCC_Template: 2328aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor case PCC_MemberTemplate: 2329aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor case PCC_ForInit: 2330aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor case PCC_Condition: 2331aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor break; 2332aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor } 2333aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor 23340c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor if (CodeCompleter->includeMacros()) 2335bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddMacroResults(PP, Results); 2336aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor 2337e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 2338e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor mapCodeCompletionContext(*this, CompletionContext), 2339e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 2340791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor} 2341791215b7a24666912c0b71175d2ca5ba082f666eDouglas Gregor 23422ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregorvoid Sema::CodeCompleteDeclarator(Scope *S, 23432ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor bool AllowNonIdentifiers, 23442ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor bool AllowNestedNameSpecifiers) { 23452ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor typedef CodeCompleteConsumer::Result Result; 23462ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor ResultBuilder Results(*this); 23472ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor Results.EnterNewScope(); 23482ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor 23492ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor // Type qualifiers can come after names. 23502ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor Results.AddResult(Result("const")); 23512ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor Results.AddResult(Result("volatile")); 23522ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor if (getLangOptions().C99) 23532ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor Results.AddResult(Result("restrict")); 23542ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor 23552ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor if (getLangOptions().CPlusPlus) { 23562ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor if (AllowNonIdentifiers) { 23572ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor Results.AddResult(Result("operator")); 23582ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor } 23592ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor 23602ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor // Add nested-name-specifiers. 23612ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor if (AllowNestedNameSpecifiers) { 23622ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor Results.allowNestedNameSpecifiers(); 23632ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 23642ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor LookupVisibleDecls(S, LookupNestedNameSpecifierName, Consumer, 23652ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor CodeCompleter->includeGlobals()); 23662ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor } 23672ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor } 23682ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor Results.ExitScope(); 23692ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor 23702ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 23712ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor AllowNestedNameSpecifiers 23722ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor ? CodeCompletionContext::CCC_PotentiallyQualifiedName 23732ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor : CodeCompletionContext::CCC_Name, 23742ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor Results.data(), Results.size()); 23752ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor} 23762ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor 2377fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregorstruct Sema::CodeCompleteExpressionData { 2378fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor CodeCompleteExpressionData(QualType PreferredType = QualType()) 2379fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor : PreferredType(PreferredType), IntegralConstantExpression(false), 2380fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor ObjCCollection(false) { } 2381fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor 2382fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor QualType PreferredType; 2383fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor bool IntegralConstantExpression; 2384fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor bool ObjCCollection; 2385fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor llvm::SmallVector<Decl *, 4> IgnoreDecls; 2386fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor}; 2387fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor 23885ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor/// \brief Perform code-completion in an expression context when we know what 23895ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor/// type we're looking for. 2390f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor/// 2391f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor/// \param IntegralConstantExpression Only permit integral constant 2392f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor/// expressions. 2393fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregorvoid Sema::CodeCompleteExpression(Scope *S, 2394fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor const CodeCompleteExpressionData &Data) { 23955ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor typedef CodeCompleteConsumer::Result Result; 23965ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor ResultBuilder Results(*this); 23975ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 2398fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor if (Data.ObjCCollection) 2399fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor Results.setFilter(&ResultBuilder::IsObjCCollection); 2400fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor else if (Data.IntegralConstantExpression) 2401f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor Results.setFilter(&ResultBuilder::IsIntegralConstantValue); 2402e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor else if (WantTypesInContext(PCC_Expression, getLangOptions())) 24035ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor Results.setFilter(&ResultBuilder::IsOrdinaryName); 24045ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor else 24055ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor Results.setFilter(&ResultBuilder::IsOrdinaryNonTypeName); 2406fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor 2407fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor if (!Data.PreferredType.isNull()) 2408fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor Results.setPreferredType(Data.PreferredType.getNonReferenceType()); 2409fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor 2410fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor // Ignore any declarations that we were told that we don't care about. 2411fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor for (unsigned I = 0, N = Data.IgnoreDecls.size(); I != N; ++I) 2412fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor Results.Ignore(Data.IgnoreDecls[I]); 24135ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 24145ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 24158071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 24168071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompleter->includeGlobals()); 24175ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 24185ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor Results.EnterNewScope(); 2419e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor AddOrdinaryNameResults(PCC_Expression, S, *this, Results); 24205ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor Results.ExitScope(); 24215ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 2422590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregor bool PreferredTypeIsPointer = false; 2423fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor if (!Data.PreferredType.isNull()) 2424fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor PreferredTypeIsPointer = Data.PreferredType->isAnyPointerType() 2425fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor || Data.PreferredType->isMemberPointerType() 2426fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor || Data.PreferredType->isBlockPointerType(); 2427590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregor 2428aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor if (S->getFnParent() && 2429aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor !Data.ObjCCollection && 2430aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor !Data.IntegralConstantExpression) 2431aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor AddPrettyFunctionResults(PP.getLangOptions(), Results); 2432aa5f77b2c914b68e6a3737c93db3598907bc64abDouglas Gregor 24335ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (CodeCompleter->includeMacros()) 2434590c7d5e79d350162d485f039018cbeb47f3b547Douglas Gregor AddMacroResults(PP, Results, PreferredTypeIsPointer); 2435e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 2436fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor CodeCompletionContext(CodeCompletionContext::CCC_Expression, 2437fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor Data.PreferredType), 2438e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 24395ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor} 24405ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 24415ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 244295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregorstatic void AddObjCProperties(ObjCContainerDecl *Container, 2443322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor bool AllowCategories, 244495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor DeclContext *CurContext, 244595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor ResultBuilder &Results) { 244695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor typedef CodeCompleteConsumer::Result Result; 244795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 244895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Add properties in this container. 244995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor for (ObjCContainerDecl::prop_iterator P = Container->prop_begin(), 245095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor PEnd = Container->prop_end(); 245195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor P != PEnd; 245295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor ++P) 245395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor Results.MaybeAddResult(Result(*P, 0), CurContext); 245495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 245595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Add properties in referenced protocols. 245695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) { 245795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor for (ObjCProtocolDecl::protocol_iterator P = Protocol->protocol_begin(), 245895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor PEnd = Protocol->protocol_end(); 245995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor P != PEnd; ++P) 2460322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor AddObjCProperties(*P, AllowCategories, CurContext, Results); 246195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } else if (ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container)){ 2462322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor if (AllowCategories) { 2463322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Look through categories. 2464322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor for (ObjCCategoryDecl *Category = IFace->getCategoryList(); 2465322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Category; Category = Category->getNextClassCategory()) 2466322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor AddObjCProperties(Category, AllowCategories, CurContext, Results); 2467322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor } 246895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 246995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Look through protocols. 247095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor for (ObjCInterfaceDecl::protocol_iterator I = IFace->protocol_begin(), 247195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor E = IFace->protocol_end(); 247295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor I != E; ++I) 2473322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor AddObjCProperties(*I, AllowCategories, CurContext, Results); 247495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 247595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Look in the superclass. 247695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (IFace->getSuperClass()) 2477322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor AddObjCProperties(IFace->getSuperClass(), AllowCategories, CurContext, 2478322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Results); 247995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } else if (const ObjCCategoryDecl *Category 248095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor = dyn_cast<ObjCCategoryDecl>(Container)) { 248195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Look through protocols. 248295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor for (ObjCInterfaceDecl::protocol_iterator P = Category->protocol_begin(), 248395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor PEnd = Category->protocol_end(); 248495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor P != PEnd; ++P) 2485322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor AddObjCProperties(*P, AllowCategories, CurContext, Results); 248695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } 248795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor} 248895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 248981b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregorvoid Sema::CodeCompleteMemberReferenceExpr(Scope *S, ExprTy *BaseE, 249081b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor SourceLocation OpLoc, 249181b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor bool IsArrow) { 249281b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor if (!BaseE || !CodeCompleter) 249381b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor return; 249481b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor 249586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor typedef CodeCompleteConsumer::Result Result; 249686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 249781b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor Expr *Base = static_cast<Expr *>(BaseE); 249881b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor QualType BaseType = Base->getType(); 249986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 250086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (IsArrow) { 250186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (const PointerType *Ptr = BaseType->getAs<PointerType>()) 250286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor BaseType = Ptr->getPointeeType(); 250386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor else if (BaseType->isObjCObjectPointerType()) 250486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor /*Do nothing*/ ; 250586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor else 250686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return; 250786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 250886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 2509eb5758bbfdc5088cd63748451000ec6983ad9bb8Douglas Gregor ResultBuilder Results(*this, &ResultBuilder::IsMember); 251095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor Results.EnterNewScope(); 251195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (const RecordType *Record = BaseType->getAs<RecordType>()) { 251295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Access to a C/C++ class, struct, or union. 251345bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor Results.allowNestedNameSpecifiers(); 25140cc8404f8cf320da140e560899e1560bce80fe8cDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 25158071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(Record->getDecl(), LookupMemberName, Consumer, 25168071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompleter->includeGlobals()); 25173a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar 251895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (getLangOptions().CPlusPlus) { 251995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (!Results.empty()) { 252095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // The "template" keyword can follow "->" or "." in the grammar. 252195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // However, we only want to suggest the template keyword if something 252295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // is dependent. 252395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor bool IsDependent = BaseType->isDependentType(); 252495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (!IsDependent) { 252595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor for (Scope *DepScope = S; DepScope; DepScope = DepScope->getParent()) 252695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (DeclContext *Ctx = (DeclContext *)DepScope->getEntity()) { 252795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor IsDependent = Ctx->isDependentContext(); 252895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor break; 252995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } 253095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } 25313a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar 253295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (IsDependent) 2533a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result("template")); 253486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 253595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } 253695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } else if (!IsArrow && BaseType->getAsObjCInterfacePointerType()) { 253795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Objective-C property reference. 253895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 253995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Add property results based on our interface. 254095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor const ObjCObjectPointerType *ObjCPtr 254195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor = BaseType->getAsObjCInterfacePointerType(); 254295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor assert(ObjCPtr && "Non-NULL pointer guaranteed above!"); 2543322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor AddObjCProperties(ObjCPtr->getInterfaceDecl(), true, CurContext, Results); 254495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 254595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Add properties from the protocols in a qualified interface. 254695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor for (ObjCObjectPointerType::qual_iterator I = ObjCPtr->qual_begin(), 254795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor E = ObjCPtr->qual_end(); 254895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor I != E; ++I) 2549322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor AddObjCProperties(*I, true, CurContext, Results); 255095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor } else if ((IsArrow && BaseType->isObjCObjectPointerType()) || 2551c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall (!IsArrow && BaseType->isObjCObjectType())) { 255295ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Objective-C instance variable access. 255395ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor ObjCInterfaceDecl *Class = 0; 255495ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor if (const ObjCObjectPointerType *ObjCPtr 255595ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor = BaseType->getAs<ObjCObjectPointerType>()) 255695ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor Class = ObjCPtr->getInterfaceDecl(); 255795ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor else 2558c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall Class = BaseType->getAs<ObjCObjectType>()->getInterface(); 255995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 256095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // Add all ivars from this class and its superclasses. 256180f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor if (Class) { 256280f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 256380f4f4ce5a4c1416492ca6835cc85bb7e538ffc9Douglas Gregor Results.setFilter(&ResultBuilder::IsObjCIvar); 25648071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(Class, LookupMemberName, Consumer, 25658071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompleter->includeGlobals()); 256686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 256786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 256895ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 256995ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor // FIXME: How do we cope with isa? 257095ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor 257195ac6556a5dfc504491103c37f9aa05b303d2729Douglas Gregor Results.ExitScope(); 25723a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar 25733a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar // Hand off the results found for code completion. 2574e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 2575e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext(CodeCompletionContext::CCC_MemberAccess, 2576e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor BaseType), 2577e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 257881b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor} 257981b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor 2580374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregorvoid Sema::CodeCompleteTag(Scope *S, unsigned TagSpec) { 2581374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor if (!CodeCompleter) 2582374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor return; 2583374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor 258486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor typedef CodeCompleteConsumer::Result Result; 258586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ResultBuilder::LookupFilter Filter = 0; 2586e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor enum CodeCompletionContext::Kind ContextKind 2587e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor = CodeCompletionContext::CCC_Other; 2588374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor switch ((DeclSpec::TST)TagSpec) { 2589374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor case DeclSpec::TST_enum: 259086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Filter = &ResultBuilder::IsEnum; 2591e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor ContextKind = CodeCompletionContext::CCC_EnumTag; 2592374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor break; 2593374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor 2594374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor case DeclSpec::TST_union: 259586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Filter = &ResultBuilder::IsUnion; 2596e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor ContextKind = CodeCompletionContext::CCC_UnionTag; 2597374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor break; 2598374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor 2599374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor case DeclSpec::TST_struct: 2600374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor case DeclSpec::TST_class: 260186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Filter = &ResultBuilder::IsClassOrStruct; 2602e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor ContextKind = CodeCompletionContext::CCC_ClassOrStructTag; 2603374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor break; 2604374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor 2605374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor default: 2606374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor assert(false && "Unknown type specifier kind in CodeCompleteTag"); 2607374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor return; 2608374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor } 260986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 26100d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCall ResultBuilder Results(*this); 26115d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 26120d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCall 26130d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCall // First pass: look for tags. 26140d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCall Results.setFilter(Filter); 26158071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(S, LookupTagName, Consumer, 26168071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompleter->includeGlobals()); 26170d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCall 26188071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor if (CodeCompleter->includeGlobals()) { 26198071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor // Second pass: look for nested name specifiers. 26208071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor Results.setFilter(&ResultBuilder::IsNestedNameSpecifier); 26218071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(S, LookupNestedNameSpecifierName, Consumer); 26228071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor } 262386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 2624e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, ContextKind, 2625e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 2626374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor} 2627374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor 26283e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregorvoid Sema::CodeCompleteCase(Scope *S) { 26293e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor if (getSwitchStack().empty() || !CodeCompleter) 26303e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor return; 26313e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 26323e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor SwitchStmt *Switch = getSwitchStack().back(); 2633f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor if (!Switch->getCond()->getType()->isEnumeralType()) { 2634fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor CodeCompleteExpressionData Data(Switch->getCond()->getType()); 2635fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor Data.IntegralConstantExpression = true; 2636fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor CodeCompleteExpression(S, Data); 26373e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor return; 2638f9578436414e4a5e4af8b77567b89c1679f99519Douglas Gregor } 26393e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 26403e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // Code-complete the cases of a switch statement over an enumeration type 26413e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // by providing the list of 26423e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor EnumDecl *Enum = Switch->getCond()->getType()->getAs<EnumType>()->getDecl(); 26433e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 26443e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // Determine which enumerators we have already seen in the switch statement. 26453e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // FIXME: Ideally, we would also be able to look *past* the code-completion 26463e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // token, in case we are code-completing in the middle of the switch and not 26473e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // at the end. However, we aren't able to do so at the moment. 26483e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor llvm::SmallPtrSet<EnumConstantDecl *, 8> EnumeratorsSeen; 2649b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor NestedNameSpecifier *Qualifier = 0; 26503e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor for (SwitchCase *SC = Switch->getSwitchCaseList(); SC; 26513e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor SC = SC->getNextSwitchCase()) { 26523e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor CaseStmt *Case = dyn_cast<CaseStmt>(SC); 26533e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor if (!Case) 26543e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor continue; 26553e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 26563e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor Expr *CaseVal = Case->getLHS()->IgnoreParenCasts(); 26573e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(CaseVal)) 26583e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor if (EnumConstantDecl *Enumerator 26593e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor = dyn_cast<EnumConstantDecl>(DRE->getDecl())) { 26603e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // We look into the AST of the case statement to determine which 26613e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // enumerator was named. Alternatively, we could compute the value of 26623e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // the integral constant expression, then compare it against the 26633e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // values of each enumerator. However, value-based approach would not 26643e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // work as well with C++ templates where enumerators declared within a 26653e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // template are type- and value-dependent. 26663e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor EnumeratorsSeen.insert(Enumerator); 26673e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 2668b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // If this is a qualified-id, keep track of the nested-name-specifier 2669b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // so that we can reproduce it as part of code completion, e.g., 26703e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // 26713e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // switch (TagD.getKind()) { 26723e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // case TagDecl::TK_enum: 26733e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // break; 26743e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // case XXX 26753e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // 2676b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // At the XXX, our completions are TagDecl::TK_union, 26773e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // TagDecl::TK_struct, and TagDecl::TK_class, rather than TK_union, 26783e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // TK_struct, and TK_class. 2679a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor Qualifier = DRE->getQualifier(); 26803e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor } 26813e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor } 26823e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 2683b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor if (getLangOptions().CPlusPlus && !Qualifier && EnumeratorsSeen.empty()) { 2684b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // If there are no prior enumerators in C++, check whether we have to 2685b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // qualify the names of the enumerators that we suggest, because they 2686b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // may not be visible in this scope. 2687b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor Qualifier = getRequiredQualification(Context, CurContext, 2688b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor Enum->getDeclContext()); 2689b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor 2690b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor // FIXME: Scoped enums need to start with "EnumDecl" as the context! 2691b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor } 2692b9d0ef76347574a147b8456b018fe94dc1e2be26Douglas Gregor 26933e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor // Add any enumerators that have not yet been mentioned. 26943e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor ResultBuilder Results(*this); 26953e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor Results.EnterNewScope(); 26963e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor for (EnumDecl::enumerator_iterator E = Enum->enumerator_begin(), 26973e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor EEnd = Enum->enumerator_end(); 26983e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor E != EEnd; ++E) { 26993e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor if (EnumeratorsSeen.count(*E)) 27003e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor continue; 27013e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 2702608300be1972c43fe99154d25d62d697e7c0a0c2Douglas Gregor Results.AddResult(CodeCompleteConsumer::Result(*E, Qualifier), 2703608300be1972c43fe99154d25d62d697e7c0a0c2Douglas Gregor CurContext, 0, false); 27043e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor } 27053e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor Results.ExitScope(); 27062f880e47ca32d007d7e9e5ff5efa05f5c3432744Douglas Gregor 27070c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor if (CodeCompleter->includeMacros()) 2708bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddMacroResults(PP, Results); 2709e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 2710e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Expression, 2711e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 27123e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor} 27133e1005f085006dfb3545f0c54ac5e22483137c7dDouglas Gregor 27149c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregornamespace { 27159c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor struct IsBetterOverloadCandidate { 27169c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor Sema &S; 27175769d6195087229770d7ac90449443e026c47103John McCall SourceLocation Loc; 27189c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 27199c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor public: 27205769d6195087229770d7ac90449443e026c47103John McCall explicit IsBetterOverloadCandidate(Sema &S, SourceLocation Loc) 27215769d6195087229770d7ac90449443e026c47103John McCall : S(S), Loc(Loc) { } 27229c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 27239c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor bool 27249c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor operator()(const OverloadCandidate &X, const OverloadCandidate &Y) const { 27255769d6195087229770d7ac90449443e026c47103John McCall return S.isBetterOverloadCandidate(X, Y, Loc); 27269c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor } 27279c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor }; 27289c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor} 27299c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 2730d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregorstatic bool anyNullArguments(Expr **Args, unsigned NumArgs) { 2731d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor if (NumArgs && !Args) 2732d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor return true; 2733d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor 2734d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor for (unsigned I = 0; I != NumArgs; ++I) 2735d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor if (!Args[I]) 2736d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor return true; 2737d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor 2738d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor return false; 2739d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor} 2740d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor 27419c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregorvoid Sema::CodeCompleteCall(Scope *S, ExprTy *FnIn, 27429c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor ExprTy **ArgsIn, unsigned NumArgs) { 27439c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor if (!CodeCompleter) 27449c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor return; 2745ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor 2746ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor // When we're code-completing for a call, we fall back to ordinary 2747ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor // name code-completion whenever we can't produce specific 2748ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor // results. We may want to revisit this strategy in the future, 2749ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor // e.g., by merging the two kinds of results. 2750ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor 27519c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor Expr *Fn = (Expr *)FnIn; 27529c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor Expr **Args = (Expr **)ArgsIn; 2753ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor 27549c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor // Ignore type-dependent call expressions entirely. 2755d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor if (!Fn || Fn->isTypeDependent() || anyNullArguments(Args, NumArgs) || 2756ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor Expr::hasAnyTypeDependentArguments(Args, NumArgs)) { 2757e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompleteOrdinaryName(S, PCC_Expression); 27589c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor return; 2759ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor } 27609c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 27613b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall // Build an overload candidate set based on the functions we find. 27625769d6195087229770d7ac90449443e026c47103John McCall SourceLocation Loc = Fn->getExprLoc(); 27635769d6195087229770d7ac90449443e026c47103John McCall OverloadCandidateSet CandidateSet(Loc); 27643b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall 27659c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor // FIXME: What if we're calling something that isn't a function declaration? 27669c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor // FIXME: What if we're calling a pseudo-destructor? 27679c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor // FIXME: What if we're calling a member function? 27689c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 2769c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor typedef CodeCompleteConsumer::OverloadCandidate ResultCandidate; 2770c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor llvm::SmallVector<ResultCandidate, 8> Results; 2771c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor 27723b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall Expr *NakedFn = Fn->IgnoreParenCasts(); 27733b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(NakedFn)) 27743b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall AddOverloadedCallCandidates(ULE, Args, NumArgs, CandidateSet, 27753b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall /*PartialOverloading=*/ true); 27763b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall else if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(NakedFn)) { 27773b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall FunctionDecl *FDecl = dyn_cast<FunctionDecl>(DRE->getDecl()); 2778c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor if (FDecl) { 2779d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor if (!getLangOptions().CPlusPlus || 2780d28dcd76c78d17ff6196893761cc9c71d97cc02fDouglas Gregor !FDecl->getType()->getAs<FunctionProtoType>()) 2781c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor Results.push_back(ResultCandidate(FDecl)); 2782c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor else 278386820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall // FIXME: access? 27849aa472c45d2bd81b7b52c225e8acc560d716db97John McCall AddOverloadCandidate(FDecl, DeclAccessPair::make(FDecl, AS_none), 27859aa472c45d2bd81b7b52c225e8acc560d716db97John McCall Args, NumArgs, CandidateSet, 2786c27d6c58b2c1a7fecfb53c4f4016af6773a9d5baDouglas Gregor false, /*PartialOverloading*/true); 2787c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor } 27883b4294e5c1e904a2e0f74449dbc3f52f69cc8e9fJohn McCall } 27899c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 27905ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor QualType ParamType; 27915ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 2792c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor if (!CandidateSet.empty()) { 2793c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor // Sort the overload candidate set by placing the best overloads first. 2794c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor std::stable_sort(CandidateSet.begin(), CandidateSet.end(), 27955769d6195087229770d7ac90449443e026c47103John McCall IsBetterOverloadCandidate(*this, Loc)); 2796c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor 2797c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor // Add the remaining viable overload candidates as code-completion reslults. 2798c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor for (OverloadCandidateSet::iterator Cand = CandidateSet.begin(), 2799c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor CandEnd = CandidateSet.end(); 2800c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor Cand != CandEnd; ++Cand) { 2801c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor if (Cand->Viable) 2802c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor Results.push_back(ResultCandidate(Cand->Function)); 2803c0265406a82d391a5fc60d16dd1c6cd61a92cfceDouglas Gregor } 28045ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 28055ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor // From the viable candidates, try to determine the type of this parameter. 28065ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor for (unsigned I = 0, N = Results.size(); I != N; ++I) { 28075ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (const FunctionType *FType = Results[I].getFunctionType()) 28085ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (const FunctionProtoType *Proto = dyn_cast<FunctionProtoType>(FType)) 28095ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (NumArgs < Proto->getNumArgs()) { 28105ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (ParamType.isNull()) 28115ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor ParamType = Proto->getArgType(NumArgs); 28125ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor else if (!Context.hasSameUnqualifiedType( 28135ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor ParamType.getNonReferenceType(), 28145ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor Proto->getArgType(NumArgs).getNonReferenceType())) { 28155ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor ParamType = QualType(); 28165ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor break; 28175ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor } 28185ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor } 28195ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor } 28205ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor } else { 28215ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor // Try to determine the parameter type from the type of the expression 28225ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor // being called. 28235ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor QualType FunctionType = Fn->getType(); 28245ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (const PointerType *Ptr = FunctionType->getAs<PointerType>()) 28255ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor FunctionType = Ptr->getPointeeType(); 28265ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor else if (const BlockPointerType *BlockPtr 28275ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor = FunctionType->getAs<BlockPointerType>()) 28285ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor FunctionType = BlockPtr->getPointeeType(); 28295ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor else if (const MemberPointerType *MemPtr 28305ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor = FunctionType->getAs<MemberPointerType>()) 28315ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor FunctionType = MemPtr->getPointeeType(); 28325ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 28335ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (const FunctionProtoType *Proto 28345ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor = FunctionType->getAs<FunctionProtoType>()) { 28355ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (NumArgs < Proto->getNumArgs()) 28365ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor ParamType = Proto->getArgType(NumArgs); 28375ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor } 28389c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor } 2839ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor 28405ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (ParamType.isNull()) 2841e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompleteOrdinaryName(S, PCC_Expression); 28425ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor else 28435ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor CodeCompleteExpression(S, ParamType); 28445ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 28452e4c7a5865739709a310d847da34096aa402d183Douglas Gregor if (!Results.empty()) 2846ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor CodeCompleter->ProcessOverloadCandidates(*this, NumArgs, Results.data(), 2847ef96eac2b83e2ed62144bb25b051d09a02296fe0Douglas Gregor Results.size()); 28489c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor} 28499c6a0e92dbf89897eae6106b24bfd017f269bfd0Douglas Gregor 2850d226f65006733ed7f709c3174f22ce33391cb58fJohn McCallvoid Sema::CodeCompleteInitializer(Scope *S, Decl *D) { 2851d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall ValueDecl *VD = dyn_cast_or_null<ValueDecl>(D); 28525ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (!VD) { 2853e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompleteOrdinaryName(S, PCC_Expression); 28545ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor return; 28555ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor } 28565ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 28575ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor CodeCompleteExpression(S, VD->getType()); 28585ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor} 28595ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 28605ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregorvoid Sema::CodeCompleteReturn(Scope *S) { 28615ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor QualType ResultType; 28625ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (isa<BlockDecl>(CurContext)) { 28635ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (BlockScopeInfo *BSI = getCurBlock()) 28645ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor ResultType = BSI->ReturnType; 28655ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor } else if (FunctionDecl *Function = dyn_cast<FunctionDecl>(CurContext)) 28665ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor ResultType = Function->getResultType(); 28675ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor else if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(CurContext)) 28685ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor ResultType = Method->getResultType(); 28695ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 28705ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (ResultType.isNull()) 2871e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompleteOrdinaryName(S, PCC_Expression); 28725ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor else 28735ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor CodeCompleteExpression(S, ResultType); 28745ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor} 28755ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 28765ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregorvoid Sema::CodeCompleteAssignmentRHS(Scope *S, ExprTy *LHS) { 28775ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor if (LHS) 28785ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor CodeCompleteExpression(S, static_cast<Expr *>(LHS)->getType()); 28795ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor else 2880e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompleteOrdinaryName(S, PCC_Expression); 28815ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor} 28825ac3bdb2cb0113b640c54f01468d21985c08b252Douglas Gregor 28839ab14541716928894821cf5d53d6b4c95ffdf3a3Jeffrey Yasskinvoid Sema::CodeCompleteQualifiedId(Scope *S, CXXScopeSpec &SS, 288481b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor bool EnteringContext) { 288581b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor if (!SS.getScopeRep() || !CodeCompleter) 288681b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor return; 288781b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor 288886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor DeclContext *Ctx = computeDeclContext(SS, EnteringContext); 288986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!Ctx) 289086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor return; 2891d1cd31aeb806077340be94e32429f3192cf139b0Douglas Gregor 2892d1cd31aeb806077340be94e32429f3192cf139b0Douglas Gregor // Try to instantiate any non-dependent declaration contexts before 2893d1cd31aeb806077340be94e32429f3192cf139b0Douglas Gregor // we look in them. 289477bb1aa78bcd26e42c0382043e65a2b03242be4dJohn McCall if (!isDependentScopeSpecifier(SS) && RequireCompleteDeclContext(SS, Ctx)) 2895d1cd31aeb806077340be94e32429f3192cf139b0Douglas Gregor return; 2896d1cd31aeb806077340be94e32429f3192cf139b0Douglas Gregor 289786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ResultBuilder Results(*this); 2898def9107059d460ada5f0eb3d58189c59122e3c3fDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 2899def9107059d460ada5f0eb3d58189c59122e3c3fDouglas Gregor LookupVisibleDecls(Ctx, LookupOrdinaryName, Consumer); 290086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 290186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // The "template" keyword can follow "::" in the grammar, but only 290286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // put it into the grammar if the nested-name-specifier is dependent. 290386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NestedNameSpecifier *NNS = (NestedNameSpecifier *)SS.getScopeRep(); 290486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!Results.empty() && NNS->isDependent()) 2905a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult("template"); 290686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 2907e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 2908e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 2909e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 291081b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor} 291149f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 291249f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregorvoid Sema::CodeCompleteUsing(Scope *S) { 291349f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor if (!CodeCompleter) 291449f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor return; 291549f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 291686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ResultBuilder Results(*this, &ResultBuilder::IsNestedNameSpecifier); 29178e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.EnterNewScope(); 291886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 291986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // If we aren't in class scope, we could see the "namespace" keyword. 292086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!S->isClassScope()) 2921a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(CodeCompleteConsumer::Result("namespace")); 292286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 292386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // After "using", we can see anything that would start a 292486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // nested-name-specifier. 29255d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 29268071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 29278071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompleter->includeGlobals()); 29288e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.ExitScope(); 292986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 2930e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 2931e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 2932e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 293349f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor} 293449f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 293549f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregorvoid Sema::CodeCompleteUsingDirective(Scope *S) { 293649f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor if (!CodeCompleter) 293749f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor return; 293849f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 293986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // After "using namespace", we expect to see a namespace name or namespace 294086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // alias. 294186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ResultBuilder Results(*this, &ResultBuilder::IsNamespaceOrAlias); 29428e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.EnterNewScope(); 29435d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 29448071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 29458071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompleter->includeGlobals()); 29468e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.ExitScope(); 2947e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 29488071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompletionContext::CCC_Namespace, 2949e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 295049f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor} 295149f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 295249f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregorvoid Sema::CodeCompleteNamespaceDecl(Scope *S) { 295349f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor if (!CodeCompleter) 295449f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor return; 295549f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 295686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ResultBuilder Results(*this, &ResultBuilder::IsNamespace); 295786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor DeclContext *Ctx = (DeclContext *)S->getEntity(); 295886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (!S->getParent()) 295986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor Ctx = Context.getTranslationUnitDecl(); 296086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 296186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (Ctx && Ctx->isFileContext()) { 296286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // We only want to see those namespaces that have already been defined 296386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // within this scope, because its likely that the user is creating an 296486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // extended namespace declaration. Keep track of the most recent 296586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // definition of each namespace. 296686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor std::map<NamespaceDecl *, NamespaceDecl *> OrigToLatest; 296786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor for (DeclContext::specific_decl_iterator<NamespaceDecl> 296886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NS(Ctx->decls_begin()), NSEnd(Ctx->decls_end()); 296986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NS != NSEnd; ++NS) 297086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor OrigToLatest[NS->getOriginalNamespace()] = *NS; 297186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 297286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add the most recent definition (or extended definition) of each 297386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // namespace to the list of results. 29748e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.EnterNewScope(); 297586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor for (std::map<NamespaceDecl *, NamespaceDecl *>::iterator 297686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NS = OrigToLatest.begin(), NSEnd = OrigToLatest.end(); 297786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor NS != NSEnd; ++NS) 2978608300be1972c43fe99154d25d62d697e7c0a0c2Douglas Gregor Results.AddResult(CodeCompleteConsumer::Result(NS->second, 0), 2979608300be1972c43fe99154d25d62d697e7c0a0c2Douglas Gregor CurContext, 0, false); 29808e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.ExitScope(); 298186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor } 298286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 2983e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 2984e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 2985e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 298649f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor} 298749f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 298849f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregorvoid Sema::CodeCompleteNamespaceAliasDecl(Scope *S) { 298949f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor if (!CodeCompleter) 299049f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor return; 299149f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 299286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // After "namespace", we expect to see a namespace or alias. 299386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ResultBuilder Results(*this, &ResultBuilder::IsNamespaceOrAlias); 29945d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 29958071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 29968071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompleter->includeGlobals()); 2997e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 29988071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompletionContext::CCC_Namespace, 2999e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 300049f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor} 300149f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 3002ed8d322b4086b8b1e1f78b21389cabb23457dcb3Douglas Gregorvoid Sema::CodeCompleteOperatorName(Scope *S) { 3003ed8d322b4086b8b1e1f78b21389cabb23457dcb3Douglas Gregor if (!CodeCompleter) 3004ed8d322b4086b8b1e1f78b21389cabb23457dcb3Douglas Gregor return; 300586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 300686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor typedef CodeCompleteConsumer::Result Result; 300786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor ResultBuilder Results(*this, &ResultBuilder::IsType); 30088e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.EnterNewScope(); 300986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 301086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add the names of overloadable operators. 301186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 301286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (std::strcmp(Spelling, "?")) \ 3013a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Spelling)); 301486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor#include "clang/Basic/OperatorKinds.def" 301586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 301686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add any type names visible from the current scope 301745bcd43e34b07958b0a72dad6584fdacf6a11c3cDouglas Gregor Results.allowNestedNameSpecifiers(); 30185d2fc405c71f307d4f9b71cc807ad3c4843cd2ccDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 30198071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 30208071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompleter->includeGlobals()); 302186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor 302286d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor // Add any type specifiers 3023bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddTypeSpecifierResults(getLangOptions(), Results); 30248e0a0e4e4554ab31d793413e0fb4d9532872a53aDouglas Gregor Results.ExitScope(); 3025ed8d322b4086b8b1e1f78b21389cabb23457dcb3Douglas Gregor 3026e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 30278071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompletionContext::CCC_Type, 3028e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 3029c464ae8444edb6d07ea49b7a0eae1674c0fa1bb8Douglas Gregor} 3030c464ae8444edb6d07ea49b7a0eae1674c0fa1bb8Douglas Gregor 3031b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor// Macro that expands to @Keyword or Keyword, depending on whether NeedAt is 3032b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor// true or false. 3033b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor#define OBJC_AT_KEYWORD_NAME(NeedAt,Keyword) NeedAt? "@" #Keyword : #Keyword 3034bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCImplementationResults(const LangOptions &LangOpts, 3035b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor ResultBuilder &Results, 3036b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor bool NeedAt) { 3037c464ae8444edb6d07ea49b7a0eae1674c0fa1bb8Douglas Gregor typedef CodeCompleteConsumer::Result Result; 3038b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // Since we have an implementation, we can end it. 3039a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,end))); 3040b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 3041b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor CodeCompletionString *Pattern = 0; 3042b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor if (LangOpts.ObjC2) { 3043b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @dynamic 3044c464ae8444edb6d07ea49b7a0eae1674c0fa1bb8Douglas Gregor Pattern = new CodeCompletionString; 3045b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,dynamic)); 3046834389b87451b24618513b907b4dfb5b00d211f3Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 3047b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddPlaceholderChunk("property"); 3048a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 3049b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 3050b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @synthesize 3051c464ae8444edb6d07ea49b7a0eae1674c0fa1bb8Douglas Gregor Pattern = new CodeCompletionString; 3052b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,synthesize)); 3053834389b87451b24618513b907b4dfb5b00d211f3Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 3054b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddPlaceholderChunk("property"); 3055a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 3056b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor } 3057b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor} 3058c464ae8444edb6d07ea49b7a0eae1674c0fa1bb8Douglas Gregor 3059bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCInterfaceResults(const LangOptions &LangOpts, 3060b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor ResultBuilder &Results, 3061b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor bool NeedAt) { 3062b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor typedef CodeCompleteConsumer::Result Result; 3063b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 3064b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // Since we have an interface or protocol, we can end it. 3065a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,end))); 3066b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 3067b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor if (LangOpts.ObjC2) { 3068b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @property 3069a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,property))); 3070b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 3071b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @required 3072a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,required))); 3073b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 3074b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @optional 3075a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,optional))); 3076b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor } 3077b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor} 3078834389b87451b24618513b907b4dfb5b00d211f3Douglas Gregor 3079bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCTopLevelResults(ResultBuilder &Results, bool NeedAt) { 3080b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor typedef CodeCompleteConsumer::Result Result; 3081b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor CodeCompletionString *Pattern = 0; 3082b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 3083b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @class name ; 3084b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern = new CodeCompletionString; 3085b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,class)); 3086b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 3087c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("name"); 3088a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 3089b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 3090c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor if (Results.includeCodePatterns()) { 3091c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // @interface name 3092c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // FIXME: Could introduce the whole pattern, including superclasses and 3093c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // such. 3094c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern = new CodeCompletionString; 3095c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,interface)); 3096c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 3097c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("class"); 3098c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Results.AddResult(Result(Pattern)); 3099b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 3100c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // @protocol name 3101c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern = new CodeCompletionString; 3102c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,protocol)); 3103c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 3104c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("protocol"); 3105c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Results.AddResult(Result(Pattern)); 3106c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor 3107c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // @implementation name 3108c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern = new CodeCompletionString; 3109c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,implementation)); 3110c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 3111c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("class"); 3112c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Results.AddResult(Result(Pattern)); 3113c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor } 3114b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 3115b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor // @compatibility_alias name 3116b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern = new CodeCompletionString; 3117b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,compatibility_alias)); 3118b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 3119b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddPlaceholderChunk("alias"); 3120b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 3121b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddPlaceholderChunk("class"); 3122a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 3123b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor} 3124834389b87451b24618513b907b4dfb5b00d211f3Douglas Gregor 3125d226f65006733ed7f709c3174f22ce33391cb58fJohn McCallvoid Sema::CodeCompleteObjCAtDirective(Scope *S, Decl *ObjCImpDecl, 3126b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor bool InInterface) { 3127b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor typedef CodeCompleteConsumer::Result Result; 3128b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor ResultBuilder Results(*this); 3129b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Results.EnterNewScope(); 3130b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor if (ObjCImpDecl) 3131bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCImplementationResults(getLangOptions(), Results, false); 3132b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor else if (InInterface) 3133bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCInterfaceResults(getLangOptions(), Results, false); 3134b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor else 3135bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCTopLevelResults(Results, false); 3136c464ae8444edb6d07ea49b7a0eae1674c0fa1bb8Douglas Gregor Results.ExitScope(); 3137e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 3138e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 3139e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 31409a0c85e640a08174569a303db22981612f05d385Douglas Gregor} 31419a0c85e640a08174569a303db22981612f05d385Douglas Gregor 3142bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCExpressionResults(ResultBuilder &Results, bool NeedAt) { 31439a0c85e640a08174569a303db22981612f05d385Douglas Gregor typedef CodeCompleteConsumer::Result Result; 31449a0c85e640a08174569a303db22981612f05d385Douglas Gregor CodeCompletionString *Pattern = 0; 31459a0c85e640a08174569a303db22981612f05d385Douglas Gregor 31469a0c85e640a08174569a303db22981612f05d385Douglas Gregor // @encode ( type-name ) 31479a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern = new CodeCompletionString; 3148b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,encode)); 31499a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 31509a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddPlaceholderChunk("type-name"); 31519a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 3152a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 31539a0c85e640a08174569a303db22981612f05d385Douglas Gregor 31549a0c85e640a08174569a303db22981612f05d385Douglas Gregor // @protocol ( protocol-name ) 31559a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern = new CodeCompletionString; 3156b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,protocol)); 31579a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 31589a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddPlaceholderChunk("protocol-name"); 31599a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 3160a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 31619a0c85e640a08174569a303db22981612f05d385Douglas Gregor 31629a0c85e640a08174569a303db22981612f05d385Douglas Gregor // @selector ( selector ) 31639a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern = new CodeCompletionString; 3164b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,selector)); 31659a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 31669a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddPlaceholderChunk("selector"); 31679a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 3168a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 31699a0c85e640a08174569a303db22981612f05d385Douglas Gregor} 31709a0c85e640a08174569a303db22981612f05d385Douglas Gregor 3171bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCStatementResults(ResultBuilder &Results, bool NeedAt) { 31729a0c85e640a08174569a303db22981612f05d385Douglas Gregor typedef CodeCompleteConsumer::Result Result; 31739a0c85e640a08174569a303db22981612f05d385Douglas Gregor CodeCompletionString *Pattern = 0; 3174b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 3175c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor if (Results.includeCodePatterns()) { 3176c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // @try { statements } @catch ( declaration ) { statements } @finally 3177c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // { statements } 3178c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern = new CodeCompletionString; 3179c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,try)); 3180c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftBrace); 3181c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("statements"); 3182c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightBrace); 3183c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddTextChunk("@catch"); 3184c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 3185c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("parameter"); 3186c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 3187c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftBrace); 3188c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("statements"); 3189c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightBrace); 3190c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddTextChunk("@finally"); 3191c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftBrace); 3192c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("statements"); 3193c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightBrace); 3194c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Results.AddResult(Result(Pattern)); 3195c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor } 3196b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 31979a0c85e640a08174569a303db22981612f05d385Douglas Gregor // @throw 31989a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern = new CodeCompletionString; 3199b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Pattern->AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,throw)); 3200834389b87451b24618513b907b4dfb5b00d211f3Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 32019a0c85e640a08174569a303db22981612f05d385Douglas Gregor Pattern->AddPlaceholderChunk("expression"); 3202a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(Pattern)); 3203b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor 3204c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor if (Results.includeCodePatterns()) { 3205c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor // @synchronized ( expression ) { statements } 3206c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern = new CodeCompletionString; 3207c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,synchronized)); 3208c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 3209c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 3210c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("expression"); 3211c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 3212c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftBrace); 3213c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddPlaceholderChunk("statements"); 3214c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightBrace); 3215c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor Results.AddResult(Result(Pattern)); 3216c8bddde82135ab25a36ff60fbd2ad50fabe42e63Douglas Gregor } 3217b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor} 32189a0c85e640a08174569a303db22981612f05d385Douglas Gregor 3219bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregorstatic void AddObjCVisibilityResults(const LangOptions &LangOpts, 3220c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor ResultBuilder &Results, 3221c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor bool NeedAt) { 3222b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor typedef CodeCompleteConsumer::Result Result; 3223a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,private))); 3224a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,protected))); 3225a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,public))); 3226c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor if (LangOpts.ObjC2) 3227a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,package))); 3228c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor} 3229c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor 3230c38c3e1e726630458154534227d74eda833d26a0Douglas Gregorvoid Sema::CodeCompleteObjCAtVisibility(Scope *S) { 3231c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor ResultBuilder Results(*this); 3232c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor Results.EnterNewScope(); 3233bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCVisibilityResults(getLangOptions(), Results, false); 3234c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor Results.ExitScope(); 3235e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 3236e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 3237e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 3238c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor} 3239c38c3e1e726630458154534227d74eda833d26a0Douglas Gregor 3240c38c3e1e726630458154534227d74eda833d26a0Douglas Gregorvoid Sema::CodeCompleteObjCAtStatement(Scope *S) { 3241b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor ResultBuilder Results(*this); 3242b6ac2451bfed36206c5cec7217372c4299f67f2bDouglas Gregor Results.EnterNewScope(); 3243bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCStatementResults(Results, false); 3244bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCExpressionResults(Results, false); 32459a0c85e640a08174569a303db22981612f05d385Douglas Gregor Results.ExitScope(); 3246e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 3247e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 3248e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 32499a0c85e640a08174569a303db22981612f05d385Douglas Gregor} 32509a0c85e640a08174569a303db22981612f05d385Douglas Gregor 32519a0c85e640a08174569a303db22981612f05d385Douglas Gregorvoid Sema::CodeCompleteObjCAtExpression(Scope *S) { 32529a0c85e640a08174569a303db22981612f05d385Douglas Gregor ResultBuilder Results(*this); 32539a0c85e640a08174569a303db22981612f05d385Douglas Gregor Results.EnterNewScope(); 3254bca403c17b3eee38ea0644fb70f652629b285fafDouglas Gregor AddObjCExpressionResults(Results, false); 32559a0c85e640a08174569a303db22981612f05d385Douglas Gregor Results.ExitScope(); 3256e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 3257e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 3258e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 3259ed8d322b4086b8b1e1f78b21389cabb23457dcb3Douglas Gregor} 326049f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor 3261988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor/// \brief Determine whether the addition of the given flag to an Objective-C 3262988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor/// property's attributes will cause a conflict. 3263988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregorstatic bool ObjCPropertyFlagConflicts(unsigned Attributes, unsigned NewFlag) { 3264988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor // Check if we've already added this flag. 3265988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (Attributes & NewFlag) 3266988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor return true; 3267988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor 3268988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor Attributes |= NewFlag; 3269988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor 3270988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor // Check for collisions with "readonly". 3271988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if ((Attributes & ObjCDeclSpec::DQ_PR_readonly) && 3272988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor (Attributes & (ObjCDeclSpec::DQ_PR_readwrite | 3273988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor ObjCDeclSpec::DQ_PR_assign | 3274988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor ObjCDeclSpec::DQ_PR_copy | 3275988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor ObjCDeclSpec::DQ_PR_retain))) 3276988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor return true; 3277988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor 3278988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor // Check for more than one of { assign, copy, retain }. 3279988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor unsigned AssignCopyRetMask = Attributes & (ObjCDeclSpec::DQ_PR_assign | 3280988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor ObjCDeclSpec::DQ_PR_copy | 3281988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor ObjCDeclSpec::DQ_PR_retain); 3282988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (AssignCopyRetMask && 3283988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor AssignCopyRetMask != ObjCDeclSpec::DQ_PR_assign && 3284988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor AssignCopyRetMask != ObjCDeclSpec::DQ_PR_copy && 3285988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor AssignCopyRetMask != ObjCDeclSpec::DQ_PR_retain) 3286988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor return true; 3287988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor 3288988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor return false; 3289988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor} 3290988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor 3291a93b108e025ef2480fa867cc533e7781a40a639bDouglas Gregorvoid Sema::CodeCompleteObjCPropertyFlags(Scope *S, ObjCDeclSpec &ODS) { 3292ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff if (!CodeCompleter) 3293ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff return; 3294d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor 3295ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff unsigned Attributes = ODS.getPropertyAttributes(); 3296ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff 3297ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff typedef CodeCompleteConsumer::Result Result; 3298ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff ResultBuilder Results(*this); 3299ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff Results.EnterNewScope(); 3300988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_readonly)) 3301a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(CodeCompleteConsumer::Result("readonly")); 3302988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_assign)) 3303a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(CodeCompleteConsumer::Result("assign")); 3304988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_readwrite)) 3305a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(CodeCompleteConsumer::Result("readwrite")); 3306988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_retain)) 3307a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(CodeCompleteConsumer::Result("retain")); 3308988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_copy)) 3309a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(CodeCompleteConsumer::Result("copy")); 3310988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_nonatomic)) 3311a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(CodeCompleteConsumer::Result("nonatomic")); 3312988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_setter)) { 331354f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor CodeCompletionString *Setter = new CodeCompletionString; 331454f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor Setter->AddTypedTextChunk("setter"); 331554f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor Setter->AddTextChunk(" = "); 331654f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor Setter->AddPlaceholderChunk("method"); 3317a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(CodeCompleteConsumer::Result(Setter)); 331854f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor } 3319988358f218e00f1918d4a46c9b2340ec2980ded2Douglas Gregor if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_getter)) { 332054f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor CodeCompletionString *Getter = new CodeCompletionString; 332154f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor Getter->AddTypedTextChunk("getter"); 332254f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor Getter->AddTextChunk(" = "); 332354f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor Getter->AddPlaceholderChunk("method"); 3324a4477810e45b2d203ffc960615d130137d2e6449Douglas Gregor Results.AddResult(CodeCompleteConsumer::Result(Getter)); 332554f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor } 3326ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff Results.ExitScope(); 3327e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 3328e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 3329e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 3330ece8e71d12b6f4cb2dc501297afef126dab8ad74Steve Naroff} 3331c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff 33324ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor/// \brief Descripts the kind of Objective-C method that we want to find 33334ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor/// via code completion. 33344ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregorenum ObjCMethodKind { 33354ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor MK_Any, //< Any kind of method, provided it means other specified criteria. 33364ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor MK_ZeroArgSelector, //< Zero-argument (unary) selector. 33374ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor MK_OneArgSelector //< One-argument selector. 33384ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor}; 33394ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 33404ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregorstatic bool isAcceptableObjCMethod(ObjCMethodDecl *Method, 33414ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor ObjCMethodKind WantKind, 33424ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor IdentifierInfo **SelIdents, 33434ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor unsigned NumSelIdents) { 33444ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Selector Sel = Method->getSelector(); 33454ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (NumSelIdents > Sel.getNumArgs()) 33464ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor return false; 33474ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 33484ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor switch (WantKind) { 33494ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor case MK_Any: break; 33504ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor case MK_ZeroArgSelector: return Sel.isUnarySelector(); 33514ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor case MK_OneArgSelector: return Sel.getNumArgs() == 1; 33524ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor } 33534ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 33544ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor for (unsigned I = 0; I != NumSelIdents; ++I) 33554ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (SelIdents[I] != Sel.getIdentifierInfoForSlot(I)) 33564ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor return false; 33574ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 33584ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor return true; 33594ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor} 33604ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 336136ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// \brief Add all of the Objective-C methods in the given Objective-C 336236ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// container to the set of results. 336336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// 336436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// The container will be a class, protocol, category, or implementation of 336536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// any of the above. This mether will recurse to include methods from 336636ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// the superclasses of classes along with their categories, protocols, and 336736ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// implementations. 336836ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// 336936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// \param Container the container in which we'll look to find methods. 337036ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// 337136ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// \param WantInstance whether to add instance methods (only); if false, this 337236ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// routine will add factory methods (only). 337336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// 337436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// \param CurContext the context in which we're performing the lookup that 337536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// finds methods. 337636ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// 337736ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor/// \param Results the structure into which we'll add results. 337836ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregorstatic void AddObjCMethods(ObjCContainerDecl *Container, 337936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor bool WantInstanceMethods, 33804ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor ObjCMethodKind WantKind, 3381d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor IdentifierInfo **SelIdents, 3382d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor unsigned NumSelIdents, 338336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor DeclContext *CurContext, 338436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor ResultBuilder &Results) { 338536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor typedef CodeCompleteConsumer::Result Result; 338636ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor for (ObjCContainerDecl::method_iterator M = Container->meth_begin(), 338736ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor MEnd = Container->meth_end(); 338836ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor M != MEnd; ++M) { 3389d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor if ((*M)->isInstanceMethod() == WantInstanceMethods) { 3390d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor // Check whether the selector identifiers we've been given are a 3391d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor // subset of the identifiers for this particular method. 33924ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (!isAcceptableObjCMethod(*M, WantKind, SelIdents, NumSelIdents)) 3393d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor continue; 33944ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 3395d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor Result R = Result(*M, 0); 3396d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor R.StartParameter = NumSelIdents; 33974ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor R.AllParametersAreInformative = (WantKind != MK_Any); 3398d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor Results.MaybeAddResult(R, CurContext); 3399d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor } 340036ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor } 340136ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 340236ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container); 340336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor if (!IFace) 340436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor return; 340536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 340636ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add methods in protocols. 340736ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor const ObjCList<ObjCProtocolDecl> &Protocols= IFace->getReferencedProtocols(); 340836ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 340936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor E = Protocols.end(); 341036ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor I != E; ++I) 34114ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents, NumSelIdents, 3412d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor CurContext, Results); 341336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 341436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add methods in categories. 341536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor for (ObjCCategoryDecl *CatDecl = IFace->getCategoryList(); CatDecl; 341636ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor CatDecl = CatDecl->getNextClassCategory()) { 34174ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(CatDecl, WantInstanceMethods, WantKind, SelIdents, 34184ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor NumSelIdents, CurContext, Results); 341936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 342036ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add a categories protocol methods. 342136ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor const ObjCList<ObjCProtocolDecl> &Protocols 342236ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor = CatDecl->getReferencedProtocols(); 342336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 342436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor E = Protocols.end(); 342536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor I != E; ++I) 34264ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents, 34274ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor NumSelIdents, CurContext, Results); 342836ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 342936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add methods in category implementations. 343036ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor if (ObjCCategoryImplDecl *Impl = CatDecl->getImplementation()) 34314ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(Impl, WantInstanceMethods, WantKind, SelIdents, 34324ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor NumSelIdents, CurContext, Results); 343336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor } 343436ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 343536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add methods in superclass. 343636ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor if (IFace->getSuperClass()) 34374ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(IFace->getSuperClass(), WantInstanceMethods, WantKind, 34384ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor SelIdents, NumSelIdents, CurContext, Results); 343936ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 344036ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add methods in our implementation, if any. 344136ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor if (ObjCImplementationDecl *Impl = IFace->getImplementation()) 34424ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(Impl, WantInstanceMethods, WantKind, SelIdents, 34434ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor NumSelIdents, CurContext, Results); 34444ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor} 34454ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 34464ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 3447d226f65006733ed7f709c3174f22ce33391cb58fJohn McCallvoid Sema::CodeCompleteObjCPropertyGetter(Scope *S, Decl *ClassDecl, 3448d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall Decl **Methods, 34494ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor unsigned NumMethods) { 34504ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor typedef CodeCompleteConsumer::Result Result; 34514ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 34524ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor // Try to find the interface where getters might live. 3453d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(ClassDecl); 34544ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (!Class) { 34554ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (ObjCCategoryDecl *Category 3456d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall = dyn_cast_or_null<ObjCCategoryDecl>(ClassDecl)) 34574ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Class = Category->getClassInterface(); 34584ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 34594ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (!Class) 34604ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor return; 34614ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor } 34624ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 34634ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor // Find all of the potential getters. 34644ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor ResultBuilder Results(*this); 34654ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Results.EnterNewScope(); 34664ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 34674ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor // FIXME: We need to do this because Objective-C methods don't get 34684ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor // pushed into DeclContexts early enough. Argh! 34694ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor for (unsigned I = 0; I != NumMethods; ++I) { 34704ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (ObjCMethodDecl *Method 3471d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall = dyn_cast_or_null<ObjCMethodDecl>(Methods[I])) 34724ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (Method->isInstanceMethod() && 34734ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor isAcceptableObjCMethod(Method, MK_ZeroArgSelector, 0, 0)) { 34744ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Result R = Result(Method, 0); 34754ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor R.AllParametersAreInformative = true; 34764ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Results.MaybeAddResult(R, CurContext); 34774ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor } 34784ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor } 34794ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 34804ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(Class, true, MK_ZeroArgSelector, 0, 0, CurContext, Results); 34814ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Results.ExitScope(); 3482e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 3483e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 3484e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 34854ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor} 34864ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 3487d226f65006733ed7f709c3174f22ce33391cb58fJohn McCallvoid Sema::CodeCompleteObjCPropertySetter(Scope *S, Decl *ObjCImplDecl, 3488d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall Decl **Methods, 34894ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor unsigned NumMethods) { 34904ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor typedef CodeCompleteConsumer::Result Result; 34914ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 34924ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor // Try to find the interface where setters might live. 34934ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor ObjCInterfaceDecl *Class 3494d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall = dyn_cast_or_null<ObjCInterfaceDecl>(ObjCImplDecl); 34954ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (!Class) { 34964ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (ObjCCategoryDecl *Category 3497d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall = dyn_cast_or_null<ObjCCategoryDecl>(ObjCImplDecl)) 34984ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Class = Category->getClassInterface(); 34994ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 35004ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (!Class) 35014ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor return; 35024ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor } 35034ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 35044ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor // Find all of the potential getters. 35054ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor ResultBuilder Results(*this); 35064ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Results.EnterNewScope(); 35074ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 35084ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor // FIXME: We need to do this because Objective-C methods don't get 35094ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor // pushed into DeclContexts early enough. Argh! 35104ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor for (unsigned I = 0; I != NumMethods; ++I) { 35114ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (ObjCMethodDecl *Method 3512d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall = dyn_cast_or_null<ObjCMethodDecl>(Methods[I])) 35134ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor if (Method->isInstanceMethod() && 35144ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor isAcceptableObjCMethod(Method, MK_OneArgSelector, 0, 0)) { 35154ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Result R = Result(Method, 0); 35164ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor R.AllParametersAreInformative = true; 35174ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Results.MaybeAddResult(R, CurContext); 35184ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor } 35194ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor } 35204ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 35214ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(Class, true, MK_OneArgSelector, 0, 0, CurContext, Results); 35224ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor 35234ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Results.ExitScope(); 3524e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 3525e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 3526e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 352736ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor} 352836ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 352922f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor/// \brief When we have an expression with type "id", we may assume 353022f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor/// that it has some more-specific class type based on knowledge of 353122f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor/// common uses of Objective-C. This routine returns that class type, 353222f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor/// or NULL if no better result could be determined. 353322f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregorstatic ObjCInterfaceDecl *GetAssumedMessageSendExprType(Expr *E) { 353422f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor ObjCMessageExpr *Msg = dyn_cast<ObjCMessageExpr>(E); 353522f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor if (!Msg) 353622f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor return 0; 353722f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor 353822f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor Selector Sel = Msg->getSelector(); 353922f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor if (Sel.isNull()) 354022f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor return 0; 354122f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor 354222f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor IdentifierInfo *Id = Sel.getIdentifierInfoForSlot(0); 354322f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor if (!Id) 354422f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor return 0; 354522f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor 354622f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor ObjCMethodDecl *Method = Msg->getMethodDecl(); 354722f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor if (!Method) 354822f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor return 0; 354922f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor 355022f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor // Determine the class that we're sending the message to. 355104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor ObjCInterfaceDecl *IFace = 0; 355204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor switch (Msg->getReceiverKind()) { 355304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor case ObjCMessageExpr::Class: 3554c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (const ObjCObjectType *ObjType 3555c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall = Msg->getClassReceiver()->getAs<ObjCObjectType>()) 3556c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall IFace = ObjType->getInterface(); 355704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor break; 355804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor 355904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor case ObjCMessageExpr::Instance: { 356004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor QualType T = Msg->getInstanceReceiver()->getType(); 356104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor if (const ObjCObjectPointerType *Ptr = T->getAs<ObjCObjectPointerType>()) 356204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor IFace = Ptr->getInterfaceDecl(); 356304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor break; 356404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor } 356504badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor 356604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor case ObjCMessageExpr::SuperInstance: 356704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor case ObjCMessageExpr::SuperClass: 356804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor break; 356922f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor } 357022f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor 357122f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor if (!IFace) 357222f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor return 0; 357322f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor 357422f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor ObjCInterfaceDecl *Super = IFace->getSuperClass(); 357522f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor if (Method->isInstanceMethod()) 357622f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor return llvm::StringSwitch<ObjCInterfaceDecl *>(Id->getName()) 357722f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("retain", IFace) 357822f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("autorelease", IFace) 357922f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("copy", IFace) 358022f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("copyWithZone", IFace) 358122f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("mutableCopy", IFace) 358222f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("mutableCopyWithZone", IFace) 358322f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("awakeFromCoder", IFace) 358422f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("replacementObjectFromCoder", IFace) 358522f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("class", IFace) 358622f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("classForCoder", IFace) 358722f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("superclass", Super) 358822f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Default(0); 358922f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor 359022f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor return llvm::StringSwitch<ObjCInterfaceDecl *>(Id->getName()) 359122f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("new", IFace) 359222f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("alloc", IFace) 359322f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("allocWithZone", IFace) 359422f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("class", IFace) 359522f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Case("superclass", Super) 359622f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor .Default(0); 359722f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor} 359822f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor 35998e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregorvoid Sema::CodeCompleteObjCMessageReceiver(Scope *S) { 36008e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor typedef CodeCompleteConsumer::Result Result; 36018e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor ResultBuilder Results(*this); 36028e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 36038e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor // Find anything that looks like it could be a message receiver. 36048e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor Results.setFilter(&ResultBuilder::IsObjCMessageReceiver); 36058e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor CodeCompletionDeclConsumer Consumer(Results, CurContext); 36068e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor Results.EnterNewScope(); 36078071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 36088071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompleter->includeGlobals()); 36098e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 36108e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor // If we are in an Objective-C method inside a class that has a superclass, 36118e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor // add "super" as an option. 36128e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor if (ObjCMethodDecl *Method = getCurMethodDecl()) 36138e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor if (ObjCInterfaceDecl *Iface = Method->getClassInterface()) 36148e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor if (Iface->getSuperClass()) 36158e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor Results.AddResult(Result("super")); 36168e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 36178e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor Results.ExitScope(); 36188e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 36198e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor if (CodeCompleter->includeMacros()) 36208e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor AddMacroResults(PP, Results); 3621e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 3622e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_ObjCMessageReceiver, 3623e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(), Results.size()); 36248e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 36258e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor} 36268e254cfe5a6ab4202c7fcc4b64bdd1ca0fe071acDouglas Gregor 36272725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregorvoid Sema::CodeCompleteObjCSuperMessage(Scope *S, SourceLocation SuperLoc, 3628d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor IdentifierInfo **SelIdents, 3629d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor unsigned NumSelIdents) { 363024a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor ObjCInterfaceDecl *CDecl = 0; 36312725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) { 36322725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // Figure out which interface we're in. 36332725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor CDecl = CurMethod->getClassInterface(); 36342725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (!CDecl) 36352725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor return; 36362725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor 36372725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // Find the superclass of this class. 36382725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor CDecl = CDecl->getSuperClass(); 36392725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (!CDecl) 36402725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor return; 364124a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor 36422725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (CurMethod->isInstanceMethod()) { 36432725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // We are inside an instance method, which means that the message 36442725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // send [super ...] is actually calling an instance method on the 36452725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // current object. Build the super expression and handle this like 36462725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // an instance method. 36472725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor QualType SuperTy = Context.getObjCInterfaceType(CDecl); 36482725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor SuperTy = Context.getObjCObjectPointerType(SuperTy); 36492725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor OwningExprResult Super 36502725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor = Owned(new (Context) ObjCSuperExpr(SuperLoc, SuperTy)); 36512725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor return CodeCompleteObjCInstanceMessage(S, (Expr *)Super.get(), 36522725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor SelIdents, NumSelIdents); 36532725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor } 365424a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor 36552725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // Fall through to send to the superclass in CDecl. 36562725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor } else { 36572725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // "super" may be the name of a type or variable. Figure out which 36582725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // it is. 36592725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor IdentifierInfo *Super = &Context.Idents.get("super"); 36602725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor NamedDecl *ND = LookupSingleName(S, Super, SuperLoc, 36612725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor LookupOrdinaryName); 36622725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if ((CDecl = dyn_cast_or_null<ObjCInterfaceDecl>(ND))) { 36632725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // "super" names an interface. Use it. 36642725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor } else if (TypeDecl *TD = dyn_cast_or_null<TypeDecl>(ND)) { 3665c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (const ObjCObjectType *Iface 3666c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall = Context.getTypeDeclType(TD)->getAs<ObjCObjectType>()) 3667c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall CDecl = Iface->getInterface(); 36682725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor } else if (ND && isa<UnresolvedUsingTypenameDecl>(ND)) { 36692725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // "super" names an unresolved type; we can't be more specific. 36702725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor } else { 36712725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // Assume that "super" names some kind of value and parse that way. 36722725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor CXXScopeSpec SS; 36732725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor UnqualifiedId id; 36742725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor id.setIdentifier(Super, SuperLoc); 36752725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor OwningExprResult SuperExpr = ActOnIdExpression(S, SS, id, false, false); 36762725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor return CodeCompleteObjCInstanceMessage(S, (Expr *)SuperExpr.get(), 36772725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor SelIdents, NumSelIdents); 36782725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor } 367924a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor 36802725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // Fall through 368124a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor } 368224a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor 36832725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor TypeTy *Receiver = 0; 36842725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (CDecl) 36852725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor Receiver = Context.getObjCInterfaceType(CDecl).getAsOpaquePtr(); 36862725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor return CodeCompleteObjCClassMessage(S, Receiver, SelIdents, 36872725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor NumSelIdents); 36882725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor} 36892725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor 36902725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregorvoid Sema::CodeCompleteObjCClassMessage(Scope *S, TypeTy *Receiver, 36912725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor IdentifierInfo **SelIdents, 36922725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor unsigned NumSelIdents) { 36932725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor typedef CodeCompleteConsumer::Result Result; 36942725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor ObjCInterfaceDecl *CDecl = 0; 36952725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor 369624a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor // If the given name refers to an interface type, retrieve the 369724a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor // corresponding declaration. 36982725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (Receiver) { 36992725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor QualType T = GetTypeFromParser(Receiver, 0); 37002725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (!T.isNull()) 3701c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (const ObjCObjectType *Interface = T->getAs<ObjCObjectType>()) 3702c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall CDecl = Interface->getInterface(); 370324a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor } 370424a069f5ebf441d86eaec7524365101adf6b2aebDouglas Gregor 370536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Add all of the factory methods in this Objective-C class, its protocols, 370636ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // superclasses, categories, implementation, etc. 3707c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff ResultBuilder Results(*this); 3708c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff Results.EnterNewScope(); 370913438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor 371013438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor if (CDecl) 371113438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor AddObjCMethods(CDecl, false, MK_Any, SelIdents, NumSelIdents, CurContext, 371213438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor Results); 37132725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor else { 371413438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor // We're messaging "id" as a type; provide all class/factory methods. 371513438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor 3716719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor // If we have an external source, load the entire class method 37173c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl // pool from the AST file. 3718719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor if (ExternalSource) { 371976bd1f387e6a7b7abfe53f63b3bd429b97bb80f0John McCall for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors(); 372076bd1f387e6a7b7abfe53f63b3bd429b97bb80f0John McCall I != N; ++I) { 372176bd1f387e6a7b7abfe53f63b3bd429b97bb80f0John McCall Selector Sel = ExternalSource->GetExternalSelector(I); 3722db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl if (Sel.isNull() || MethodPool.count(Sel)) 3723719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor continue; 3724719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor 3725db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl ReadMethodPool(Sel); 3726719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor } 3727719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor } 3728719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor 3729db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl for (GlobalMethodPool::iterator M = MethodPool.begin(), 3730db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl MEnd = MethodPool.end(); 3731db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl M != MEnd; ++M) { 3732db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl for (ObjCMethodList *MethList = &M->second.second; 3733db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl MethList && MethList->Method; 373413438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor MethList = MethList->Next) { 373513438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor if (!isAcceptableObjCMethod(MethList->Method, MK_Any, SelIdents, 373613438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor NumSelIdents)) 373713438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor continue; 373813438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor 373913438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor Result R(MethList->Method, 0); 374013438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor R.StartParameter = NumSelIdents; 374113438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor R.AllParametersAreInformative = false; 374213438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor Results.MaybeAddResult(R, CurContext); 374313438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor } 374413438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor } 374513438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor } 374613438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor 3747c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff Results.ExitScope(); 3748e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 3749e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 3750e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 3751c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff} 3752c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff 3753d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregorvoid Sema::CodeCompleteObjCInstanceMessage(Scope *S, ExprTy *Receiver, 3754d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor IdentifierInfo **SelIdents, 3755d3c6854153fd6bc6a412a29e4491dbd0a47bdb14Douglas Gregor unsigned NumSelIdents) { 3756c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff typedef CodeCompleteConsumer::Result Result; 3757c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff 3758c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff Expr *RecExpr = static_cast<Expr *>(Receiver); 3759c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff 376036ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // If necessary, apply function/array conversion to the receiver. 376136ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // C99 6.7.5.3p[7,8]. 3762a873dfc9e7314681bb37efd9ab185045de121e43Douglas Gregor DefaultFunctionArrayLvalueConversion(RecExpr); 376336ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor QualType ReceiverType = RecExpr->getType(); 3764c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff 376536ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor // Build the set of methods we can see. 376636ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor ResultBuilder Results(*this); 376736ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor Results.EnterNewScope(); 376822f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor 376922f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor // If we're messaging an expression with type "id" or "Class", check 377022f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor // whether we know something special about the receiver that allows 377122f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor // us to assume a more-specific receiver type. 377222f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor if (ReceiverType->isObjCIdType() || ReceiverType->isObjCClassType()) 377322f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor if (ObjCInterfaceDecl *IFace = GetAssumedMessageSendExprType(RecExpr)) 377422f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor ReceiverType = Context.getObjCObjectPointerType( 377522f569918dd599eb6d810e066eddc4ae74c6b2b0Douglas Gregor Context.getObjCInterfaceType(IFace)); 377636ecb0461977afeb8620d773e938ab4719718a5fDouglas Gregor 3777f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // Handle messages to Class. This really isn't a message to an instance 3778f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // method, so we treat it the same way we would treat a message send to a 3779f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // class method. 3780f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor if (ReceiverType->isObjCClassType() || 3781f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor ReceiverType->isObjCQualifiedClassType()) { 3782f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) { 3783f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor if (ObjCInterfaceDecl *ClassDecl = CurMethod->getClassInterface()) 37844ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(ClassDecl, false, MK_Any, SelIdents, NumSelIdents, 37854ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor CurContext, Results); 3786f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor } 3787f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor } 3788f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // Handle messages to a qualified ID ("id<foo>"). 3789f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor else if (const ObjCObjectPointerType *QualID 3790f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor = ReceiverType->getAsObjCQualifiedIdType()) { 3791f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // Search protocols for instance methods. 3792f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor for (ObjCObjectPointerType::qual_iterator I = QualID->qual_begin(), 3793f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor E = QualID->qual_end(); 3794f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor I != E; ++I) 37954ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(*I, true, MK_Any, SelIdents, NumSelIdents, CurContext, 37964ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Results); 3797f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor } 3798f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // Handle messages to a pointer to interface type. 3799f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor else if (const ObjCObjectPointerType *IFacePtr 3800f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor = ReceiverType->getAsObjCInterfacePointerType()) { 3801f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // Search the class, its superclasses, etc., for instance methods. 38024ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(IFacePtr->getInterfaceDecl(), true, MK_Any, SelIdents, 38034ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor NumSelIdents, CurContext, Results); 3804f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor 3805f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor // Search protocols for instance methods. 3806f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor for (ObjCObjectPointerType::qual_iterator I = IFacePtr->qual_begin(), 3807f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor E = IFacePtr->qual_end(); 3808f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor I != E; ++I) 38094ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor AddObjCMethods(*I, true, MK_Any, SelIdents, NumSelIdents, CurContext, 38104ad9685b3e2d5e2923c9cda7baaf7973ef0b1c62Douglas Gregor Results); 3811f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor } 381213438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor // Handle messages to "id". 381313438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor else if (ReceiverType->isObjCIdType()) { 3814719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor // We're messaging "id", so provide all instance methods we know 3815719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor // about as code-completion results. 3816719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor 3817719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor // If we have an external source, load the entire class method 38183c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl // pool from the AST file. 3819719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor if (ExternalSource) { 382076bd1f387e6a7b7abfe53f63b3bd429b97bb80f0John McCall for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors(); 382176bd1f387e6a7b7abfe53f63b3bd429b97bb80f0John McCall I != N; ++I) { 382276bd1f387e6a7b7abfe53f63b3bd429b97bb80f0John McCall Selector Sel = ExternalSource->GetExternalSelector(I); 3823db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl if (Sel.isNull() || MethodPool.count(Sel)) 3824719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor continue; 3825719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor 3826db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl ReadMethodPool(Sel); 3827719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor } 3828719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor } 3829719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor 3830db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl for (GlobalMethodPool::iterator M = MethodPool.begin(), 3831db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl MEnd = MethodPool.end(); 3832db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl M != MEnd; ++M) { 3833db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl for (ObjCMethodList *MethList = &M->second.first; 3834db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl MethList && MethList->Method; 383513438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor MethList = MethList->Next) { 383613438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor if (!isAcceptableObjCMethod(MethList->Method, MK_Any, SelIdents, 383713438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor NumSelIdents)) 383813438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor continue; 383913438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor 384013438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor Result R(MethList->Method, 0); 384113438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor R.StartParameter = NumSelIdents; 384213438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor R.AllParametersAreInformative = false; 384313438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor Results.MaybeAddResult(R, CurContext); 384413438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor } 384513438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor } 384613438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor } 384713438f9b9c8fdf08998c843dd307d2a9eda05b32Douglas Gregor 3848f74a419b7219d050e1e40ff920d30832e903e5a8Douglas Gregor Results.ExitScope(); 3849e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 3850e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 3851e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 3852c4df6d2c05c647a6a5770ba0c749782b6c023a3aSteve Naroff} 385355385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor 3854fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregorvoid Sema::CodeCompleteObjCForCollection(Scope *S, 3855fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor DeclGroupPtrTy IterationVar) { 3856fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor CodeCompleteExpressionData Data; 3857fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor Data.ObjCCollection = true; 3858fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor 3859fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor if (IterationVar.getAsOpaquePtr()) { 3860fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor DeclGroupRef DG = IterationVar.getAsVal<DeclGroupRef>(); 3861fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor for (DeclGroupRef::iterator I = DG.begin(), End = DG.end(); I != End; ++I) { 3862fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor if (*I) 3863fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor Data.IgnoreDecls.push_back(*I); 3864fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor } 3865fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor } 3866fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor 3867fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor CodeCompleteExpression(S, Data); 3868fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor} 3869fb6294123b9de1605adae69d85cb4fddf81a9bc5Douglas Gregor 387055385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor/// \brief Add all of the protocol declarations that we find in the given 387155385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor/// (translation unit) context. 387255385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregorstatic void AddProtocolResults(DeclContext *Ctx, DeclContext *CurContext, 3873083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor bool OnlyForwardDeclarations, 387455385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor ResultBuilder &Results) { 387555385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor typedef CodeCompleteConsumer::Result Result; 387655385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor 387755385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor for (DeclContext::decl_iterator D = Ctx->decls_begin(), 387855385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor DEnd = Ctx->decls_end(); 387955385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor D != DEnd; ++D) { 388055385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor // Record any protocols we find. 388155385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor if (ObjCProtocolDecl *Proto = dyn_cast<ObjCProtocolDecl>(*D)) 3882083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor if (!OnlyForwardDeclarations || Proto->isForwardDecl()) 3883608300be1972c43fe99154d25d62d697e7c0a0c2Douglas Gregor Results.AddResult(Result(Proto, 0), CurContext, 0, false); 388455385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor 388555385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor // Record any forward-declared protocols we find. 388655385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor if (ObjCForwardProtocolDecl *Forward 388755385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor = dyn_cast<ObjCForwardProtocolDecl>(*D)) { 388855385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor for (ObjCForwardProtocolDecl::protocol_iterator 388955385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor P = Forward->protocol_begin(), 389055385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor PEnd = Forward->protocol_end(); 389155385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor P != PEnd; ++P) 3892083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor if (!OnlyForwardDeclarations || (*P)->isForwardDecl()) 3893608300be1972c43fe99154d25d62d697e7c0a0c2Douglas Gregor Results.AddResult(Result(*P, 0), CurContext, 0, false); 389455385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor } 389555385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor } 389655385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor} 389755385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor 389855385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregorvoid Sema::CodeCompleteObjCProtocolReferences(IdentifierLocPair *Protocols, 389955385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor unsigned NumProtocols) { 390055385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor ResultBuilder Results(*this); 390155385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor Results.EnterNewScope(); 390255385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor 390355385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor // Tell the result set to ignore all of the protocols we have 390455385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor // already seen. 390555385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor for (unsigned I = 0; I != NumProtocols; ++I) 3906c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor if (ObjCProtocolDecl *Protocol = LookupProtocol(Protocols[I].first, 3907c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor Protocols[I].second)) 390855385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor Results.Ignore(Protocol); 390955385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor 391055385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor // Add all protocols. 3911083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor AddProtocolResults(Context.getTranslationUnitDecl(), CurContext, false, 3912083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor Results); 3913083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor 3914083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor Results.ExitScope(); 3915e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 3916e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_ObjCProtocolName, 3917e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 3918083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor} 3919083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor 3920083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregorvoid Sema::CodeCompleteObjCProtocolDecl(Scope *) { 3921083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor ResultBuilder Results(*this); 3922083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor Results.EnterNewScope(); 3923083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor 3924083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor // Add all protocols. 3925083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor AddProtocolResults(Context.getTranslationUnitDecl(), CurContext, true, 3926083128f6b13dfa4fc615a838c49b516d901b1ac0Douglas Gregor Results); 392755385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor 392855385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor Results.ExitScope(); 3929e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 3930e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_ObjCProtocolName, 3931e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 393255385fe3e723cd675001e45f42d61adde6b7f075Douglas Gregor} 39333b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 39343b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor/// \brief Add all of the Objective-C interface declarations that we find in 39353b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor/// the given (translation unit) context. 39363b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregorstatic void AddInterfaceResults(DeclContext *Ctx, DeclContext *CurContext, 39373b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor bool OnlyForwardDeclarations, 39383b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor bool OnlyUnimplemented, 39393b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor ResultBuilder &Results) { 39403b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor typedef CodeCompleteConsumer::Result Result; 39413b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 39423b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor for (DeclContext::decl_iterator D = Ctx->decls_begin(), 39433b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor DEnd = Ctx->decls_end(); 39443b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor D != DEnd; ++D) { 3945deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor // Record any interfaces we find. 3946deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor if (ObjCInterfaceDecl *Class = dyn_cast<ObjCInterfaceDecl>(*D)) 3947deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor if ((!OnlyForwardDeclarations || Class->isForwardDecl()) && 3948deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor (!OnlyUnimplemented || !Class->getImplementation())) 3949deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor Results.AddResult(Result(Class, 0), CurContext, 0, false); 39503b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 39513b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor // Record any forward-declared interfaces we find. 39523b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor if (ObjCClassDecl *Forward = dyn_cast<ObjCClassDecl>(*D)) { 39533b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor for (ObjCClassDecl::iterator C = Forward->begin(), CEnd = Forward->end(); 3954deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor C != CEnd; ++C) 3955deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor if ((!OnlyForwardDeclarations || C->getInterface()->isForwardDecl()) && 3956deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor (!OnlyUnimplemented || !C->getInterface()->getImplementation())) 3957deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor Results.AddResult(Result(C->getInterface(), 0), CurContext, 3958608300be1972c43fe99154d25d62d697e7c0a0c2Douglas Gregor 0, false); 39593b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor } 39603b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor } 39613b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor} 39623b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 39633b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregorvoid Sema::CodeCompleteObjCInterfaceDecl(Scope *S) { 39643b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor ResultBuilder Results(*this); 39653b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.EnterNewScope(); 39663b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 39673b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor // Add all classes. 39683b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, true, 39693b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor false, Results); 39703b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 39713b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.ExitScope(); 3972e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 3973e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 3974e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 39753b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor} 39763b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 3977c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregorvoid Sema::CodeCompleteObjCSuperclass(Scope *S, IdentifierInfo *ClassName, 3978c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor SourceLocation ClassNameLoc) { 39793b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor ResultBuilder Results(*this); 39803b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.EnterNewScope(); 39813b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 39823b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor // Make sure that we ignore the class we're currently defining. 39833b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor NamedDecl *CurClass 3984c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor = LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName); 398533ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor if (CurClass && isa<ObjCInterfaceDecl>(CurClass)) 39863b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.Ignore(CurClass); 39873b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 39883b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor // Add all classes. 39893b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false, 39903b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor false, Results); 39913b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 39923b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.ExitScope(); 3993e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 3994e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 3995e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 39963b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor} 39973b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 39983b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregorvoid Sema::CodeCompleteObjCImplementationDecl(Scope *S) { 39993b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor ResultBuilder Results(*this); 40003b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.EnterNewScope(); 40013b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 40023b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor // Add all unimplemented classes. 40033b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false, 40043b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor true, Results); 40053b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor 40063b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor Results.ExitScope(); 4007e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 4008e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 4009e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 40103b49aca913dc0c1838321b9bb2dc9a4cb4681922Douglas Gregor} 401133ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 401233ced0b8550f3e7169f326944731ee02e9338659Douglas Gregorvoid Sema::CodeCompleteObjCInterfaceCategory(Scope *S, 4013c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor IdentifierInfo *ClassName, 4014c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor SourceLocation ClassNameLoc) { 401533ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor typedef CodeCompleteConsumer::Result Result; 401633ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 401733ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor ResultBuilder Results(*this); 401833ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 401933ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // Ignore any categories we find that have already been implemented by this 402033ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // interface. 402133ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor llvm::SmallPtrSet<IdentifierInfo *, 16> CategoryNames; 402233ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor NamedDecl *CurClass 4023c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor = LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName); 402433ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor if (ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurClass)) 402533ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor for (ObjCCategoryDecl *Category = Class->getCategoryList(); Category; 402633ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Category = Category->getNextClassCategory()) 402733ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor CategoryNames.insert(Category->getIdentifier()); 402833ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 402933ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // Add all of the categories we know about. 403033ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Results.EnterNewScope(); 403133ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor TranslationUnitDecl *TU = Context.getTranslationUnitDecl(); 403233ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor for (DeclContext::decl_iterator D = TU->decls_begin(), 403333ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor DEnd = TU->decls_end(); 403433ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor D != DEnd; ++D) 403533ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(*D)) 403633ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor if (CategoryNames.insert(Category->getIdentifier())) 4037608300be1972c43fe99154d25d62d697e7c0a0c2Douglas Gregor Results.AddResult(Result(Category, 0), CurContext, 0, false); 403833ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Results.ExitScope(); 403933ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 4040e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 4041e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 4042e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 404333ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor} 404433ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 404533ced0b8550f3e7169f326944731ee02e9338659Douglas Gregorvoid Sema::CodeCompleteObjCImplementationCategory(Scope *S, 4046c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor IdentifierInfo *ClassName, 4047c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor SourceLocation ClassNameLoc) { 404833ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor typedef CodeCompleteConsumer::Result Result; 404933ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 405033ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // Find the corresponding interface. If we couldn't find the interface, the 405133ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // program itself is ill-formed. However, we'll try to be helpful still by 405233ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // providing the list of all of the categories we know about. 405333ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor NamedDecl *CurClass 4054c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor = LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName); 405533ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurClass); 405633ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor if (!Class) 4057c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor return CodeCompleteObjCInterfaceCategory(S, ClassName, ClassNameLoc); 405833ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 405933ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor ResultBuilder Results(*this); 406033ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 406133ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // Add all of the categories that have have corresponding interface 406233ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // declarations in this class and any of its superclasses, except for 406333ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor // already-implemented categories in the class itself. 406433ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor llvm::SmallPtrSet<IdentifierInfo *, 16> CategoryNames; 406533ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Results.EnterNewScope(); 406633ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor bool IgnoreImplemented = true; 406733ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor while (Class) { 406833ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor for (ObjCCategoryDecl *Category = Class->getCategoryList(); Category; 406933ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Category = Category->getNextClassCategory()) 407033ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor if ((!IgnoreImplemented || !Category->getImplementation()) && 407133ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor CategoryNames.insert(Category->getIdentifier())) 4072608300be1972c43fe99154d25d62d697e7c0a0c2Douglas Gregor Results.AddResult(Result(Category, 0), CurContext, 0, false); 407333ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 407433ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Class = Class->getSuperClass(); 407533ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor IgnoreImplemented = false; 407633ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor } 407733ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor Results.ExitScope(); 407833ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor 4079e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 4080e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 4081e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 408233ced0b8550f3e7169f326944731ee02e9338659Douglas Gregor} 4083322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 4084d226f65006733ed7f709c3174f22ce33391cb58fJohn McCallvoid Sema::CodeCompleteObjCPropertyDefinition(Scope *S, Decl *ObjCImpDecl) { 4085322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor typedef CodeCompleteConsumer::Result Result; 4086322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor ResultBuilder Results(*this); 4087322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 4088322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Figure out where this @synthesize lives. 4089322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor ObjCContainerDecl *Container 4090d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall = dyn_cast_or_null<ObjCContainerDecl>(ObjCImpDecl); 4091322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor if (!Container || 4092322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor (!isa<ObjCImplementationDecl>(Container) && 4093322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor !isa<ObjCCategoryImplDecl>(Container))) 4094322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor return; 4095322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 4096322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Ignore any properties that have already been implemented. 4097322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor for (DeclContext::decl_iterator D = Container->decls_begin(), 4098322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor DEnd = Container->decls_end(); 4099322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor D != DEnd; ++D) 4100322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor if (ObjCPropertyImplDecl *PropertyImpl = dyn_cast<ObjCPropertyImplDecl>(*D)) 4101322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Results.Ignore(PropertyImpl->getPropertyDecl()); 4102322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 4103322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Add any properties that we find. 4104322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Results.EnterNewScope(); 4105322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor if (ObjCImplementationDecl *ClassImpl 4106322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor = dyn_cast<ObjCImplementationDecl>(Container)) 4107322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor AddObjCProperties(ClassImpl->getClassInterface(), false, CurContext, 4108322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Results); 4109322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor else 4110322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor AddObjCProperties(cast<ObjCCategoryImplDecl>(Container)->getCategoryDecl(), 4111322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor false, CurContext, Results); 4112322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Results.ExitScope(); 4113322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 4114e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 4115e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 4116e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 4117322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor} 4118322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 4119322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregorvoid Sema::CodeCompleteObjCPropertySynthesizeIvar(Scope *S, 4120322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor IdentifierInfo *PropertyName, 4121d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall Decl *ObjCImpDecl) { 4122322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor typedef CodeCompleteConsumer::Result Result; 4123322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor ResultBuilder Results(*this); 4124322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 4125322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Figure out where this @synthesize lives. 4126322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor ObjCContainerDecl *Container 4127d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall = dyn_cast_or_null<ObjCContainerDecl>(ObjCImpDecl); 4128322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor if (!Container || 4129322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor (!isa<ObjCImplementationDecl>(Container) && 4130322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor !isa<ObjCCategoryImplDecl>(Container))) 4131322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor return; 4132322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 4133322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Figure out which interface we're looking into. 4134322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor ObjCInterfaceDecl *Class = 0; 4135322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor if (ObjCImplementationDecl *ClassImpl 4136322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor = dyn_cast<ObjCImplementationDecl>(Container)) 4137322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Class = ClassImpl->getClassInterface(); 4138322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor else 4139322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Class = cast<ObjCCategoryImplDecl>(Container)->getCategoryDecl() 4140322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor ->getClassInterface(); 4141322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 4142322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // Add all of the instance variables in this class and its superclasses. 4143322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Results.EnterNewScope(); 4144322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor for(; Class; Class = Class->getSuperClass()) { 4145322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // FIXME: We could screen the type of each ivar for compatibility with 4146322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor // the property, but is that being too paternal? 4147322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor for (ObjCInterfaceDecl::ivar_iterator IVar = Class->ivar_begin(), 4148322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor IVarEnd = Class->ivar_end(); 4149322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor IVar != IVarEnd; ++IVar) 4150608300be1972c43fe99154d25d62d697e7c0a0c2Douglas Gregor Results.AddResult(Result(*IVar, 0), CurContext, 0, false); 4151322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor } 4152322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor Results.ExitScope(); 4153322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor 4154e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 4155e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 4156e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 4157322328b8a65ad2e45829eb06d245addb64037f6fDouglas Gregor} 4158e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 4159e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregortypedef llvm::DenseMap<Selector, ObjCMethodDecl *> KnownMethodsMap; 4160e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 4161e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor/// \brief Find all of the methods that reside in the given container 4162e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor/// (and its superclasses, protocols, etc.) that meet the given 4163e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor/// criteria. Insert those methods into the map of known methods, 4164e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor/// indexed by selector so they can be easily found. 4165e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregorstatic void FindImplementableMethods(ASTContext &Context, 4166e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor ObjCContainerDecl *Container, 4167e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor bool WantInstanceMethods, 4168e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor QualType ReturnType, 4169e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor bool IsInImplementation, 4170e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor KnownMethodsMap &KnownMethods) { 4171e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container)) { 4172e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Recurse into protocols. 4173e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor const ObjCList<ObjCProtocolDecl> &Protocols 4174e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor = IFace->getReferencedProtocols(); 4175e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 4176e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor E = Protocols.end(); 4177e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor I != E; ++I) 4178e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType, 4179e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor IsInImplementation, KnownMethods); 4180e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 4181e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // If we're not in the implementation of a class, also visit the 4182e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // superclass. 4183e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (!IsInImplementation && IFace->getSuperClass()) 4184e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor FindImplementableMethods(Context, IFace->getSuperClass(), 4185e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor WantInstanceMethods, ReturnType, 4186e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor IsInImplementation, KnownMethods); 4187e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 4188e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Add methods from any class extensions (but not from categories; 4189e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // those should go into category implementations). 419080aa1cd7973561889e51c1c152c8990a8de9c953Fariborz Jahanian for (const ObjCCategoryDecl *Cat = IFace->getFirstClassExtension(); Cat; 419180aa1cd7973561889e51c1c152c8990a8de9c953Fariborz Jahanian Cat = Cat->getNextClassExtension()) 419280aa1cd7973561889e51c1c152c8990a8de9c953Fariborz Jahanian FindImplementableMethods(Context, const_cast<ObjCCategoryDecl*>(Cat), 419380aa1cd7973561889e51c1c152c8990a8de9c953Fariborz Jahanian WantInstanceMethods, ReturnType, 4194e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor IsInImplementation, KnownMethods); 4195e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 4196e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 4197e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(Container)) { 4198e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Recurse into protocols. 4199e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor const ObjCList<ObjCProtocolDecl> &Protocols 4200e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor = Category->getReferencedProtocols(); 4201e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 4202e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor E = Protocols.end(); 4203e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor I != E; ++I) 4204e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType, 4205e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor IsInImplementation, KnownMethods); 4206e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 4207e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 4208e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) { 4209e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Recurse into protocols. 4210e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor const ObjCList<ObjCProtocolDecl> &Protocols 4211e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor = Protocol->getReferencedProtocols(); 4212e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 4213e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor E = Protocols.end(); 4214e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor I != E; ++I) 4215e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType, 4216e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor IsInImplementation, KnownMethods); 4217e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 4218e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 4219e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Add methods in this container. This operation occurs last because 4220e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // we want the methods from this container to override any methods 4221e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // we've previously seen with the same selector. 4222e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor for (ObjCContainerDecl::method_iterator M = Container->meth_begin(), 4223e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor MEnd = Container->meth_end(); 4224e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor M != MEnd; ++M) { 4225e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if ((*M)->isInstanceMethod() == WantInstanceMethods) { 4226e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (!ReturnType.isNull() && 4227e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor !Context.hasSameUnqualifiedType(ReturnType, (*M)->getResultType())) 4228e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor continue; 4229e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 4230e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor KnownMethods[(*M)->getSelector()] = *M; 4231e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 4232e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 4233e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor} 4234e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 4235e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregorvoid Sema::CodeCompleteObjCMethodDecl(Scope *S, 4236e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor bool IsInstanceMethod, 4237e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor TypeTy *ReturnTy, 4238d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall Decl *IDecl) { 4239e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Determine the return type of the method we're declaring, if 4240e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // provided. 4241e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor QualType ReturnType = GetTypeFromParser(ReturnTy); 4242e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 4243e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Determine where we should start searching for methods, and where we 4244e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor ObjCContainerDecl *SearchDecl = 0, *CurrentDecl = 0; 4245e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor bool IsInImplementation = false; 4246d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall if (Decl *D = IDecl) { 4247e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (ObjCImplementationDecl *Impl = dyn_cast<ObjCImplementationDecl>(D)) { 4248e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor SearchDecl = Impl->getClassInterface(); 4249e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor CurrentDecl = Impl; 4250e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor IsInImplementation = true; 4251e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } else if (ObjCCategoryImplDecl *CatImpl 4252e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor = dyn_cast<ObjCCategoryImplDecl>(D)) { 4253e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor SearchDecl = CatImpl->getCategoryDecl(); 4254e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor CurrentDecl = CatImpl; 4255e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor IsInImplementation = true; 4256e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } else { 4257e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor SearchDecl = dyn_cast<ObjCContainerDecl>(D); 4258e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor CurrentDecl = SearchDecl; 4259e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 4260e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 4261e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 4262e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (!SearchDecl && S) { 4263e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (DeclContext *DC = static_cast<DeclContext *>(S->getEntity())) { 4264e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor SearchDecl = dyn_cast<ObjCContainerDecl>(DC); 4265e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor CurrentDecl = SearchDecl; 4266e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 4267e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 4268e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 4269e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (!SearchDecl || !CurrentDecl) { 4270e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 4271e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 4272e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor 0, 0); 4273e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor return; 4274e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 4275e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 4276e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Find all of the methods that we could declare/implement here. 4277e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor KnownMethodsMap KnownMethods; 4278e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor FindImplementableMethods(Context, SearchDecl, IsInstanceMethod, 4279e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor ReturnType, IsInImplementation, KnownMethods); 4280e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 4281e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Erase any methods that have already been declared or 4282e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // implemented here. 4283e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor for (ObjCContainerDecl::method_iterator M = CurrentDecl->meth_begin(), 4284e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor MEnd = CurrentDecl->meth_end(); 4285e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor M != MEnd; ++M) { 4286e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if ((*M)->isInstanceMethod() != IsInstanceMethod) 4287e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor continue; 4288e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 4289e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor KnownMethodsMap::iterator Pos = KnownMethods.find((*M)->getSelector()); 4290e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (Pos != KnownMethods.end()) 4291e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor KnownMethods.erase(Pos); 4292e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 4293e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 4294e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Add declarations or definitions for each of the known methods. 4295e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor typedef CodeCompleteConsumer::Result Result; 4296e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor ResultBuilder Results(*this); 4297e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Results.EnterNewScope(); 4298e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor PrintingPolicy Policy(Context.PrintingPolicy); 4299e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Policy.AnonymousTagLocations = false; 4300e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor for (KnownMethodsMap::iterator M = KnownMethods.begin(), 4301e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor MEnd = KnownMethods.end(); 4302e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor M != MEnd; ++M) { 4303e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor ObjCMethodDecl *Method = M->second; 4304e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor CodeCompletionString *Pattern = new CodeCompletionString; 4305e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 4306e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // If the result type was not already provided, add it to the 4307e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // pattern as (type). 4308e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (ReturnType.isNull()) { 4309e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor std::string TypeStr; 4310e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Method->getResultType().getAsStringInternal(TypeStr, Policy); 4311e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 4312e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Pattern->AddTextChunk(TypeStr); 4313e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 4314e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 4315e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 4316e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Selector Sel = Method->getSelector(); 4317e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 4318e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Add the first part of the selector to the pattern. 4319e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Pattern->AddTypedTextChunk(Sel.getIdentifierInfoForSlot(0)->getName()); 4320e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 4321e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Add parameters to the pattern. 4322e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor unsigned I = 0; 4323e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor for (ObjCMethodDecl::param_iterator P = Method->param_begin(), 4324e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor PEnd = Method->param_end(); 4325e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor P != PEnd; (void)++P, ++I) { 4326e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Add the part of the selector name. 4327e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (I == 0) 4328e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_Colon); 4329e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor else if (I < Sel.getNumArgs()) { 4330e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 433147c03a75d5a6d1dd4d9de21b9b3543e49b825809Douglas Gregor Pattern->AddTextChunk(Sel.getIdentifierInfoForSlot(I)->getName()); 4332e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_Colon); 4333e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } else 4334e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor break; 4335e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 4336e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // Add the parameter type. 4337e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor std::string TypeStr; 4338e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor (*P)->getOriginalType().getAsStringInternal(TypeStr, Policy); 4339e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftParen); 4340e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Pattern->AddTextChunk(TypeStr); 4341e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightParen); 4342e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 4343e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (IdentifierInfo *Id = (*P)->getIdentifier()) 4344e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Pattern->AddTextChunk(Id->getName()); 4345e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 4346e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 4347e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (Method->isVariadic()) { 4348e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (Method->param_size() > 0) 4349e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_Comma); 4350e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Pattern->AddTextChunk("..."); 4351e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 4352e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 4353447107dfff705ab79d1dbf33ce79b524d63572fdDouglas Gregor if (IsInImplementation && Results.includeCodePatterns()) { 4354e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // We will be defining the method here, so add a compound statement. 4355e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 4356e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_LeftBrace); 4357e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_VerticalSpace); 4358e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor if (!Method->getResultType()->isVoidType()) { 4359e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor // If the result type is not void, add a return clause. 4360e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Pattern->AddTextChunk("return"); 4361e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_HorizontalSpace); 4362e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Pattern->AddPlaceholderChunk("expression"); 4363e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_SemiColon); 4364e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } else 4365e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Pattern->AddPlaceholderChunk("statements"); 4366e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 4367e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_VerticalSpace); 4368e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Pattern->AddChunk(CodeCompletionString::CK_RightBrace); 4369e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 4370e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 437116ed9ada523a990ca4bb5015c7bf8d0ead60c7d9Douglas Gregor Results.AddResult(Result(Pattern, CCP_CodePattern, 437216ed9ada523a990ca4bb5015c7bf8d0ead60c7d9Douglas Gregor Method->isInstanceMethod() 437316ed9ada523a990ca4bb5015c7bf8d0ead60c7d9Douglas Gregor ? CXCursor_ObjCInstanceMethodDecl 437416ed9ada523a990ca4bb5015c7bf8d0ead60c7d9Douglas Gregor : CXCursor_ObjCClassMethodDecl)); 4375e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor } 4376e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 4377e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor Results.ExitScope(); 4378e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor 4379e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 4380e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 4381e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 4382e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor} 43831f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 43841f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregorvoid Sema::CodeCompleteObjCMethodDeclSelector(Scope *S, 43851f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor bool IsInstanceMethod, 438640ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor bool AtParameterName, 43871f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor TypeTy *ReturnTy, 43881f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor IdentifierInfo **SelIdents, 43891f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor unsigned NumSelIdents) { 43901f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor // If we have an external source, load the entire class method 43913c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl // pool from the AST file. 43921f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor if (ExternalSource) { 43931f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors(); 43941f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor I != N; ++I) { 43951f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor Selector Sel = ExternalSource->GetExternalSelector(I); 4396db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl if (Sel.isNull() || MethodPool.count(Sel)) 43971f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor continue; 4398db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl 4399db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl ReadMethodPool(Sel); 44001f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor } 44011f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor } 44021f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 44031f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor // Build the set of methods we can see. 44041f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor typedef CodeCompleteConsumer::Result Result; 44051f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor ResultBuilder Results(*this); 44061f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 44071f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor if (ReturnTy) 44081f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor Results.setPreferredType(GetTypeFromParser(ReturnTy).getNonReferenceType()); 4409db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl 44101f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor Results.EnterNewScope(); 4411db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl for (GlobalMethodPool::iterator M = MethodPool.begin(), 4412db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl MEnd = MethodPool.end(); 4413db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl M != MEnd; ++M) { 4414db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl for (ObjCMethodList *MethList = IsInstanceMethod ? &M->second.first : 4415db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl &M->second.second; 4416db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl MethList && MethList->Method; 44171f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor MethList = MethList->Next) { 44181f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor if (!isAcceptableObjCMethod(MethList->Method, MK_Any, SelIdents, 44191f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor NumSelIdents)) 44201f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor continue; 44211f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 442240ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor if (AtParameterName) { 442340ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor // Suggest parameter names we've seen before. 442440ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor if (NumSelIdents && NumSelIdents <= MethList->Method->param_size()) { 442540ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor ParmVarDecl *Param = MethList->Method->param_begin()[NumSelIdents-1]; 442640ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor if (Param->getIdentifier()) { 442740ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor CodeCompletionString *Pattern = new CodeCompletionString; 442840ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor Pattern->AddTypedTextChunk(Param->getIdentifier()->getName()); 442940ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor Results.AddResult(Pattern); 443040ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor } 443140ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor } 443240ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor 443340ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor continue; 443440ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor } 443540ed9a13f5b67b2941f5a9521616e57e9e31ba97Douglas Gregor 44361f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor Result R(MethList->Method, 0); 44371f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor R.StartParameter = NumSelIdents; 44381f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor R.AllParametersAreInformative = false; 44391f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor R.DeclaringEntity = true; 44401f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor Results.MaybeAddResult(R, CurContext); 44411f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor } 44421f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor } 44431f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor 44441f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor Results.ExitScope(); 4445e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor HandleCodeCompleteResults(this, CodeCompleter, 4446e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext::CCC_Other, 4447e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor Results.data(),Results.size()); 44481f5537aaac1e775aff1d523f2cc59a9a3bd6c946Douglas Gregor} 444987c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor 445087c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregorvoid Sema::GatherGlobalCodeCompletions( 445187c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor llvm::SmallVectorImpl<CodeCompleteConsumer::Result> &Results) { 445287c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor ResultBuilder Builder(*this); 445387c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor 44548071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor if (!CodeCompleter || CodeCompleter->includeGlobals()) { 44558071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CodeCompletionDeclConsumer Consumer(Builder, 44568071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor Context.getTranslationUnitDecl()); 44578071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor LookupVisibleDecls(Context.getTranslationUnitDecl(), LookupAnyName, 44588071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor Consumer); 44598071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor } 446087c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor 446187c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor if (!CodeCompleter || CodeCompleter->includeMacros()) 446287c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor AddMacroResults(PP, Builder); 446387c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor 446487c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor Results.clear(); 446587c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor Results.insert(Results.end(), 446687c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor Builder.data(), Builder.data() + Builder.size()); 446787c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor} 4468