CodeCompleteConsumer.cpp revision 5f9e272e632e951b1efe824cd16acb4d96077930
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"
22577cdfdb20840350e841a483df630237326126d5Douglas Gregor#include "llvm/ADT/Twine.h"
2381b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor#include "llvm/Support/raw_ostream.h"
2481b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor#include <algorithm>
25e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor#include <cstring>
26e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor#include <functional>
2792eff466867fd6a82fb3e245f2091e96a3e9888eDouglas Gregor
2881b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregorusing namespace clang;
2981b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor
30e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor//===----------------------------------------------------------------------===//
316f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor// Code completion context implementation
326f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor//===----------------------------------------------------------------------===//
336f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor
346f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregorbool CodeCompletionContext::wantConstructorResults() const {
356f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor  switch (Kind) {
3652779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor  case CCC_Recovery:
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:
483da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor  case CCC_DotMemberAccess:
493da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor  case CCC_ArrowMemberAccess:
503da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor  case CCC_ObjCPropertyAccess:
516f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor  case CCC_EnumTag:
526f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor  case CCC_UnionTag:
536f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor  case CCC_ClassOrStructTag:
546f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor  case CCC_ObjCProtocolName:
556f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor  case CCC_Namespace:
566f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor  case CCC_Type:
576f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor  case CCC_Name:
586f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor  case CCC_PotentiallyQualifiedName:
596f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor  case CCC_MacroName:
606f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor  case CCC_MacroNameUse:
616f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor  case CCC_PreprocessorExpression:
626f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor  case CCC_PreprocessorDirective:
636f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor  case CCC_NaturalLanguage:
646f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor  case CCC_SelectorName:
656f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor  case CCC_TypeQualifiers:
6652779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor  case CCC_Other:
675c722c7020b33da57090422b854072258a50b3f0Douglas Gregor  case CCC_OtherWithMacros:
683da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor  case CCC_ObjCInstanceMessage:
693da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor  case CCC_ObjCClassMessage:
703da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor  case CCC_ObjCSuperclass:
713da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor  case CCC_ObjCCategoryName:
726f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor    return false;
736f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor  }
746f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor
756f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor  return false;
766f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor}
776f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor
786f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor//===----------------------------------------------------------------------===//
79e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor// Code completion string implementation
80e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor//===----------------------------------------------------------------------===//
81218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas GregorCodeCompletionString::Chunk::Chunk(ChunkKind Kind, const char *Text)
82ad5757f798b08f24942f093c4ac8b9fc2b527d39Daniel Dunbar  : Kind(Kind), Text("")
830563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor{
840c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  switch (Kind) {
850c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  case CK_TypedText:
860c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  case CK_Text:
870c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  case CK_Placeholder:
880c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  case CK_Informative:
89ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor  case CK_ResultType:
90218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor  case CK_CurrentParameter:
91218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor    this->Text = Text;
920c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    break;
930c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor
940c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  case CK_Optional:
959f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin    llvm_unreachable("Optional strings cannot be created from text");
960c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    break;
970c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor
980c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  case CK_LeftParen:
990c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    this->Text = "(";
1000c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    break;
1010c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor
1020c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  case CK_RightParen:
1030c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    this->Text = ")";
1040c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    break;
1050c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor
1060c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  case CK_LeftBracket:
1070c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    this->Text = "[";
1080c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    break;
1090c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor
1100c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  case CK_RightBracket:
1110c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    this->Text = "]";
1120c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    break;
1130c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor
1140c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  case CK_LeftBrace:
1150c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    this->Text = "{";
1160c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    break;
1170c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor
1180c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  case CK_RightBrace:
1190c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    this->Text = "}";
1200c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    break;
1210c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor
1220c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  case CK_LeftAngle:
1230c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    this->Text = "<";
1240c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    break;
1250c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor
1260c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  case CK_RightAngle:
1270c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    this->Text = ">";
1280c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    break;
1290c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor
1300c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  case CK_Comma:
1310c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    this->Text = ", ";
1320c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    break;
13301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor
13401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor  case CK_Colon:
135e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor    this->Text = ":";
13601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor    break;
13701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor
13801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor  case CK_SemiColon:
13901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor    this->Text = ";";
14001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor    break;
14101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor
14201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor  case CK_Equal:
14301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor    this->Text = " = ";
14401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor    break;
14501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor
14601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor  case CK_HorizontalSpace:
14701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor    this->Text = " ";
14801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor    break;
14901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor
15001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor  case CK_VerticalSpace:
15101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor    this->Text = "\n";
15201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor    break;
1530c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  }
1540563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor}
1550563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor
1560563c2677cfc20c9450342ddc53aa96971671c71Douglas GregorCodeCompletionString::Chunk
157218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas GregorCodeCompletionString::Chunk::CreateText(const char *Text) {
1580563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor  return Chunk(CK_Text, Text);
159e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor}
160e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor
161e6e0361984b077d205e9a45d64257d41d2c788c8Douglas GregorCodeCompletionString::Chunk
162218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas GregorCodeCompletionString::Chunk::CreateOptional(CodeCompletionString *Optional) {
163e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor  Chunk Result;
164e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor  Result.Kind = CK_Optional;
165218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor  Result.Optional = Optional;
166e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor  return Result;
167e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor}
168e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor
169e6e0361984b077d205e9a45d64257d41d2c788c8Douglas GregorCodeCompletionString::Chunk
170218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas GregorCodeCompletionString::Chunk::CreatePlaceholder(const char *Placeholder) {
1710563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor  return Chunk(CK_Placeholder, Placeholder);
1720563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor}
1730563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor
1740563c2677cfc20c9450342ddc53aa96971671c71Douglas GregorCodeCompletionString::Chunk
175218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas GregorCodeCompletionString::Chunk::CreateInformative(const char *Informative) {
1760563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor  return Chunk(CK_Informative, Informative);
177e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor}
178e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor
1790c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas GregorCodeCompletionString::Chunk
180218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas GregorCodeCompletionString::Chunk::CreateResultType(const char *ResultType) {
181ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor  return Chunk(CK_ResultType, ResultType);
182ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor}
183ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor
184ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas GregorCodeCompletionString::Chunk
1850c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas GregorCodeCompletionString::Chunk::CreateCurrentParameter(
186218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor                                                const char *CurrentParameter) {
1870c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  return Chunk(CK_CurrentParameter, CurrentParameter);
1880c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor}
1890c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor
190218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas GregorCodeCompletionString::CodeCompletionString(const Chunk *Chunks,
191218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor                                           unsigned NumChunks,
192218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor                                           unsigned Priority,
193218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor                                           CXAvailabilityKind Availability)
194218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor  : NumChunks(NumChunks), Priority(Priority), Availability(Availability)
195218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor{
196218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor  Chunk *StoredChunks = reinterpret_cast<Chunk *>(this + 1);
197218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor  for (unsigned I = 0; I != NumChunks; ++I)
198218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor    StoredChunks[I] = Chunks[I];
199e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor}
200e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor
201e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregorstd::string CodeCompletionString::getAsString() const {
202e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor  std::string Result;
203e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor  llvm::raw_string_ostream OS(Result);
204e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor
205e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor  for (iterator C = begin(), CEnd = end(); C != CEnd; ++C) {
206e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor    switch (C->Kind) {
207e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor    case CK_Optional: OS << "{#" << C->Optional->getAsString() << "#}"; break;
2080563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor    case CK_Placeholder: OS << "<#" << C->Text << "#>"; break;
209ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor
210ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor    case CK_Informative:
211ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor    case CK_ResultType:
212ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor      OS << "[#" << C->Text << "#]";
213ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor      break;
214ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor
2150c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    case CK_CurrentParameter: OS << "<#" << C->Text << "#>"; break;
2160c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    default: OS << C->Text; break;
217e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor    }
218e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor  }
2196bdeb4024a7422bbd61fad403383af76b0581d45Dan Gohman  return OS.str();
220e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor}
221e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor
22254f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregorconst char *CodeCompletionString::getTypedText() const {
22354f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor  for (iterator C = begin(), CEnd = end(); C != CEnd; ++C)
22454f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor    if (C->Kind == CK_TypedText)
22554f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor      return C->Text;
22654f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor
22754f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor  return 0;
22854f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor}
22954f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor
2305f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerconst char *CodeCompletionAllocator::CopyString(StringRef String) {
231dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor  char *Mem = (char *)Allocate(String.size() + 1, 1);
232dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor  std::copy(String.begin(), String.end(), Mem);
233dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor  Mem[String.size()] = 0;
234dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor  return Mem;
235dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor}
236dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor
2375f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerconst char *CodeCompletionAllocator::CopyString(Twine String) {
238577cdfdb20840350e841a483df630237326126d5Douglas Gregor  // FIXME: It would be more efficient to teach Twine to tell us its size and
239577cdfdb20840350e841a483df630237326126d5Douglas Gregor  // then add a routine there to fill in an allocated char* with the contents
240577cdfdb20840350e841a483df630237326126d5Douglas Gregor  // of the string.
241577cdfdb20840350e841a483df630237326126d5Douglas Gregor  llvm::SmallString<128> Data;
242577cdfdb20840350e841a483df630237326126d5Douglas Gregor  return CopyString(String.toStringRef(Data));
243577cdfdb20840350e841a483df630237326126d5Douglas Gregor}
244577cdfdb20840350e841a483df630237326126d5Douglas Gregor
245218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas GregorCodeCompletionString *CodeCompletionBuilder::TakeString() {
246218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor  void *Mem = Allocator.Allocate(
247218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor                  sizeof(CodeCompletionString) + sizeof(Chunk) * Chunks.size(),
248218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor                                 llvm::alignOf<CodeCompletionString>());
249218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor  CodeCompletionString *Result
250218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor    = new (Mem) CodeCompletionString(Chunks.data(), Chunks.size(),
251218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor                               Priority, Availability);
252218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor  Chunks.clear();
25354f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor  return Result;
25454f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor}
2550c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor
2560a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCallunsigned CodeCompletionResult::getPriorityFromDecl(NamedDecl *ND) {
25712e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor  if (!ND)
25812e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor    return CCP_Unlikely;
25912e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor
26012e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor  // Context-based decisions.
2617a126a474fdde06382b315b4e3d8ef0a21d4dc31Sebastian Redl  DeclContext *DC = ND->getDeclContext()->getRedeclContext();
26297fe61ca1749110c28eb4570a710c8983711c7b3Douglas Gregor  if (DC->isFunctionOrMethod() || isa<BlockDecl>(DC)) {
26397fe61ca1749110c28eb4570a710c8983711c7b3Douglas Gregor    // _cmd is relatively rare
26497fe61ca1749110c28eb4570a710c8983711c7b3Douglas Gregor    if (ImplicitParamDecl *ImplicitParam = dyn_cast<ImplicitParamDecl>(ND))
26597fe61ca1749110c28eb4570a710c8983711c7b3Douglas Gregor      if (ImplicitParam->getIdentifier() &&
26697fe61ca1749110c28eb4570a710c8983711c7b3Douglas Gregor          ImplicitParam->getIdentifier()->isStr("_cmd"))
26797fe61ca1749110c28eb4570a710c8983711c7b3Douglas Gregor        return CCP_ObjC_cmd;
26897fe61ca1749110c28eb4570a710c8983711c7b3Douglas Gregor
26912e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor    return CCP_LocalDeclaration;
27097fe61ca1749110c28eb4570a710c8983711c7b3Douglas Gregor  }
27112e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor  if (DC->isRecord() || isa<ObjCContainerDecl>(DC))
27212e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor    return CCP_MemberDeclaration;
27312e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor
27412e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor  // Content-based decisions.
27512e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor  if (isa<EnumConstantDecl>(ND))
27612e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor    return CCP_Constant;
27712e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor  if (isa<TypeDecl>(ND) || isa<ObjCInterfaceDecl>(ND))
27812e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor    return CCP_Type;
27997fe61ca1749110c28eb4570a710c8983711c7b3Douglas Gregor
28012e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor  return CCP_Declaration;
28112e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor}
28212e131385e892e3723483a1081a89bcad29c8a84Douglas Gregor
283e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor//===----------------------------------------------------------------------===//
2840594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor// Code completion overload candidate implementation
2850594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor//===----------------------------------------------------------------------===//
2860594438e06f58ab3798416324780ab39ca9c8f54Douglas GregorFunctionDecl *
2870594438e06f58ab3798416324780ab39ca9c8f54Douglas GregorCodeCompleteConsumer::OverloadCandidate::getFunction() const {
2880594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor  if (getKind() == CK_Function)
2890594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor    return Function;
2900594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor  else if (getKind() == CK_FunctionTemplate)
2910594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor    return FunctionTemplate->getTemplatedDecl();
2920594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor  else
2930594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor    return 0;
2940594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor}
2950594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor
2960594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregorconst FunctionType *
2970594438e06f58ab3798416324780ab39ca9c8f54Douglas GregorCodeCompleteConsumer::OverloadCandidate::getFunctionType() const {
2980594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor  switch (Kind) {
2990594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor  case CK_Function:
3000594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor    return Function->getType()->getAs<FunctionType>();
3010594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor
3020594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor  case CK_FunctionTemplate:
3030594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor    return FunctionTemplate->getTemplatedDecl()->getType()
3040594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor             ->getAs<FunctionType>();
3050594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor
3060594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor  case CK_FunctionType:
3070594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor    return Type;
3080594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor  }
3090594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor
3100594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor  return 0;
3110594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor}
3120594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor
3130594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor//===----------------------------------------------------------------------===//
314e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor// Code completion consumer implementation
315e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor//===----------------------------------------------------------------------===//
316e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor
31786d9a52c24d390631a888d4ff812e1b15445e0a0Douglas GregorCodeCompleteConsumer::~CodeCompleteConsumer() { }
318e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor
31981b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregorvoid
3203a2838d14251427089c39caec90c8abbc27f7a14Daniel DunbarPrintingCodeCompleteConsumer::ProcessCodeCompleteResults(Sema &SemaRef,
321e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor                                                 CodeCompletionContext Context,
3220a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall                                                 CodeCompletionResult *Results,
32381b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor                                                         unsigned NumResults) {
3241e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor  std::stable_sort(Results, Results + NumResults);
3251e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor
32681b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor  // Print the results.
32781b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor  for (unsigned I = 0; I != NumResults; ++I) {
328f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor    OS << "COMPLETION: ";
32981b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor    switch (Results[I].Kind) {
3300a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall    case CodeCompletionResult::RK_Declaration:
331900fc6388e803868a34b9483510c345e9b49d7ebBenjamin Kramer      OS << Results[I].Declaration;
33281b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor      if (Results[I].Hidden)
33381b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor        OS << " (Hidden)";
33486d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor      if (CodeCompletionString *CCS
335218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor            = Results[I].CreateCodeCompletionString(SemaRef, Allocator)) {
336e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor        OS << " : " << CCS->getAsString();
337e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor      }
338e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor
33981b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor      OS << '\n';
34081b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor      break;
34181b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor
3420a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall    case CodeCompletionResult::RK_Keyword:
343ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor      OS << Results[I].Keyword << '\n';
34481b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor      break;
3453f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor
3460a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall    case CodeCompletionResult::RK_Macro: {
347ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor      OS << Results[I].Macro->getName();
3483f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor      if (CodeCompletionString *CCS
349218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor            = Results[I].CreateCodeCompletionString(SemaRef, Allocator)) {
3503f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor        OS << " : " << CCS->getAsString();
3513f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor      }
3523f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor      OS << '\n';
3533f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor      break;
3543f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor    }
35554f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor
3560a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall    case CodeCompletionResult::RK_Pattern: {
357ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor      OS << "Pattern : "
35854f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor         << Results[I].Pattern->getAsString() << '\n';
35954f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor      break;
36054f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor    }
36181b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor    }
36281b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor  }
36381b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor}
3640594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor
3650594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregorvoid
3663a2838d14251427089c39caec90c8abbc27f7a14Daniel DunbarPrintingCodeCompleteConsumer::ProcessOverloadCandidates(Sema &SemaRef,
3673a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar                                                        unsigned CurrentArg,
3680594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor                                              OverloadCandidate *Candidates,
3690594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor                                                     unsigned NumCandidates) {
3700594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor  for (unsigned I = 0; I != NumCandidates; ++I) {
37186d802e03a267af79663990c39865c67e0645238Douglas Gregor    if (CodeCompletionString *CCS
372218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor          = Candidates[I].CreateSignatureString(CurrentArg, SemaRef,
373218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor                                                Allocator)) {
374f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor      OS << "OVERLOAD: " << CCS->getAsString() << "\n";
3750594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor    }
3760594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor  }
3770594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor}
3780c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor
3790a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCallvoid CodeCompletionResult::computeCursorKindAndAvailability() {
38087c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor  switch (Kind) {
38187c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor  case RK_Declaration:
38258ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor    // Set the availability based on attributes.
3830a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor    switch (Declaration->getAvailability()) {
3840a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor    case AR_Available:
3850a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor    case AR_NotYetIntroduced:
3860a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor      Availability = CXAvailability_Available;
3870a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor      break;
3880a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor
3890a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor    case AR_Deprecated:
39058ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor      Availability = CXAvailability_Deprecated;
3910a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor      break;
39258ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor
3930a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor    case AR_Unavailable:
3940a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor      Availability = CXAvailability_NotAvailable;
3950a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor      break;
3960a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor    }
3970a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor
398e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor    if (FunctionDecl *Function = dyn_cast<FunctionDecl>(Declaration))
399e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor      if (Function->isDeleted())
40058ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor        Availability = CXAvailability_NotAvailable;
401e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor
402e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor    CursorKind = getCursorKindForDecl(Declaration);
403e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor    if (CursorKind == CXCursor_UnexposedDecl)
40487c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor      CursorKind = CXCursor_NotImplemented;
40587c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor    break;
40687c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor
4070a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall  case RK_Macro:
40858ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor    Availability = CXAvailability_Available;
40987c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor    CursorKind = CXCursor_MacroDefinition;
41087c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor    break;
41187c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor
4120a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall  case RK_Keyword:
41358ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor    Availability = CXAvailability_Available;
41487c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor    CursorKind = CXCursor_NotImplemented;
41587c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor    break;
41687c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor
4170a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall  case RK_Pattern:
41887c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor    // Do nothing: Patterns can come with cursor kinds!
41987c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor    break;
4201abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor  }
4211abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor}
4222b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor
423721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor/// \brief Retrieve the name that should be used to order a result.
424721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor///
425721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor/// If the name needs to be constructed as a string, that string will be
426721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor/// saved into Saved and the returned StringRef will refer to it.
4275f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerstatic StringRef getOrderedName(const CodeCompletionResult &R,
428721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor                                    std::string &Saved) {
429721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor  switch (R.Kind) {
430721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor    case CodeCompletionResult::RK_Keyword:
431721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor      return R.Keyword;
432721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor
433721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor    case CodeCompletionResult::RK_Pattern:
434721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor      return R.Pattern->getTypedText();
435721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor
436721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor    case CodeCompletionResult::RK_Macro:
437721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor      return R.Macro->getName();
438721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor
439721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor    case CodeCompletionResult::RK_Declaration:
440721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor      // Handle declarations below.
441721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor      break;
442721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor  }
443721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor
444721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor  DeclarationName Name = R.Declaration->getDeclName();
445721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor
446721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor  // If the name is a simple identifier (by far the common case), or a
447721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor  // zero-argument selector, just return a reference to that identifier.
448721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor  if (IdentifierInfo *Id = Name.getAsIdentifierInfo())
449721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor    return Id->getName();
450721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor  if (Name.isObjCZeroArgSelector())
451721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor    if (IdentifierInfo *Id
452721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor        = Name.getObjCSelector().getIdentifierInfoForSlot(0))
453721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor      return Id->getName();
454721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor
455721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor  Saved = Name.getAsString();
456721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor  return Saved;
457721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor}
458721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor
459721f359a350059a81945baa08f63b2e5feceb044Douglas Gregorbool clang::operator<(const CodeCompletionResult &X,
460721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor                      const CodeCompletionResult &Y) {
461721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor  std::string XSaved, YSaved;
4625f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  StringRef XStr = getOrderedName(X, XSaved);
4635f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  StringRef YStr = getOrderedName(Y, YSaved);
464721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor  int cmp = XStr.compare_lower(YStr);
465721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor  if (cmp)
466721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor    return cmp < 0;
467721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor
4681e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor  // If case-insensitive comparison fails, try case-sensitive comparison.
4691e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor  cmp = XStr.compare(YStr);
4701e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor  if (cmp)
4711e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor    return cmp < 0;
472721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor
473721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor  return false;
474721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor}
475