CodeCompleteConsumer.cpp revision 6f942b2cabf32b96f9901b889d8e44a34e0e7c62
186d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor//===--- CodeCompleteConsumer.cpp - Code Completion Interface ---*- 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 implements the CodeCompleteConsumer class. 1181b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor// 1281b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor//===----------------------------------------------------------------------===// 1381b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor#include "clang/Sema/CodeCompleteConsumer.h" 1419510856727e0e14a3696b2a72c35163bff2a71fJohn McCall#include "clang/Sema/Scope.h" 15e737f5041a36d0befb39ffeed8d50ba15916d3daDouglas Gregor#include "clang/Sema/Sema.h" 1675b7128e93d736331bde659b05cd176f9dd6d047Douglas Gregor#include "clang/AST/DeclCXX.h" 177cd088e519d7e6caa4c4c12db52e0e4ae35d25c2John McCall#include "clang/AST/DeclObjC.h" 182a7fb27913999d132cf9e10e03dc5271faa2e9d3John McCall#include "clang/AST/DeclTemplate.h" 1981b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor#include "clang/Lex/Preprocessor.h" 202b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor#include "clang-c/Index.h" 2181b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor#include "llvm/ADT/STLExtras.h" 2281b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor#include "llvm/Support/raw_ostream.h" 2381b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor#include <algorithm> 24e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor#include <cstring> 25e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor#include <functional> 2692eff466867fd6a82fb3e245f2091e96a3e9888eDouglas Gregor 2781b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregorusing namespace clang; 2892eff466867fd6a82fb3e245f2091e96a3e9888eDouglas Gregorusing llvm::StringRef; 2981b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor 30e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor//===----------------------------------------------------------------------===// 316f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor// Code completion context implementation 326f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor//===----------------------------------------------------------------------===// 336f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 346f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregorbool CodeCompletionContext::wantConstructorResults() const { 356f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor switch (Kind) { 366f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_Other: 376f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_Statement: 386f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_Expression: 396f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_ObjCMessageReceiver: 406f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_ParenthesizedExpression: 416f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor return true; 426f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 436f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_TopLevel: 446f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_ObjCInterface: 456f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_ObjCImplementation: 466f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_ObjCIvarList: 476f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_ClassStructUnion: 486f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_MemberAccess: 496f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_EnumTag: 506f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_UnionTag: 516f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_ClassOrStructTag: 526f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_ObjCProtocolName: 536f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_Namespace: 546f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_Type: 556f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_Name: 566f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_PotentiallyQualifiedName: 576f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_MacroName: 586f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_MacroNameUse: 596f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_PreprocessorExpression: 606f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_PreprocessorDirective: 616f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_NaturalLanguage: 626f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_SelectorName: 636f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor case CCC_TypeQualifiers: 646f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor return false; 656f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor } 666f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 676f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor return false; 686f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor} 696f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor 706f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor//===----------------------------------------------------------------------===// 71e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor// Code completion string implementation 72e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor//===----------------------------------------------------------------------===// 730c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas GregorCodeCompletionString::Chunk::Chunk(ChunkKind Kind, llvm::StringRef Text) 74ad5757f798b08f24942f093c4ac8b9fc2b527d39Daniel Dunbar : Kind(Kind), Text("") 750563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor{ 760c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor switch (Kind) { 770c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_TypedText: 780c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_Text: 790c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_Placeholder: 800c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_Informative: 81ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor case CK_ResultType: 820c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_CurrentParameter: { 830c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor char *New = new char [Text.size() + 1]; 840c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor std::memcpy(New, Text.data(), Text.size()); 850c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor New[Text.size()] = '\0'; 860c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor this->Text = New; 870c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor break; 880c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor } 890c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 900c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_Optional: 919f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin llvm_unreachable("Optional strings cannot be created from text"); 920c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor break; 930c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 940c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_LeftParen: 950c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor this->Text = "("; 960c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor break; 970c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 980c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_RightParen: 990c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor this->Text = ")"; 1000c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor break; 1010c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 1020c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_LeftBracket: 1030c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor this->Text = "["; 1040c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor break; 1050c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 1060c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_RightBracket: 1070c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor this->Text = "]"; 1080c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor break; 1090c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 1100c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_LeftBrace: 1110c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor this->Text = "{"; 1120c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor break; 1130c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 1140c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_RightBrace: 1150c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor this->Text = "}"; 1160c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor break; 1170c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 1180c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_LeftAngle: 1190c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor this->Text = "<"; 1200c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor break; 1210c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 1220c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_RightAngle: 1230c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor this->Text = ">"; 1240c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor break; 1250c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 1260c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_Comma: 1270c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor this->Text = ", "; 1280c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor break; 12901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 13001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CK_Colon: 131e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor this->Text = ":"; 13201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 13301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 13401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CK_SemiColon: 13501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor this->Text = ";"; 13601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 13701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 13801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CK_Equal: 13901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor this->Text = " = "; 14001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 14101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 14201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CK_HorizontalSpace: 14301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor this->Text = " "; 14401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 14501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor 14601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CK_VerticalSpace: 14701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor this->Text = "\n"; 14801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor break; 1490c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor } 1500563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor} 1510563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor 1520563c2677cfc20c9450342ddc53aa96971671c71Douglas GregorCodeCompletionString::Chunk 15392eff466867fd6a82fb3e245f2091e96a3e9888eDouglas GregorCodeCompletionString::Chunk::CreateText(StringRef Text) { 1540563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor return Chunk(CK_Text, Text); 155e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor} 156e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor 157e6e0361984b077d205e9a45d64257d41d2c788c8Douglas GregorCodeCompletionString::Chunk 158e6e0361984b077d205e9a45d64257d41d2c788c8Douglas GregorCodeCompletionString::Chunk::CreateOptional( 159e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor std::auto_ptr<CodeCompletionString> Optional) { 160e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor Chunk Result; 161e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor Result.Kind = CK_Optional; 162e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor Result.Optional = Optional.release(); 163e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor return Result; 164e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor} 165e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor 166e6e0361984b077d205e9a45d64257d41d2c788c8Douglas GregorCodeCompletionString::Chunk 16792eff466867fd6a82fb3e245f2091e96a3e9888eDouglas GregorCodeCompletionString::Chunk::CreatePlaceholder(StringRef Placeholder) { 1680563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor return Chunk(CK_Placeholder, Placeholder); 1690563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor} 1700563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor 1710563c2677cfc20c9450342ddc53aa96971671c71Douglas GregorCodeCompletionString::Chunk 17292eff466867fd6a82fb3e245f2091e96a3e9888eDouglas GregorCodeCompletionString::Chunk::CreateInformative(StringRef Informative) { 1730563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor return Chunk(CK_Informative, Informative); 174e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor} 175e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor 1760c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas GregorCodeCompletionString::Chunk 177ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas GregorCodeCompletionString::Chunk::CreateResultType(StringRef ResultType) { 178ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor return Chunk(CK_ResultType, ResultType); 179ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor} 180ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor 181ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas GregorCodeCompletionString::Chunk 1820c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas GregorCodeCompletionString::Chunk::CreateCurrentParameter( 18392eff466867fd6a82fb3e245f2091e96a3e9888eDouglas Gregor StringRef CurrentParameter) { 1840c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor return Chunk(CK_CurrentParameter, CurrentParameter); 1850c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor} 1860c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 18754f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas GregorCodeCompletionString::Chunk CodeCompletionString::Chunk::Clone() const { 18854f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor switch (Kind) { 18954f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor case CK_TypedText: 19054f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor case CK_Text: 19154f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor case CK_Placeholder: 19254f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor case CK_Informative: 193ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor case CK_ResultType: 19454f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor case CK_CurrentParameter: 19554f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor case CK_LeftParen: 19654f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor case CK_RightParen: 19754f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor case CK_LeftBracket: 19854f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor case CK_RightBracket: 19954f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor case CK_LeftBrace: 20054f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor case CK_RightBrace: 20154f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor case CK_LeftAngle: 20254f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor case CK_RightAngle: 20354f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor case CK_Comma: 20401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CK_Colon: 20501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CK_SemiColon: 20601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CK_Equal: 20701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CK_HorizontalSpace: 20801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CK_VerticalSpace: 20954f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor return Chunk(Kind, Text); 21054f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor 21154f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor case CK_Optional: { 21254f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor std::auto_ptr<CodeCompletionString> Opt(Optional->Clone()); 21354f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor return CreateOptional(Opt); 21454f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor } 21554f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor } 21654f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor 21754f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor // Silence GCC warning. 21854f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor return Chunk(); 21954f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor} 2200c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 221e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregorvoid 222e6e0361984b077d205e9a45d64257d41d2c788c8Douglas GregorCodeCompletionString::Chunk::Destroy() { 223e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor switch (Kind) { 2240563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor case CK_Optional: 2250563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor delete Optional; 2260563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor break; 2270563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor 2280c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_TypedText: 2290563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor case CK_Text: 2300563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor case CK_Placeholder: 2310563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor case CK_Informative: 232ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor case CK_ResultType: 2330c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_CurrentParameter: 2340c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor delete [] Text; 2350c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor break; 2360c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 2370c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_LeftParen: 2380c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_RightParen: 2390c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_LeftBracket: 2400c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_RightBracket: 2410c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_LeftBrace: 2420c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_RightBrace: 2430c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_LeftAngle: 2440c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_RightAngle: 2450c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_Comma: 24601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CK_Colon: 24701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CK_SemiColon: 24801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CK_Equal: 24901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CK_HorizontalSpace: 25001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CK_VerticalSpace: 2510563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor break; 252e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor } 253e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor} 254e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor 25512e131385e892e3723483a1081a89bcad29c8a84Douglas Gregorvoid CodeCompletionString::clear() { 256e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor std::for_each(Chunks.begin(), Chunks.end(), 257e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor std::mem_fun_ref(&Chunk::Destroy)); 25812e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor Chunks.clear(); 259e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor} 260e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor 261e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregorstd::string CodeCompletionString::getAsString() const { 262e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor std::string Result; 263e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor llvm::raw_string_ostream OS(Result); 264e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor 265e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor for (iterator C = begin(), CEnd = end(); C != CEnd; ++C) { 266e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor switch (C->Kind) { 267e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor case CK_Optional: OS << "{#" << C->Optional->getAsString() << "#}"; break; 2680563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor case CK_Placeholder: OS << "<#" << C->Text << "#>"; break; 269ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor 270ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor case CK_Informative: 271ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor case CK_ResultType: 272ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor OS << "[#" << C->Text << "#]"; 273ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor break; 274ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor 2750c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_CurrentParameter: OS << "<#" << C->Text << "#>"; break; 2760c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor default: OS << C->Text; break; 277e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor } 278e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor } 2796bdeb4024a7422bbd61fad403383af76b0581d45Dan Gohman return OS.str(); 280e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor} 281e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor 28254f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregorconst char *CodeCompletionString::getTypedText() const { 28354f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor for (iterator C = begin(), CEnd = end(); C != CEnd; ++C) 28454f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor if (C->Kind == CK_TypedText) 28554f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor return C->Text; 28654f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor 28754f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor return 0; 28854f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor} 28954f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor 2901abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas GregorCodeCompletionString * 2911abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas GregorCodeCompletionString::Clone(CodeCompletionString *Result) const { 2921abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor if (!Result) 2931abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor Result = new CodeCompletionString; 29454f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor for (iterator C = begin(), CEnd = end(); C != CEnd; ++C) 29554f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor Result->AddChunk(C->Clone()); 29654f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor return Result; 29754f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor} 2980c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 2992b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregorstatic void WriteUnsigned(llvm::raw_ostream &OS, unsigned Value) { 3002b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor OS.write((const char *)&Value, sizeof(unsigned)); 3012b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor} 3020c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 3032b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregorstatic bool ReadUnsigned(const char *&Memory, const char *MemoryEnd, 3042b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor unsigned &Value) { 3052b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor if (Memory + sizeof(unsigned) > MemoryEnd) 3062b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor return true; 3072b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 3082b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor memmove(&Value, Memory, sizeof(unsigned)); 3092b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor Memory += sizeof(unsigned); 3102b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor return false; 3110c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor} 3120c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 3130c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregorvoid CodeCompletionString::Serialize(llvm::raw_ostream &OS) const { 3142b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor // Write the number of chunks. 3152b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor WriteUnsigned(OS, size()); 3162b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 3170c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor for (iterator C = begin(), CEnd = end(); C != CEnd; ++C) { 3182b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor WriteUnsigned(OS, C->Kind); 3192b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 3200c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor switch (C->Kind) { 3210c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_TypedText: 3220c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_Text: 3230c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_Placeholder: 3240c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_Informative: 325ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor case CK_ResultType: 3262b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor case CK_CurrentParameter: { 3272b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor const char *Text = C->Text; 3282b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor unsigned StrLen = strlen(Text); 3292b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor WriteUnsigned(OS, StrLen); 3302b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor OS.write(Text, StrLen); 3310c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor break; 3322b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor } 3332b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 3342b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor case CK_Optional: 3352b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor C->Optional->Serialize(OS); 3360c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor break; 3372b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 3380c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_LeftParen: 3390c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_RightParen: 3400c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_LeftBracket: 3410c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_RightBracket: 3420c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_LeftBrace: 3430c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_RightBrace: 3440c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_LeftAngle: 3450c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_RightAngle: 3460c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor case CK_Comma: 34701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CK_Colon: 34801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CK_SemiColon: 34901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CK_Equal: 35001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CK_HorizontalSpace: 35101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CK_VerticalSpace: 3520c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor break; 3532b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor } 3540c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor } 3550c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor} 3560c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 35712e131385e892e3723483a1081a89bcad29c8a84Douglas Gregorbool CodeCompletionString::Deserialize(const char *&Str, const char *StrEnd) { 3582b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor if (Str == StrEnd || *Str == 0) 35912e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor return false; 3600c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 3612b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor unsigned NumBlocks; 3622b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor if (ReadUnsigned(Str, StrEnd, NumBlocks)) 36312e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor return false; 3642b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 3652b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor for (unsigned I = 0; I != NumBlocks; ++I) { 3662b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor if (Str + 1 >= StrEnd) 3670c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor break; 3682b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 3692b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor // Parse the next kind. 3702b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor unsigned KindValue; 3712b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor if (ReadUnsigned(Str, StrEnd, KindValue)) 37212e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor return false; 3732b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 3742b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor switch (ChunkKind Kind = (ChunkKind)KindValue) { 3752b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor case CK_TypedText: 3762b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor case CK_Text: 3772b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor case CK_Placeholder: 3782b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor case CK_Informative: 379ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor case CK_ResultType: 3802b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor case CK_CurrentParameter: { 3812b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor unsigned StrLen; 3822b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor if (ReadUnsigned(Str, StrEnd, StrLen) || (Str + StrLen > StrEnd)) 38312e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor return false; 3842b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 38512e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor AddChunk(Chunk(Kind, StringRef(Str, StrLen))); 3862b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor Str += StrLen; 3870c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor break; 3880c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor } 3892b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 3902b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor case CK_Optional: { 39112e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor std::auto_ptr<CodeCompletionString> Optional(new CodeCompletionString()); 39212e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor if (Optional->Deserialize(Str, StrEnd)) 39312e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor AddOptionalChunk(Optional); 3942b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor break; 3950c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor } 3962b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 3972b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor case CK_LeftParen: 3982b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor case CK_RightParen: 3992b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor case CK_LeftBracket: 4002b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor case CK_RightBracket: 4012b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor case CK_LeftBrace: 4022b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor case CK_RightBrace: 4032b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor case CK_LeftAngle: 4042b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor case CK_RightAngle: 4052b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor case CK_Comma: 40601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CK_Colon: 40701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CK_SemiColon: 40801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CK_Equal: 40901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CK_HorizontalSpace: 41001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor case CK_VerticalSpace: 41112e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor AddChunk(Chunk(Kind)); 4122b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor break; 4130c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor } 4142b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor }; 4150c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 41612e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor return true; 4170c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor} 4180c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 4190a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCallvoid CodeCompletionResult::Destroy() { 42054f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor if (Kind == RK_Pattern) { 42154f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor delete Pattern; 42254f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor Pattern = 0; 42354f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor } 42454f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor} 42554f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor 4260a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCallunsigned CodeCompletionResult::getPriorityFromDecl(NamedDecl *ND) { 42712e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor if (!ND) 42812e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor return CCP_Unlikely; 42912e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor 43012e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor // Context-based decisions. 4317a126a474fdde06382b315b4e3d8ef0a21d4dc31Sebastian Redl DeclContext *DC = ND->getDeclContext()->getRedeclContext(); 43297fe61ca1749110c28eb4570a710c8983711c7b3Douglas Gregor if (DC->isFunctionOrMethod() || isa<BlockDecl>(DC)) { 43397fe61ca1749110c28eb4570a710c8983711c7b3Douglas Gregor // _cmd is relatively rare 43497fe61ca1749110c28eb4570a710c8983711c7b3Douglas Gregor if (ImplicitParamDecl *ImplicitParam = dyn_cast<ImplicitParamDecl>(ND)) 43597fe61ca1749110c28eb4570a710c8983711c7b3Douglas Gregor if (ImplicitParam->getIdentifier() && 43697fe61ca1749110c28eb4570a710c8983711c7b3Douglas Gregor ImplicitParam->getIdentifier()->isStr("_cmd")) 43797fe61ca1749110c28eb4570a710c8983711c7b3Douglas Gregor return CCP_ObjC_cmd; 43897fe61ca1749110c28eb4570a710c8983711c7b3Douglas Gregor 43912e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor return CCP_LocalDeclaration; 44097fe61ca1749110c28eb4570a710c8983711c7b3Douglas Gregor } 44112e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor if (DC->isRecord() || isa<ObjCContainerDecl>(DC)) 44212e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor return CCP_MemberDeclaration; 44312e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor 44412e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor // Content-based decisions. 44512e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor if (isa<EnumConstantDecl>(ND)) 44612e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor return CCP_Constant; 44712e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor if (isa<TypeDecl>(ND) || isa<ObjCInterfaceDecl>(ND)) 44812e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor return CCP_Type; 44997fe61ca1749110c28eb4570a710c8983711c7b3Douglas Gregor 45012e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor return CCP_Declaration; 45112e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor} 45212e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor 453e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor//===----------------------------------------------------------------------===// 4540594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor// Code completion overload candidate implementation 4550594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor//===----------------------------------------------------------------------===// 4560594438e06f58ab3798416324780ab39ca9c8f54Douglas GregorFunctionDecl * 4570594438e06f58ab3798416324780ab39ca9c8f54Douglas GregorCodeCompleteConsumer::OverloadCandidate::getFunction() const { 4580594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor if (getKind() == CK_Function) 4590594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor return Function; 4600594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor else if (getKind() == CK_FunctionTemplate) 4610594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor return FunctionTemplate->getTemplatedDecl(); 4620594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor else 4630594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor return 0; 4640594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor} 4650594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor 4660594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregorconst FunctionType * 4670594438e06f58ab3798416324780ab39ca9c8f54Douglas GregorCodeCompleteConsumer::OverloadCandidate::getFunctionType() const { 4680594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor switch (Kind) { 4690594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor case CK_Function: 4700594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor return Function->getType()->getAs<FunctionType>(); 4710594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor 4720594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor case CK_FunctionTemplate: 4730594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor return FunctionTemplate->getTemplatedDecl()->getType() 4740594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor ->getAs<FunctionType>(); 4750594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor 4760594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor case CK_FunctionType: 4770594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor return Type; 4780594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor } 4790594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor 4800594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor return 0; 4810594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor} 4820594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor 4830594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor//===----------------------------------------------------------------------===// 484e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor// Code completion consumer implementation 485e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor//===----------------------------------------------------------------------===// 486e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor 48786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas GregorCodeCompleteConsumer::~CodeCompleteConsumer() { } 488e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor 48981b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregorvoid 4903a2838d14251427089c39caec90c8abbc27f7a14Daniel DunbarPrintingCodeCompleteConsumer::ProcessCodeCompleteResults(Sema &SemaRef, 491e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext Context, 4920a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall CodeCompletionResult *Results, 49381b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor unsigned NumResults) { 4941e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor std::stable_sort(Results, Results + NumResults); 4951e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor 49681b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor // Print the results. 49781b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor for (unsigned I = 0; I != NumResults; ++I) { 498f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor OS << "COMPLETION: "; 49981b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor switch (Results[I].Kind) { 5000a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall case CodeCompletionResult::RK_Declaration: 501900fc6388e803868a34b9483510c345e9b49d7ebBenjamin Kramer OS << Results[I].Declaration; 50281b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor if (Results[I].Hidden) 50381b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor OS << " (Hidden)"; 50486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor if (CodeCompletionString *CCS 50586d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor = Results[I].CreateCodeCompletionString(SemaRef)) { 506e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor OS << " : " << CCS->getAsString(); 507e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor delete CCS; 508e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor } 509e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor 51081b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor OS << '\n'; 51181b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor break; 51281b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor 5130a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall case CodeCompletionResult::RK_Keyword: 514ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor OS << Results[I].Keyword << '\n'; 51581b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor break; 5163f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor 5170a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall case CodeCompletionResult::RK_Macro: { 518ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor OS << Results[I].Macro->getName(); 5193f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor if (CodeCompletionString *CCS 520ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor = Results[I].CreateCodeCompletionString(SemaRef)) { 5213f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor OS << " : " << CCS->getAsString(); 5223f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor delete CCS; 5233f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor } 5243f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor OS << '\n'; 5253f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor break; 5263f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor } 52754f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor 5280a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall case CodeCompletionResult::RK_Pattern: { 529ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor OS << "Pattern : " 53054f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor << Results[I].Pattern->getAsString() << '\n'; 53154f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor break; 53254f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor } 53381b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor } 53481b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor } 53581b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor} 5360594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor 5370594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregorvoid 5383a2838d14251427089c39caec90c8abbc27f7a14Daniel DunbarPrintingCodeCompleteConsumer::ProcessOverloadCandidates(Sema &SemaRef, 5393a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar unsigned CurrentArg, 5400594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor OverloadCandidate *Candidates, 5410594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor unsigned NumCandidates) { 5420594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor for (unsigned I = 0; I != NumCandidates; ++I) { 54386d802e03a267af79663990c39865c67e0645238Douglas Gregor if (CodeCompletionString *CCS 54486d802e03a267af79663990c39865c67e0645238Douglas Gregor = Candidates[I].CreateSignatureString(CurrentArg, SemaRef)) { 545f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor OS << "OVERLOAD: " << CCS->getAsString() << "\n"; 54686d802e03a267af79663990c39865c67e0645238Douglas Gregor delete CCS; 5470594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor } 5480594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor } 5490594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor} 5500c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 5510a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCallvoid CodeCompletionResult::computeCursorKindAndAvailability() { 55287c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor switch (Kind) { 55387c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor case RK_Declaration: 55458ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor // Set the availability based on attributes. 55558ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor Availability = CXAvailability_Available; 55658ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor if (Declaration->getAttr<UnavailableAttr>()) 55758ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor Availability = CXAvailability_NotAvailable; 55858ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor else if (Declaration->getAttr<DeprecatedAttr>()) 55958ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor Availability = CXAvailability_Deprecated; 56058ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor 561e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor if (FunctionDecl *Function = dyn_cast<FunctionDecl>(Declaration)) 562e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor if (Function->isDeleted()) 56358ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor Availability = CXAvailability_NotAvailable; 564e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor 565e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor CursorKind = getCursorKindForDecl(Declaration); 566e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor if (CursorKind == CXCursor_UnexposedDecl) 56787c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor CursorKind = CXCursor_NotImplemented; 56887c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor break; 56987c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor 5700a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall case RK_Macro: 57158ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor Availability = CXAvailability_Available; 57287c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor CursorKind = CXCursor_MacroDefinition; 57387c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor break; 57487c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor 5750a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall case RK_Keyword: 57658ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor Availability = CXAvailability_Available; 57787c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor CursorKind = CXCursor_NotImplemented; 57887c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor break; 57987c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor 5800a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall case RK_Pattern: 58187c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor // Do nothing: Patterns can come with cursor kinds! 58287c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor break; 5831abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor } 5841abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor} 5852b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 586721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor/// \brief Retrieve the name that should be used to order a result. 587721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor/// 588721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor/// If the name needs to be constructed as a string, that string will be 589721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor/// saved into Saved and the returned StringRef will refer to it. 590721f359a350059a81945baa08f63b2e5feceb044Douglas Gregorstatic llvm::StringRef getOrderedName(const CodeCompletionResult &R, 591721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor std::string &Saved) { 592721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor switch (R.Kind) { 593721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor case CodeCompletionResult::RK_Keyword: 594721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor return R.Keyword; 595721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor 596721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor case CodeCompletionResult::RK_Pattern: 597721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor return R.Pattern->getTypedText(); 598721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor 599721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor case CodeCompletionResult::RK_Macro: 600721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor return R.Macro->getName(); 601721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor 602721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor case CodeCompletionResult::RK_Declaration: 603721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor // Handle declarations below. 604721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor break; 605721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor } 606721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor 607721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor DeclarationName Name = R.Declaration->getDeclName(); 608721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor 609721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor // If the name is a simple identifier (by far the common case), or a 610721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor // zero-argument selector, just return a reference to that identifier. 611721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor if (IdentifierInfo *Id = Name.getAsIdentifierInfo()) 612721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor return Id->getName(); 613721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor if (Name.isObjCZeroArgSelector()) 614721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor if (IdentifierInfo *Id 615721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor = Name.getObjCSelector().getIdentifierInfoForSlot(0)) 616721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor return Id->getName(); 617721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor 618721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor Saved = Name.getAsString(); 619721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor return Saved; 620721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor} 621721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor 622721f359a350059a81945baa08f63b2e5feceb044Douglas Gregorbool clang::operator<(const CodeCompletionResult &X, 623721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor const CodeCompletionResult &Y) { 624721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor std::string XSaved, YSaved; 625721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor llvm::StringRef XStr = getOrderedName(X, XSaved); 626721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor llvm::StringRef YStr = getOrderedName(Y, YSaved); 627721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor int cmp = XStr.compare_lower(YStr); 628721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor if (cmp) 629721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor return cmp < 0; 630721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor 6311e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor // If case-insensitive comparison fails, try case-sensitive comparison. 6321e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor cmp = XStr.compare(YStr); 6331e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor if (cmp) 6341e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor return cmp < 0; 635721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor 636721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor return false; 637721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor} 638721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor 6391abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregorvoid 6401abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas GregorCIndexCodeCompleteConsumer::ProcessCodeCompleteResults(Sema &SemaRef, 641e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor CodeCompletionContext Context, 6420a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall CodeCompletionResult *Results, 6431abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor unsigned NumResults) { 6441abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor // Print the results. 6451abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor for (unsigned I = 0; I != NumResults; ++I) { 64687c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor WriteUnsigned(OS, Results[I].CursorKind); 64712e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor WriteUnsigned(OS, Results[I].Priority); 64858ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor WriteUnsigned(OS, Results[I].Availability); 6492b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor CodeCompletionString *CCS = Results[I].CreateCodeCompletionString(SemaRef); 6502b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor assert(CCS && "No code-completion string?"); 6512b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor CCS->Serialize(OS); 6522b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor delete CCS; 6530c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor } 6540c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor} 6550c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor 6560c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregorvoid 6573a2838d14251427089c39caec90c8abbc27f7a14Daniel DunbarCIndexCodeCompleteConsumer::ProcessOverloadCandidates(Sema &SemaRef, 6583a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar unsigned CurrentArg, 6590c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor OverloadCandidate *Candidates, 6600c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor unsigned NumCandidates) { 6610c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor for (unsigned I = 0; I != NumCandidates; ++I) { 6622b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor WriteUnsigned(OS, CXCursor_NotImplemented); 6631e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor WriteUnsigned(OS, /*Priority=*/I); 66458ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor WriteUnsigned(OS, /*Availability=*/CXAvailability_Available); 6652b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor CodeCompletionString *CCS 6662b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor = Candidates[I].CreateSignatureString(CurrentArg, SemaRef); 6672b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor assert(CCS && "No code-completion string?"); 6682b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor CCS->Serialize(OS); 6692b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor delete CCS; 6700c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor } 6710c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor} 672