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"
1881b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor#include "clang/Lex/Preprocessor.h"
1955fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Sema/Scope.h"
2055fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Sema/Sema.h"
2181b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor#include "llvm/ADT/STLExtras.h"
2255fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "llvm/ADT/SmallString.h"
23577cdfdb20840350e841a483df630237326126d5Douglas Gregor#include "llvm/ADT/Twine.h"
2481b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor#include "llvm/Support/raw_ostream.h"
2581b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor#include <algorithm>
26e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor#include <cstring>
27e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor#include <functional>
2892eff466867fd6a82fb3e245f2091e96a3e9888eDouglas Gregor
2981b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregorusing namespace clang;
3081b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor
31e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor//===----------------------------------------------------------------------===//
326f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor// Code completion context implementation
336f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor//===----------------------------------------------------------------------===//
346f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor
356f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregorbool CodeCompletionContext::wantConstructorResults() const {
366f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor  switch (Kind) {
3752779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor  case CCC_Recovery:
386f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor  case CCC_Statement:
396f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor  case CCC_Expression:
406f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor  case CCC_ObjCMessageReceiver:
416f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor  case CCC_ParenthesizedExpression:
426f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor    return true;
436f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor
446f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor  case CCC_TopLevel:
456f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor  case CCC_ObjCInterface:
466f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor  case CCC_ObjCImplementation:
476f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor  case CCC_ObjCIvarList:
486f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor  case CCC_ClassStructUnion:
493da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor  case CCC_DotMemberAccess:
503da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor  case CCC_ArrowMemberAccess:
513da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor  case CCC_ObjCPropertyAccess:
526f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor  case CCC_EnumTag:
536f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor  case CCC_UnionTag:
546f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor  case CCC_ClassOrStructTag:
556f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor  case CCC_ObjCProtocolName:
566f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor  case CCC_Namespace:
576f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor  case CCC_Type:
586f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor  case CCC_Name:
596f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor  case CCC_PotentiallyQualifiedName:
606f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor  case CCC_MacroName:
616f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor  case CCC_MacroNameUse:
626f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor  case CCC_PreprocessorExpression:
636f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor  case CCC_PreprocessorDirective:
646f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor  case CCC_NaturalLanguage:
656f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor  case CCC_SelectorName:
666f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor  case CCC_TypeQualifiers:
6752779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor  case CCC_Other:
685c722c7020b33da57090422b854072258a50b3f0Douglas Gregor  case CCC_OtherWithMacros:
693da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor  case CCC_ObjCInstanceMessage:
703da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor  case CCC_ObjCClassMessage:
710f91c8ccb398be2bd40dc402309bd79737542396Douglas Gregor  case CCC_ObjCInterfaceName:
723da626b4f38eb0350de960d71271ca77af7a9cc8Douglas Gregor  case CCC_ObjCCategoryName:
736f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor    return false;
746f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor  }
757530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie
767530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie  llvm_unreachable("Invalid CodeCompletionContext::Kind!");
776f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor}
786f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor
796f942b2cabf32b96f9901b889d8e44a34e0e7c62Douglas Gregor//===----------------------------------------------------------------------===//
80e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor// Code completion string implementation
81e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor//===----------------------------------------------------------------------===//
82218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas GregorCodeCompletionString::Chunk::Chunk(ChunkKind Kind, const char *Text)
83ad5757f798b08f24942f093c4ac8b9fc2b527d39Daniel Dunbar  : Kind(Kind), Text("")
840563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor{
850c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  switch (Kind) {
860c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  case CK_TypedText:
870c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  case CK_Text:
880c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  case CK_Placeholder:
890c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  case CK_Informative:
90ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor  case CK_ResultType:
91218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor  case CK_CurrentParameter:
92218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor    this->Text = Text;
930c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    break;
940c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor
950c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  case CK_Optional:
969f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin    llvm_unreachable("Optional strings cannot be created from text");
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,
1936164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen                                           CXAvailabilityKind Availability,
1946164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen                                           const char **Annotations,
195ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor                                           unsigned NumAnnotations,
196d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko                                           StringRef ParentName,
197d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko                                           const char *BriefComment)
198ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor  : NumChunks(NumChunks), NumAnnotations(NumAnnotations),
199526d24444c91404dc4165b141e5ec095125c1bc8Argyrios Kyrtzidis    Priority(Priority), Availability(Availability),
200d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko    ParentName(ParentName), BriefComment(BriefComment)
201218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor{
2026164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen  assert(NumChunks <= 0xffff);
2036164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen  assert(NumAnnotations <= 0xffff);
2046164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen
205218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor  Chunk *StoredChunks = reinterpret_cast<Chunk *>(this + 1);
206218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor  for (unsigned I = 0; I != NumChunks; ++I)
207218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor    StoredChunks[I] = Chunks[I];
2086164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen
2096164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen  const char **StoredAnnotations = reinterpret_cast<const char **>(StoredChunks + NumChunks);
2106164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen  for (unsigned I = 0; I != NumAnnotations; ++I)
2116164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen    StoredAnnotations[I] = Annotations[I];
2126164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen}
2136164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen
2146164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggenunsigned CodeCompletionString::getAnnotationCount() const {
2156164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen  return NumAnnotations;
216e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor}
217e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor
2186164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggenconst char *CodeCompletionString::getAnnotation(unsigned AnnotationNr) const {
2196164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen  if (AnnotationNr < NumAnnotations)
2206164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen    return reinterpret_cast<const char * const*>(end())[AnnotationNr];
2216164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen  else
2226164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen    return 0;
2236164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen}
2246164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen
2256164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen
226e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregorstd::string CodeCompletionString::getAsString() const {
227e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor  std::string Result;
228e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor  llvm::raw_string_ostream OS(Result);
229e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor
230e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor  for (iterator C = begin(), CEnd = end(); C != CEnd; ++C) {
231e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor    switch (C->Kind) {
232e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor    case CK_Optional: OS << "{#" << C->Optional->getAsString() << "#}"; break;
2330563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor    case CK_Placeholder: OS << "<#" << C->Text << "#>"; break;
234ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor
235ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor    case CK_Informative:
236ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor    case CK_ResultType:
237ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor      OS << "[#" << C->Text << "#]";
238ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor      break;
239ff5ce6eefc7c253ef6edf4d4bfc996fdd82d09aaDouglas Gregor
2400c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    case CK_CurrentParameter: OS << "<#" << C->Text << "#>"; break;
2410c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    default: OS << C->Text; break;
242e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor    }
243e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor  }
2446bdeb4024a7422bbd61fad403383af76b0581d45Dan Gohman  return OS.str();
245e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor}
246e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor
24754f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregorconst char *CodeCompletionString::getTypedText() const {
24854f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor  for (iterator C = begin(), CEnd = end(); C != CEnd; ++C)
24954f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor    if (C->Kind == CK_TypedText)
25054f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor      return C->Text;
25154f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor
25254f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor  return 0;
25354f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor}
25454f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor
2555f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerconst char *CodeCompletionAllocator::CopyString(StringRef String) {
256dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor  char *Mem = (char *)Allocate(String.size() + 1, 1);
257dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor  std::copy(String.begin(), String.end(), Mem);
258dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor  Mem[String.size()] = 0;
259dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor  return Mem;
260dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor}
261dae687575010c9c49a4b552f5eef82cd6279d9acDouglas Gregor
2625f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerconst char *CodeCompletionAllocator::CopyString(Twine String) {
263577cdfdb20840350e841a483df630237326126d5Douglas Gregor  // FIXME: It would be more efficient to teach Twine to tell us its size and
264577cdfdb20840350e841a483df630237326126d5Douglas Gregor  // then add a routine there to fill in an allocated char* with the contents
265577cdfdb20840350e841a483df630237326126d5Douglas Gregor  // of the string.
266f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith  SmallString<128> Data;
267577cdfdb20840350e841a483df630237326126d5Douglas Gregor  return CopyString(String.toStringRef(Data));
268577cdfdb20840350e841a483df630237326126d5Douglas Gregor}
269577cdfdb20840350e841a483df630237326126d5Douglas Gregor
27089cf425f1136f8d24a64ed94450e488b6794dfa4Dmitri GribenkoStringRef CodeCompletionTUInfo::getParentName(const DeclContext *DC) {
27189cf425f1136f8d24a64ed94450e488b6794dfa4Dmitri Gribenko  const NamedDecl *ND = dyn_cast<NamedDecl>(DC);
27228a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis  if (!ND)
27328a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis    return StringRef();
27428a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis
27528a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis  // Check whether we've already cached the parent name.
27628a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis  StringRef &CachedParentName = ParentNames[DC];
27728a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis  if (!CachedParentName.empty())
27828a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis    return CachedParentName;
27928a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis
28028a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis  // If we already processed this DeclContext and assigned empty to it, the
28128a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis  // data pointer will be non-null.
28228a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis  if (CachedParentName.data() != 0)
28328a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis    return StringRef();
28428a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis
28528a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis  // Find the interesting names.
28689cf425f1136f8d24a64ed94450e488b6794dfa4Dmitri Gribenko  SmallVector<const DeclContext *, 2> Contexts;
28728a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis  while (DC && !DC->isFunctionOrMethod()) {
28889cf425f1136f8d24a64ed94450e488b6794dfa4Dmitri Gribenko    if (const NamedDecl *ND = dyn_cast<NamedDecl>(DC)) {
28928a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis      if (ND->getIdentifier())
29028a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis        Contexts.push_back(DC);
29128a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis    }
29228a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis
29328a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis    DC = DC->getParent();
29428a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis  }
29528a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis
29628a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis  {
297cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko    SmallString<128> S;
29828a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis    llvm::raw_svector_ostream OS(S);
29928a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis    bool First = true;
30028a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis    for (unsigned I = Contexts.size(); I != 0; --I) {
30128a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis      if (First)
30228a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis        First = false;
30328a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis      else {
30428a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis        OS << "::";
30528a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis      }
30628a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis
30789cf425f1136f8d24a64ed94450e488b6794dfa4Dmitri Gribenko      const DeclContext *CurDC = Contexts[I-1];
30889cf425f1136f8d24a64ed94450e488b6794dfa4Dmitri Gribenko      if (const ObjCCategoryImplDecl *CatImpl = dyn_cast<ObjCCategoryImplDecl>(CurDC))
30928a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis        CurDC = CatImpl->getCategoryDecl();
31028a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis
31189cf425f1136f8d24a64ed94450e488b6794dfa4Dmitri Gribenko      if (const ObjCCategoryDecl *Cat = dyn_cast<ObjCCategoryDecl>(CurDC)) {
31289cf425f1136f8d24a64ed94450e488b6794dfa4Dmitri Gribenko        const ObjCInterfaceDecl *Interface = Cat->getClassInterface();
31328a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis        if (!Interface) {
31428a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis          // Assign an empty StringRef but with non-null data to distinguish
31528a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis          // between empty because we didn't process the DeclContext yet.
31628a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis          CachedParentName = StringRef((const char *)~0U, 0);
31728a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis          return StringRef();
31828a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis        }
31928a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis
32028a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis        OS << Interface->getName() << '(' << Cat->getName() << ')';
32128a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis      } else {
32228a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis        OS << cast<NamedDecl>(CurDC)->getName();
32328a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis      }
32428a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis    }
32528a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis
32628a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis    CachedParentName = AllocatorRef->CopyString(OS.str());
32728a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis  }
32828a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis
32928a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis  return CachedParentName;
33028a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis}
33128a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis
332218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas GregorCodeCompletionString *CodeCompletionBuilder::TakeString() {
33328a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis  void *Mem = getAllocator().Allocate(
3346164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen                  sizeof(CodeCompletionString) + sizeof(Chunk) * Chunks.size()
3356164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen                                    + sizeof(const char *) * Annotations.size(),
336218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor                                 llvm::alignOf<CodeCompletionString>());
337218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor  CodeCompletionString *Result
338218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor    = new (Mem) CodeCompletionString(Chunks.data(), Chunks.size(),
3396164ea1d75385b6fc3c19e5ab9bb686298436a5aErik Verbruggen                                     Priority, Availability,
340ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor                                     Annotations.data(), Annotations.size(),
341526d24444c91404dc4165b141e5ec095125c1bc8Argyrios Kyrtzidis                                     ParentName, BriefComment);
342218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor  Chunks.clear();
34354f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor  return Result;
34454f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor}
3450c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor
3461eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramervoid CodeCompletionBuilder::AddTypedTextChunk(const char *Text) {
3471eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer  Chunks.push_back(Chunk(CodeCompletionString::CK_TypedText, Text));
3481eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer}
3491eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer
3501eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramervoid CodeCompletionBuilder::AddTextChunk(const char *Text) {
3511eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer  Chunks.push_back(Chunk::CreateText(Text));
3521eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer}
3531eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer
3541eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramervoid CodeCompletionBuilder::AddOptionalChunk(CodeCompletionString *Optional) {
3551eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer  Chunks.push_back(Chunk::CreateOptional(Optional));
3561eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer}
3571eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer
3581eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramervoid CodeCompletionBuilder::AddPlaceholderChunk(const char *Placeholder) {
3591eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer  Chunks.push_back(Chunk::CreatePlaceholder(Placeholder));
3601eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer}
3611eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer
3621eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramervoid CodeCompletionBuilder::AddInformativeChunk(const char *Text) {
3631eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer  Chunks.push_back(Chunk::CreateInformative(Text));
3641eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer}
3651eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer
3661eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramervoid CodeCompletionBuilder::AddResultTypeChunk(const char *ResultType) {
3671eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer  Chunks.push_back(Chunk::CreateResultType(ResultType));
3681eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer}
3691eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer
3701eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramervoid
3711eb18afd931f626713c066ede0707ceb522fa061Benjamin KramerCodeCompletionBuilder::AddCurrentParameterChunk(const char *CurrentParameter) {
3721eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer  Chunks.push_back(Chunk::CreateCurrentParameter(CurrentParameter));
3731eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer}
3741eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer
3751eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramervoid CodeCompletionBuilder::AddChunk(CodeCompletionString::ChunkKind CK,
3761eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer                                     const char *Text) {
3771eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer  Chunks.push_back(Chunk(CK, Text));
3781eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer}
3791eb18afd931f626713c066ede0707ceb522fa061Benjamin Kramer
38089cf425f1136f8d24a64ed94450e488b6794dfa4Dmitri Gribenkovoid CodeCompletionBuilder::addParentContext(const DeclContext *DC) {
381ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor  if (DC->isTranslationUnit()) {
382ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor    return;
383ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor  }
384ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor
385ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor  if (DC->isFunctionOrMethod())
386ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor    return;
387ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor
38889cf425f1136f8d24a64ed94450e488b6794dfa4Dmitri Gribenko  const NamedDecl *ND = dyn_cast<NamedDecl>(DC);
389ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor  if (!ND)
390ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor    return;
391ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor
39228a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis  ParentName = getCodeCompletionTUInfo().getParentName(DC);
393ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor}
394ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor
395d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenkovoid CodeCompletionBuilder::addBriefComment(StringRef Comment) {
396d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko  BriefComment = Allocator.CopyString(Comment);
397d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko}
398d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko
399e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor//===----------------------------------------------------------------------===//
4000594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor// Code completion overload candidate implementation
4010594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor//===----------------------------------------------------------------------===//
4020594438e06f58ab3798416324780ab39ca9c8f54Douglas GregorFunctionDecl *
4030594438e06f58ab3798416324780ab39ca9c8f54Douglas GregorCodeCompleteConsumer::OverloadCandidate::getFunction() const {
4040594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor  if (getKind() == CK_Function)
4050594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor    return Function;
4060594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor  else if (getKind() == CK_FunctionTemplate)
4070594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor    return FunctionTemplate->getTemplatedDecl();
4080594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor  else
4090594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor    return 0;
4100594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor}
4110594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor
4120594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregorconst FunctionType *
4130594438e06f58ab3798416324780ab39ca9c8f54Douglas GregorCodeCompleteConsumer::OverloadCandidate::getFunctionType() const {
4140594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor  switch (Kind) {
4150594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor  case CK_Function:
4160594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor    return Function->getType()->getAs<FunctionType>();
4170594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor
4180594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor  case CK_FunctionTemplate:
4190594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor    return FunctionTemplate->getTemplatedDecl()->getType()
4200594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor             ->getAs<FunctionType>();
4210594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor
4220594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor  case CK_FunctionType:
4230594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor    return Type;
4240594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor  }
4257530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie
4267530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie  llvm_unreachable("Invalid CandidateKind!");
4270594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor}
4280594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor
4290594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor//===----------------------------------------------------------------------===//
430e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor// Code completion consumer implementation
431e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor//===----------------------------------------------------------------------===//
432e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor
43386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas GregorCodeCompleteConsumer::~CodeCompleteConsumer() { }
434e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor
43581b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregorvoid
4363a2838d14251427089c39caec90c8abbc27f7a14Daniel DunbarPrintingCodeCompleteConsumer::ProcessCodeCompleteResults(Sema &SemaRef,
437e6b1bb6e7fe906d164637ca33503b8fafdbc99e5Douglas Gregor                                                 CodeCompletionContext Context,
4380a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall                                                 CodeCompletionResult *Results,
43981b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor                                                         unsigned NumResults) {
4401e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor  std::stable_sort(Results, Results + NumResults);
4411e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor
44281b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor  // Print the results.
44381b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor  for (unsigned I = 0; I != NumResults; ++I) {
444f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor    OS << "COMPLETION: ";
44581b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor    switch (Results[I].Kind) {
4460a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall    case CodeCompletionResult::RK_Declaration:
447b8989f27f116ff2400e92a52c067a69846119eb5Benjamin Kramer      OS << *Results[I].Declaration;
44881b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor      if (Results[I].Hidden)
44981b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor        OS << " (Hidden)";
45086d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor      if (CodeCompletionString *CCS
45128a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis            = Results[I].CreateCodeCompletionString(SemaRef, getAllocator(),
452d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko                                                    CCTUInfo,
453d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko                                                    includeBriefComments())) {
454e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor        OS << " : " << CCS->getAsString();
455d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko        if (const char *BriefComment = CCS->getBriefComment())
456d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko          OS << " : " << BriefComment;
457e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor      }
458e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor
45981b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor      OS << '\n';
46081b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor      break;
46181b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor
4620a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall    case CodeCompletionResult::RK_Keyword:
463ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor      OS << Results[I].Keyword << '\n';
46481b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor      break;
4653f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor
4660a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall    case CodeCompletionResult::RK_Macro: {
467ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor      OS << Results[I].Macro->getName();
4683f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor      if (CodeCompletionString *CCS
46928a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis            = Results[I].CreateCodeCompletionString(SemaRef, getAllocator(),
470d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko                                                    CCTUInfo,
471d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko                                                    includeBriefComments())) {
4723f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor        OS << " : " << CCS->getAsString();
4733f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor      }
4743f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor      OS << '\n';
4753f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor      break;
4763f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor    }
47754f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor
4780a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall    case CodeCompletionResult::RK_Pattern: {
479ab0b4f1d66de54b4c3102b96d56964510361ba7dDouglas Gregor      OS << "Pattern : "
48054f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor         << Results[I].Pattern->getAsString() << '\n';
48154f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor      break;
48254f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor    }
48381b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor    }
48481b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor  }
48581b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor}
4860594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor
4870594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregorvoid
4883a2838d14251427089c39caec90c8abbc27f7a14Daniel DunbarPrintingCodeCompleteConsumer::ProcessOverloadCandidates(Sema &SemaRef,
4893a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar                                                        unsigned CurrentArg,
4900594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor                                              OverloadCandidate *Candidates,
4910594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor                                                     unsigned NumCandidates) {
4920594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor  for (unsigned I = 0; I != NumCandidates; ++I) {
49386d802e03a267af79663990c39865c67e0645238Douglas Gregor    if (CodeCompletionString *CCS
494218937c13ef5b0625a70aad41ca7a92da9278bd2Douglas Gregor          = Candidates[I].CreateSignatureString(CurrentArg, SemaRef,
49528a83f57003469fb615ad27dd34bcf5b0a10da8cArgyrios Kyrtzidis                                                getAllocator(), CCTUInfo)) {
496f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor      OS << "OVERLOAD: " << CCS->getAsString() << "\n";
4970594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor    }
4980594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor  }
4990594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor}
5000c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor
5018e42f2782338666ec67eab2e709e18b92060eebaDouglas Gregor/// \brief Retrieve the effective availability of the given declaration.
50289cf425f1136f8d24a64ed94450e488b6794dfa4Dmitri Gribenkostatic AvailabilityResult getDeclAvailability(const Decl *D) {
5038e42f2782338666ec67eab2e709e18b92060eebaDouglas Gregor  AvailabilityResult AR = D->getAvailability();
5048e42f2782338666ec67eab2e709e18b92060eebaDouglas Gregor  if (isa<EnumConstantDecl>(D))
5058e42f2782338666ec67eab2e709e18b92060eebaDouglas Gregor    AR = std::max(AR, cast<Decl>(D->getDeclContext())->getAvailability());
5068e42f2782338666ec67eab2e709e18b92060eebaDouglas Gregor  return AR;
5078e42f2782338666ec67eab2e709e18b92060eebaDouglas Gregor}
5088e42f2782338666ec67eab2e709e18b92060eebaDouglas Gregor
509d12059673dcef32bc2b6bae5321654d33863afe6Erik Verbruggenvoid CodeCompletionResult::computeCursorKindAndAvailability(bool Accessible) {
51087c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor  switch (Kind) {
511ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor  case RK_Pattern:
512ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor    if (!Declaration) {
513ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor      // Do nothing: Patterns can come with cursor kinds!
514ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor      break;
515ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor    }
516ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor    // Fall through
517ba1030698dbc276db86b11c5329a1edee8a1805eDouglas Gregor
5188e42f2782338666ec67eab2e709e18b92060eebaDouglas Gregor  case RK_Declaration: {
51958ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor    // Set the availability based on attributes.
5208e42f2782338666ec67eab2e709e18b92060eebaDouglas Gregor    switch (getDeclAvailability(Declaration)) {
5210a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor    case AR_Available:
5220a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor    case AR_NotYetIntroduced:
5230a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor      Availability = CXAvailability_Available;
5240a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor      break;
5250a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor
5260a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor    case AR_Deprecated:
52758ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor      Availability = CXAvailability_Deprecated;
5280a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor      break;
52958ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor
5300a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor    case AR_Unavailable:
5310a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor      Availability = CXAvailability_NotAvailable;
5320a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor      break;
5330a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor    }
5340a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor
53589cf425f1136f8d24a64ed94450e488b6794dfa4Dmitri Gribenko    if (const FunctionDecl *Function = dyn_cast<FunctionDecl>(Declaration))
536e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor      if (Function->isDeleted())
53758ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor        Availability = CXAvailability_NotAvailable;
538e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor
539e8d7bebc0dd037516dd695ee1ac2eb0923753b46Douglas Gregor    CursorKind = getCursorKindForDecl(Declaration);
540375bb1413c041055262c8a416f20d10474a5eda9Douglas Gregor    if (CursorKind == CXCursor_UnexposedDecl) {
541bd9482d859a74bf2c45ef8b8aedec61c0e1c8374Douglas Gregor      // FIXME: Forward declarations of Objective-C classes and protocols
542bd9482d859a74bf2c45ef8b8aedec61c0e1c8374Douglas Gregor      // are not directly exposed, but we want code completion to treat them
543bd9482d859a74bf2c45ef8b8aedec61c0e1c8374Douglas Gregor      // like a definition.
544375bb1413c041055262c8a416f20d10474a5eda9Douglas Gregor      if (isa<ObjCInterfaceDecl>(Declaration))
545375bb1413c041055262c8a416f20d10474a5eda9Douglas Gregor        CursorKind = CXCursor_ObjCInterfaceDecl;
546bd9482d859a74bf2c45ef8b8aedec61c0e1c8374Douglas Gregor      else if (isa<ObjCProtocolDecl>(Declaration))
547bd9482d859a74bf2c45ef8b8aedec61c0e1c8374Douglas Gregor        CursorKind = CXCursor_ObjCProtocolDecl;
548375bb1413c041055262c8a416f20d10474a5eda9Douglas Gregor      else
549375bb1413c041055262c8a416f20d10474a5eda9Douglas Gregor        CursorKind = CXCursor_NotImplemented;
550375bb1413c041055262c8a416f20d10474a5eda9Douglas Gregor    }
55187c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor    break;
5528e42f2782338666ec67eab2e709e18b92060eebaDouglas Gregor  }
55387c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor
5540a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall  case RK_Macro:
5550a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall  case RK_Keyword:
556e5f8372b5dccf5894f0263d018599c14d8f31273Benjamin Kramer    llvm_unreachable("Macro and keyword kinds are handled by the constructors");
5571abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor  }
558d12059673dcef32bc2b6bae5321654d33863afe6Erik Verbruggen
559d12059673dcef32bc2b6bae5321654d33863afe6Erik Verbruggen  if (!Accessible)
560d12059673dcef32bc2b6bae5321654d33863afe6Erik Verbruggen    Availability = CXAvailability_NotAccessible;
5611abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor}
5622b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor
563721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor/// \brief Retrieve the name that should be used to order a result.
564721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor///
565721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor/// If the name needs to be constructed as a string, that string will be
566721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor/// saved into Saved and the returned StringRef will refer to it.
5675f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerstatic StringRef getOrderedName(const CodeCompletionResult &R,
568721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor                                    std::string &Saved) {
569721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor  switch (R.Kind) {
570721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor    case CodeCompletionResult::RK_Keyword:
571721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor      return R.Keyword;
572721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor
573721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor    case CodeCompletionResult::RK_Pattern:
574721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor      return R.Pattern->getTypedText();
575721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor
576721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor    case CodeCompletionResult::RK_Macro:
577721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor      return R.Macro->getName();
578721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor
579721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor    case CodeCompletionResult::RK_Declaration:
580721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor      // Handle declarations below.
581721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor      break;
582721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor  }
583721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor
584721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor  DeclarationName Name = R.Declaration->getDeclName();
585721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor
586721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor  // If the name is a simple identifier (by far the common case), or a
587721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor  // zero-argument selector, just return a reference to that identifier.
588721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor  if (IdentifierInfo *Id = Name.getAsIdentifierInfo())
589721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor    return Id->getName();
590721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor  if (Name.isObjCZeroArgSelector())
591721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor    if (IdentifierInfo *Id
592721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor        = Name.getObjCSelector().getIdentifierInfoForSlot(0))
593721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor      return Id->getName();
594721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor
595721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor  Saved = Name.getAsString();
596721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor  return Saved;
597721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor}
598721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor
599721f359a350059a81945baa08f63b2e5feceb044Douglas Gregorbool clang::operator<(const CodeCompletionResult &X,
600721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor                      const CodeCompletionResult &Y) {
601721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor  std::string XSaved, YSaved;
6025f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  StringRef XStr = getOrderedName(X, XSaved);
6035f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  StringRef YStr = getOrderedName(Y, YSaved);
604721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor  int cmp = XStr.compare_lower(YStr);
605721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor  if (cmp)
606721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor    return cmp < 0;
607721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor
6081e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor  // If case-insensitive comparison fails, try case-sensitive comparison.
6091e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor  cmp = XStr.compare(YStr);
6101e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor  if (cmp)
6111e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor    return cmp < 0;
612721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor
613721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor  return false;
614721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor}
615