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"
1455fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang-c/Index.h"
1575b7128e93d736331bde659b05cd176f9dd6d047Douglas Gregor#include "clang/AST/DeclCXX.h"
167cd088e519d7e6caa4c4c12db52e0e4ae35d25c2John McCall#include "clang/AST/DeclObjC.h"
172a7fb27913999d132cf9e10e03dc5271faa2e9d3John McCall#include "clang/AST/DeclTemplate.h"
1855fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Sema/Scope.h"
1955fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Sema/Sema.h"
2081b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor#include "llvm/ADT/STLExtras.h"
2155fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "llvm/ADT/SmallString.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:
700f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor  case CCC_ObjCInterfaceName:
713da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor  case CCC_ObjCCategoryName:
726f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor    return false;
736f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor  }
747530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie
757530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie  llvm_unreachable("Invalid CodeCompletionContext::Kind!");
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
970c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  case CK_LeftParen:
980c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    this->Text = "(";
990c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    break;
1000c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor
1010c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  case CK_RightParen:
1020c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    this->Text = ")";
1030c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    break;
1040c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor
1050c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  case CK_LeftBracket:
1060c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    this->Text = "[";
1070c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    break;
1080c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor
1090c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  case CK_RightBracket:
1100c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    this->Text = "]";
1110c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    break;
1120c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor
1130c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  case CK_LeftBrace:
1140c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    this->Text = "{";
1150c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    break;
1160c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor
1170c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  case CK_RightBrace:
1180c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    this->Text = "}";
1190c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    break;
1200c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor
1210c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  case CK_LeftAngle:
1220c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    this->Text = "<";
1230c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    break;
1240c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor
1250c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  case CK_RightAngle:
1260c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    this->Text = ">";
1270c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    break;
1280c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor
1290c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  case CK_Comma:
1300c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    this->Text = ", ";
1310c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    break;
13201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor
13301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor  case CK_Colon:
134e8f5a1710a7738deff40e10efcd05b1bd6af184fDouglas Gregor    this->Text = ":";
13501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor    break;
13601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor
13701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor  case CK_SemiColon:
13801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor    this->Text = ";";
13901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor    break;
14001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor
14101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor  case CK_Equal:
14201dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor    this->Text = " = ";
14301dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor    break;
14401dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor
14501dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor  case CK_HorizontalSpace:
14601dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor    this->Text = " ";
14701dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor    break;
14801dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor
14901dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor  case CK_VerticalSpace:
15001dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor    this->Text = "\n";
15101dfea02d1da297e8b53db8eea3d3cc652acda8dDouglas Gregor    break;
1520c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  }
1530563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor}
1540563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor
1550563c2677cfc20c9450342ddc53aa96971671c71Douglas GregorCodeCompletionString::Chunk
156218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas GregorCodeCompletionString::Chunk::CreateText(const char *Text) {
1570563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor  return Chunk(CK_Text, Text);
158e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor}
159e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor
160e6e0361984b077d205e9a45d64257d41d2c788c8Douglas GregorCodeCompletionString::Chunk
161218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas GregorCodeCompletionString::Chunk::CreateOptional(CodeCompletionString *Optional) {
162e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor  Chunk Result;
163e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor  Result.Kind = CK_Optional;
164218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor  Result.Optional = Optional;
165e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor  return Result;
166e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor}
167e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor
168e6e0361984b077d205e9a45d64257d41d2c788c8Douglas GregorCodeCompletionString::Chunk
169218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas GregorCodeCompletionString::Chunk::CreatePlaceholder(const char *Placeholder) {
1700563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor  return Chunk(CK_Placeholder, Placeholder);
1710563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor}
1720563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor
1730563c2677cfc20c9450342ddc53aa96971671c71Douglas GregorCodeCompletionString::Chunk
174218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas GregorCodeCompletionString::Chunk::CreateInformative(const char *Informative) {
1750563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor  return Chunk(CK_Informative, Informative);
176e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor}
177e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor
1780c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas GregorCodeCompletionString::Chunk
179218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas GregorCodeCompletionString::Chunk::CreateResultType(const char *ResultType) {
180ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor  return Chunk(CK_ResultType, ResultType);
181ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor}
182ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor
183ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas GregorCodeCompletionString::Chunk
1840c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas GregorCodeCompletionString::Chunk::CreateCurrentParameter(
185218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor                                                const char *CurrentParameter) {
1860c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  return Chunk(CK_CurrentParameter, CurrentParameter);
1870c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor}
1880c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor
189218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas GregorCodeCompletionString::CodeCompletionString(const Chunk *Chunks,
190218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor                                           unsigned NumChunks,
191218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor                                           unsigned Priority,
1926164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen                                           CXAvailabilityKind Availability,
1936164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen                                           const char **Annotations,
194ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor                                           unsigned NumAnnotations,
195d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko                                           StringRef ParentName,
196d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko                                           const char *BriefComment)
197ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor  : NumChunks(NumChunks), NumAnnotations(NumAnnotations),
198526d24444c91404dc4165b141e5ec095125c1bc8Argyrios Kyrtzidis    Priority(Priority), Availability(Availability),
199d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko    ParentName(ParentName), BriefComment(BriefComment)
200218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor{
2016164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen  assert(NumChunks <= 0xffff);
2026164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen  assert(NumAnnotations <= 0xffff);
2036164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen
204218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor  Chunk *StoredChunks = reinterpret_cast<Chunk *>(this + 1);
205218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor  for (unsigned I = 0; I != NumChunks; ++I)
206218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor    StoredChunks[I] = Chunks[I];
2076164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen
2086164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen  const char **StoredAnnotations = reinterpret_cast<const char **>(StoredChunks + NumChunks);
2096164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen  for (unsigned I = 0; I != NumAnnotations; ++I)
2106164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen    StoredAnnotations[I] = Annotations[I];
2116164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen}
2126164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen
2136164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggenunsigned CodeCompletionString::getAnnotationCount() const {
2146164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen  return NumAnnotations;
215e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor}
216e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor
2176164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggenconst char *CodeCompletionString::getAnnotation(unsigned AnnotationNr) const {
2186164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen  if (AnnotationNr < NumAnnotations)
2196164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen    return reinterpret_cast<const char * const*>(end())[AnnotationNr];
2206164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen  else
2216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return nullptr;
2226164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen}
2236164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen
2246164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen
225e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregorstd::string CodeCompletionString::getAsString() const {
226e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor  std::string Result;
227e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor  llvm::raw_string_ostream OS(Result);
228e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor
229e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor  for (iterator C = begin(), CEnd = end(); C != CEnd; ++C) {
230e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor    switch (C->Kind) {
231e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor    case CK_Optional: OS << "{#" << C->Optional->getAsString() << "#}"; break;
2320563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor    case CK_Placeholder: OS << "<#" << C->Text << "#>"; break;
233ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor
234ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor    case CK_Informative:
235ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor    case CK_ResultType:
236ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor      OS << "[#" << C->Text << "#]";
237ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor      break;
238ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor
2390c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    case CK_CurrentParameter: OS << "<#" << C->Text << "#>"; break;
2400c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    default: OS << C->Text; break;
241e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor    }
242e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor  }
2436bdeb4024a7422bbd61fad403383af76b0581d45Dan Gohman  return OS.str();
244e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor}
245e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor
24654f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregorconst char *CodeCompletionString::getTypedText() const {
24754f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor  for (iterator C = begin(), CEnd = end(); C != CEnd; ++C)
24854f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor    if (C->Kind == CK_TypedText)
24954f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor      return C->Text;
2506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
2516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return nullptr;
25254f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor}
25354f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor
2543ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainarconst char *CodeCompletionAllocator::CopyString(const Twine &String) {
2553ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  SmallString<128> Data;
2563ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  StringRef Ref = String.toStringRef(Data);
257577cdfdb20840350e841a483df630237326126d5Douglas Gregor  // FIXME: It would be more efficient to teach Twine to tell us its size and
258577cdfdb20840350e841a483df630237326126d5Douglas Gregor  // then add a routine there to fill in an allocated char* with the contents
259577cdfdb20840350e841a483df630237326126d5Douglas Gregor  // of the string.
2603ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  char *Mem = (char *)Allocate(Ref.size() + 1, 1);
2613ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  std::copy(Ref.begin(), Ref.end(), Mem);
2623ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  Mem[Ref.size()] = 0;
2633ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  return Mem;
264577cdfdb20840350e841a483df630237326126d5Douglas Gregor}
265577cdfdb20840350e841a483df630237326126d5Douglas Gregor
26689cf425f1136f8d24a64ed94450e488b6794dfa4Dmitri GribenkoStringRef CodeCompletionTUInfo::getParentName(const DeclContext *DC) {
26789cf425f1136f8d24a64ed94450e488b6794dfa4Dmitri Gribenko  const NamedDecl *ND = dyn_cast<NamedDecl>(DC);
26828a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis  if (!ND)
26928a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis    return StringRef();
27028a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis
27128a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis  // Check whether we've already cached the parent name.
27228a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis  StringRef &CachedParentName = ParentNames[DC];
27328a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis  if (!CachedParentName.empty())
27428a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis    return CachedParentName;
27528a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis
27628a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis  // If we already processed this DeclContext and assigned empty to it, the
27728a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis  // data pointer will be non-null.
2786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (CachedParentName.data() != nullptr)
27928a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis    return StringRef();
28028a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis
28128a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis  // Find the interesting names.
28289cf425f1136f8d24a64ed94450e488b6794dfa4Dmitri Gribenko  SmallVector<const DeclContext *, 2> Contexts;
28328a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis  while (DC && !DC->isFunctionOrMethod()) {
28489cf425f1136f8d24a64ed94450e488b6794dfa4Dmitri Gribenko    if (const NamedDecl *ND = dyn_cast<NamedDecl>(DC)) {
28528a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis      if (ND->getIdentifier())
28628a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis        Contexts.push_back(DC);
28728a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis    }
28828a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis
28928a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis    DC = DC->getParent();
29028a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis  }
29128a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis
29228a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis  {
293cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko    SmallString<128> S;
29428a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis    llvm::raw_svector_ostream OS(S);
29528a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis    bool First = true;
29628a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis    for (unsigned I = Contexts.size(); I != 0; --I) {
29728a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis      if (First)
29828a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis        First = false;
29928a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis      else {
30028a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis        OS << "::";
30128a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis      }
30228a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis
30389cf425f1136f8d24a64ed94450e488b6794dfa4Dmitri Gribenko      const DeclContext *CurDC = Contexts[I-1];
30489cf425f1136f8d24a64ed94450e488b6794dfa4Dmitri Gribenko      if (const ObjCCategoryImplDecl *CatImpl = dyn_cast<ObjCCategoryImplDecl>(CurDC))
30528a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis        CurDC = CatImpl->getCategoryDecl();
30628a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis
30789cf425f1136f8d24a64ed94450e488b6794dfa4Dmitri Gribenko      if (const ObjCCategoryDecl *Cat = dyn_cast<ObjCCategoryDecl>(CurDC)) {
30889cf425f1136f8d24a64ed94450e488b6794dfa4Dmitri Gribenko        const ObjCInterfaceDecl *Interface = Cat->getClassInterface();
30928a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis        if (!Interface) {
31028a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis          // Assign an empty StringRef but with non-null data to distinguish
31128a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis          // between empty because we didn't process the DeclContext yet.
3124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          CachedParentName = StringRef((const char *)(uintptr_t)~0U, 0);
31328a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis          return StringRef();
31428a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis        }
31528a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis
31628a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis        OS << Interface->getName() << '(' << Cat->getName() << ')';
31728a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis      } else {
31828a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis        OS << cast<NamedDecl>(CurDC)->getName();
31928a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis      }
32028a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis    }
32128a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis
32228a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis    CachedParentName = AllocatorRef->CopyString(OS.str());
32328a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis  }
32428a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis
32528a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis  return CachedParentName;
32628a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis}
32728a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis
328218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas GregorCodeCompletionString *CodeCompletionBuilder::TakeString() {
32928a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis  void *Mem = getAllocator().Allocate(
3306164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen                  sizeof(CodeCompletionString) + sizeof(Chunk) * Chunks.size()
3316164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen                                    + sizeof(const char *) * Annotations.size(),
332218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor                                 llvm::alignOf<CodeCompletionString>());
333218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor  CodeCompletionString *Result
334218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor    = new (Mem) CodeCompletionString(Chunks.data(), Chunks.size(),
3356164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen                                     Priority, Availability,
336ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor                                     Annotations.data(), Annotations.size(),
337526d24444c91404dc4165b141e5ec095125c1bc8Argyrios Kyrtzidis                                     ParentName, BriefComment);
338218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor  Chunks.clear();
33954f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor  return Result;
34054f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor}
3410c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor
3421eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramervoid CodeCompletionBuilder::AddTypedTextChunk(const char *Text) {
3431eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer  Chunks.push_back(Chunk(CodeCompletionString::CK_TypedText, Text));
3441eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer}
3451eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer
3461eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramervoid CodeCompletionBuilder::AddTextChunk(const char *Text) {
3471eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer  Chunks.push_back(Chunk::CreateText(Text));
3481eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer}
3491eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer
3501eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramervoid CodeCompletionBuilder::AddOptionalChunk(CodeCompletionString *Optional) {
3511eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer  Chunks.push_back(Chunk::CreateOptional(Optional));
3521eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer}
3531eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer
3541eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramervoid CodeCompletionBuilder::AddPlaceholderChunk(const char *Placeholder) {
3551eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer  Chunks.push_back(Chunk::CreatePlaceholder(Placeholder));
3561eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer}
3571eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer
3581eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramervoid CodeCompletionBuilder::AddInformativeChunk(const char *Text) {
3591eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer  Chunks.push_back(Chunk::CreateInformative(Text));
3601eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer}
3611eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer
3621eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramervoid CodeCompletionBuilder::AddResultTypeChunk(const char *ResultType) {
3631eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer  Chunks.push_back(Chunk::CreateResultType(ResultType));
3641eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer}
3651eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer
3661eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramervoid
3671eb18afd931f626713c066ede0707ceb522fa061Benjamin KramerCodeCompletionBuilder::AddCurrentParameterChunk(const char *CurrentParameter) {
3681eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer  Chunks.push_back(Chunk::CreateCurrentParameter(CurrentParameter));
3691eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer}
3701eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer
3711eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramervoid CodeCompletionBuilder::AddChunk(CodeCompletionString::ChunkKind CK,
3721eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer                                     const char *Text) {
3731eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer  Chunks.push_back(Chunk(CK, Text));
3741eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer}
3751eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer
37689cf425f1136f8d24a64ed94450e488b6794dfa4Dmitri Gribenkovoid CodeCompletionBuilder::addParentContext(const DeclContext *DC) {
377ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor  if (DC->isTranslationUnit()) {
378ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor    return;
379ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor  }
380ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor
381ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor  if (DC->isFunctionOrMethod())
382ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor    return;
383ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor
38489cf425f1136f8d24a64ed94450e488b6794dfa4Dmitri Gribenko  const NamedDecl *ND = dyn_cast<NamedDecl>(DC);
385ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor  if (!ND)
386ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor    return;
387ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor
38828a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis  ParentName = getCodeCompletionTUInfo().getParentName(DC);
389ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor}
390ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor
391d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenkovoid CodeCompletionBuilder::addBriefComment(StringRef Comment) {
392d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko  BriefComment = Allocator.CopyString(Comment);
393d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko}
394d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko
395e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor//===----------------------------------------------------------------------===//
3960594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor// Code completion overload candidate implementation
3970594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor//===----------------------------------------------------------------------===//
3980594438e06f58ab3798416324780ab39ca9c8f54Douglas GregorFunctionDecl *
3990594438e06f58ab3798416324780ab39ca9c8f54Douglas GregorCodeCompleteConsumer::OverloadCandidate::getFunction() const {
4000594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor  if (getKind() == CK_Function)
4010594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor    return Function;
4020594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor  else if (getKind() == CK_FunctionTemplate)
4030594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor    return FunctionTemplate->getTemplatedDecl();
4040594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor  else
4056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return nullptr;
4060594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor}
4070594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor
4080594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregorconst FunctionType *
4090594438e06f58ab3798416324780ab39ca9c8f54Douglas GregorCodeCompleteConsumer::OverloadCandidate::getFunctionType() const {
4100594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor  switch (Kind) {
4110594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor  case CK_Function:
4120594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor    return Function->getType()->getAs<FunctionType>();
4130594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor
4140594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor  case CK_FunctionTemplate:
4150594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor    return FunctionTemplate->getTemplatedDecl()->getType()
4160594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor             ->getAs<FunctionType>();
4170594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor
4180594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor  case CK_FunctionType:
4190594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor    return Type;
4200594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor  }
4217530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie
4227530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie  llvm_unreachable("Invalid CandidateKind!");
4230594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor}
4240594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor
4250594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor//===----------------------------------------------------------------------===//
426e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor// Code completion consumer implementation
427e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor//===----------------------------------------------------------------------===//
428e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor
42986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas GregorCodeCompleteConsumer::~CodeCompleteConsumer() { }
430e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor
43181b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregorvoid
4323a2838d14251427089c39caec90c8abbc27f7a14Daniel DunbarPrintingCodeCompleteConsumer::ProcessCodeCompleteResults(Sema &SemaRef,
433e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor                                                 CodeCompletionContext Context,
4340a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall                                                 CodeCompletionResult *Results,
43581b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor                                                         unsigned NumResults) {
4361e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor  std::stable_sort(Results, Results + NumResults);
4371e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor
43881b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor  // Print the results.
43981b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor  for (unsigned I = 0; I != NumResults; ++I) {
440f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor    OS << "COMPLETION: ";
44181b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor    switch (Results[I].Kind) {
4420a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall    case CodeCompletionResult::RK_Declaration:
443b8989f27f116ff2400e92a52c067a69846119eb5Benjamin Kramer      OS << *Results[I].Declaration;
44481b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor      if (Results[I].Hidden)
44581b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor        OS << " (Hidden)";
44686d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor      if (CodeCompletionString *CCS
44787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            = Results[I].CreateCodeCompletionString(SemaRef, Context,
44887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                                    getAllocator(),
449d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko                                                    CCTUInfo,
450d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko                                                    includeBriefComments())) {
451e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor        OS << " : " << CCS->getAsString();
452d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko        if (const char *BriefComment = CCS->getBriefComment())
453d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko          OS << " : " << BriefComment;
454e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor      }
455e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor
45681b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor      OS << '\n';
45781b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor      break;
45881b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor
4590a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall    case CodeCompletionResult::RK_Keyword:
460ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor      OS << Results[I].Keyword << '\n';
46181b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor      break;
4623f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor
4630a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall    case CodeCompletionResult::RK_Macro: {
464ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor      OS << Results[I].Macro->getName();
4653f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor      if (CodeCompletionString *CCS
46687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            = Results[I].CreateCodeCompletionString(SemaRef, Context,
46787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                                    getAllocator(),
468d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko                                                    CCTUInfo,
469d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko                                                    includeBriefComments())) {
4703f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor        OS << " : " << CCS->getAsString();
4713f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor      }
4723f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor      OS << '\n';
4733f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor      break;
4743f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor    }
47554f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor
4760a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall    case CodeCompletionResult::RK_Pattern: {
477ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor      OS << "Pattern : "
47854f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor         << Results[I].Pattern->getAsString() << '\n';
47954f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor      break;
48054f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor    }
48181b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor    }
48281b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor  }
48381b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor}
4840594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor
4850e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// This function is used solely to preserve the former presentation of overloads
4860e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// by "clang -cc1 -code-completion-at", since CodeCompletionString::getAsString
4870e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// needs to be improved for printing the newer and more detailed overload
4880e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// chunks.
4890e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic std::string getOverloadAsString(const CodeCompletionString &CCS) {
4900e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  std::string Result;
4910e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  llvm::raw_string_ostream OS(Result);
4920e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
4930e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  for (auto &C : CCS) {
4940e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    switch (C.Kind) {
4950e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    case CodeCompletionString::CK_Informative:
4960e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    case CodeCompletionString::CK_ResultType:
4970e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      OS << "[#" << C.Text << "#]";
4980e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      break;
4990e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
5000e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    case CodeCompletionString::CK_CurrentParameter:
5010e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      OS << "<#" << C.Text << "#>";
5020e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      break;
5030e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
5040e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    default: OS << C.Text; break;
5050e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    }
5060e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  }
5070e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  return OS.str();
5080e2c34f92f00628d48968dfea096d36381f494cbStephen Hines}
5090e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
5100594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregorvoid
5113a2838d14251427089c39caec90c8abbc27f7a14Daniel DunbarPrintingCodeCompleteConsumer::ProcessOverloadCandidates(Sema &SemaRef,
5123a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar                                                        unsigned CurrentArg,
5130594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor                                              OverloadCandidate *Candidates,
5140594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor                                                     unsigned NumCandidates) {
5150594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor  for (unsigned I = 0; I != NumCandidates; ++I) {
51686d802e03a267af79663990c39865c67e0645238Douglas Gregor    if (CodeCompletionString *CCS
517218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor          = Candidates[I].CreateSignatureString(CurrentArg, SemaRef,
5180e2c34f92f00628d48968dfea096d36381f494cbStephen Hines                                                getAllocator(), CCTUInfo,
5190e2c34f92f00628d48968dfea096d36381f494cbStephen Hines                                                includeBriefComments())) {
5200e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      OS << "OVERLOAD: " << getOverloadAsString(*CCS) << "\n";
5210594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor    }
5220594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor  }
5230594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor}
5240c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor
5258e42f2782338666ec67eab2e709e18b92060eebaDouglas Gregor/// \brief Retrieve the effective availability of the given declaration.
52689cf425f1136f8d24a64ed94450e488b6794dfa4Dmitri Gribenkostatic AvailabilityResult getDeclAvailability(const Decl *D) {
5278e42f2782338666ec67eab2e709e18b92060eebaDouglas Gregor  AvailabilityResult AR = D->getAvailability();
5288e42f2782338666ec67eab2e709e18b92060eebaDouglas Gregor  if (isa<EnumConstantDecl>(D))
5298e42f2782338666ec67eab2e709e18b92060eebaDouglas Gregor    AR = std::max(AR, cast<Decl>(D->getDeclContext())->getAvailability());
5308e42f2782338666ec67eab2e709e18b92060eebaDouglas Gregor  return AR;
5318e42f2782338666ec67eab2e709e18b92060eebaDouglas Gregor}
5328e42f2782338666ec67eab2e709e18b92060eebaDouglas Gregor
533d12059673dcef32bc2b6bae5321654d33863afe6Erik Verbruggenvoid CodeCompletionResult::computeCursorKindAndAvailability(bool Accessible) {
53487c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor  switch (Kind) {
535ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor  case RK_Pattern:
536ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor    if (!Declaration) {
537ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor      // Do nothing: Patterns can come with cursor kinds!
538ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor      break;
539ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor    }
540ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor    // Fall through
541ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor
5428e42f2782338666ec67eab2e709e18b92060eebaDouglas Gregor  case RK_Declaration: {
54358ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor    // Set the availability based on attributes.
5448e42f2782338666ec67eab2e709e18b92060eebaDouglas Gregor    switch (getDeclAvailability(Declaration)) {
5450a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor    case AR_Available:
5460a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor    case AR_NotYetIntroduced:
5470a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor      Availability = CXAvailability_Available;
5480a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor      break;
5490a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor
5500a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor    case AR_Deprecated:
55158ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor      Availability = CXAvailability_Deprecated;
5520a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor      break;
55358ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor
5540a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor    case AR_Unavailable:
5550a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor      Availability = CXAvailability_NotAvailable;
5560a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor      break;
5570a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor    }
5580a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor
55989cf425f1136f8d24a64ed94450e488b6794dfa4Dmitri Gribenko    if (const FunctionDecl *Function = dyn_cast<FunctionDecl>(Declaration))
560e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor      if (Function->isDeleted())
56158ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor        Availability = CXAvailability_NotAvailable;
562e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor
563e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor    CursorKind = getCursorKindForDecl(Declaration);
564375bb1413c041055262c8a416f20d10474a5eda9Douglas Gregor    if (CursorKind == CXCursor_UnexposedDecl) {
565bd9482d859a74bf2c45ef8b8aedec61c0e1c8374Douglas Gregor      // FIXME: Forward declarations of Objective-C classes and protocols
566bd9482d859a74bf2c45ef8b8aedec61c0e1c8374Douglas Gregor      // are not directly exposed, but we want code completion to treat them
567bd9482d859a74bf2c45ef8b8aedec61c0e1c8374Douglas Gregor      // like a definition.
568375bb1413c041055262c8a416f20d10474a5eda9Douglas Gregor      if (isa<ObjCInterfaceDecl>(Declaration))
569375bb1413c041055262c8a416f20d10474a5eda9Douglas Gregor        CursorKind = CXCursor_ObjCInterfaceDecl;
570bd9482d859a74bf2c45ef8b8aedec61c0e1c8374Douglas Gregor      else if (isa<ObjCProtocolDecl>(Declaration))
571bd9482d859a74bf2c45ef8b8aedec61c0e1c8374Douglas Gregor        CursorKind = CXCursor_ObjCProtocolDecl;
572375bb1413c041055262c8a416f20d10474a5eda9Douglas Gregor      else
573375bb1413c041055262c8a416f20d10474a5eda9Douglas Gregor        CursorKind = CXCursor_NotImplemented;
574375bb1413c041055262c8a416f20d10474a5eda9Douglas Gregor    }
57587c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor    break;
5768e42f2782338666ec67eab2e709e18b92060eebaDouglas Gregor  }
57787c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor
5780a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall  case RK_Macro:
5790a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall  case RK_Keyword:
580e5f8372b5dccf5894f0263d018599c14d8f31273Benjamin Kramer    llvm_unreachable("Macro and keyword kinds are handled by the constructors");
5811abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor  }
582d12059673dcef32bc2b6bae5321654d33863afe6Erik Verbruggen
583d12059673dcef32bc2b6bae5321654d33863afe6Erik Verbruggen  if (!Accessible)
584d12059673dcef32bc2b6bae5321654d33863afe6Erik Verbruggen    Availability = CXAvailability_NotAccessible;
5851abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor}
5862b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor
587721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor/// \brief Retrieve the name that should be used to order a result.
588721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor///
589721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor/// If the name needs to be constructed as a string, that string will be
590721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor/// saved into Saved and the returned StringRef will refer to it.
5915f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerstatic StringRef getOrderedName(const CodeCompletionResult &R,
592721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor                                    std::string &Saved) {
593721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor  switch (R.Kind) {
594721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor    case CodeCompletionResult::RK_Keyword:
595721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor      return R.Keyword;
596721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor
597721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor    case CodeCompletionResult::RK_Pattern:
598721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor      return R.Pattern->getTypedText();
599721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor
600721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor    case CodeCompletionResult::RK_Macro:
601721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor      return R.Macro->getName();
602721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor
603721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor    case CodeCompletionResult::RK_Declaration:
604721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor      // Handle declarations below.
605721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor      break;
606721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor  }
607721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor
608721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor  DeclarationName Name = R.Declaration->getDeclName();
609721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor
610721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor  // If the name is a simple identifier (by far the common case), or a
611721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor  // zero-argument selector, just return a reference to that identifier.
612721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor  if (IdentifierInfo *Id = Name.getAsIdentifierInfo())
613721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor    return Id->getName();
614721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor  if (Name.isObjCZeroArgSelector())
615721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor    if (IdentifierInfo *Id
616721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor        = Name.getObjCSelector().getIdentifierInfoForSlot(0))
617721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor      return Id->getName();
618721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor
619721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor  Saved = Name.getAsString();
620721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor  return Saved;
621721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor}
622721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor
623721f359a350059a81945baa08f63b2e5feceb044Douglas Gregorbool clang::operator<(const CodeCompletionResult &X,
624721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor                      const CodeCompletionResult &Y) {
625721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor  std::string XSaved, YSaved;
6265f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  StringRef XStr = getOrderedName(X, XSaved);
6275f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  StringRef YStr = getOrderedName(Y, YSaved);
628721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor  int cmp = XStr.compare_lower(YStr);
629721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor  if (cmp)
630721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor    return cmp < 0;
631721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor
6321e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor  // If case-insensitive comparison fails, try case-sensitive comparison.
6331e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor  cmp = XStr.compare(YStr);
6341e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor  if (cmp)
6351e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor    return cmp < 0;
636721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor
637721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor  return false;
638721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor}
639