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