CodeCompleteConsumer.cpp revision 87c08a5d6b9e1e44ae6f554df40139d3a6f60b33
1ec6ad593611ccd69f797e3add4d23a5f31aa84d6sewardj//===--- CodeCompleteConsumer.cpp - Code Completion Interface ---*- C++ -*-===//
2ec6ad593611ccd69f797e3add4d23a5f31aa84d6sewardj//
3752f90673ebbb6b2f55fc5e46606dea371313713sewardj//                     The LLVM Compiler Infrastructure
4ec6ad593611ccd69f797e3add4d23a5f31aa84d6sewardj//
5ec6ad593611ccd69f797e3add4d23a5f31aa84d6sewardj// This file is distributed under the University of Illinois Open Source
6f8ed9d874a7b8651654591c68c6d431c758d787csewardj// License. See LICENSE.TXT for details.
7752f90673ebbb6b2f55fc5e46606dea371313713sewardj//
8752f90673ebbb6b2f55fc5e46606dea371313713sewardj//===----------------------------------------------------------------------===//
9f8ed9d874a7b8651654591c68c6d431c758d787csewardj//
10752f90673ebbb6b2f55fc5e46606dea371313713sewardj//  This file implements the CodeCompleteConsumer class.
11752f90673ebbb6b2f55fc5e46606dea371313713sewardj//
127bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj//===----------------------------------------------------------------------===//
13752f90673ebbb6b2f55fc5e46606dea371313713sewardj#include "clang/Sema/CodeCompleteConsumer.h"
14752f90673ebbb6b2f55fc5e46606dea371313713sewardj#include "clang/Sema/Sema.h"
15752f90673ebbb6b2f55fc5e46606dea371313713sewardj#include "clang/AST/DeclCXX.h"
16752f90673ebbb6b2f55fc5e46606dea371313713sewardj#include "clang/Parse/Scope.h"
177bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj#include "clang/Lex/Preprocessor.h"
18752f90673ebbb6b2f55fc5e46606dea371313713sewardj#include "clang-c/Index.h"
19752f90673ebbb6b2f55fc5e46606dea371313713sewardj#include "llvm/ADT/STLExtras.h"
20752f90673ebbb6b2f55fc5e46606dea371313713sewardj#include "llvm/Support/raw_ostream.h"
21752f90673ebbb6b2f55fc5e46606dea371313713sewardj#include <algorithm>
22752f90673ebbb6b2f55fc5e46606dea371313713sewardj#include <cstring>
23752f90673ebbb6b2f55fc5e46606dea371313713sewardj#include <functional>
24752f90673ebbb6b2f55fc5e46606dea371313713sewardj
25752f90673ebbb6b2f55fc5e46606dea371313713sewardjusing namespace clang;
267bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardjusing llvm::StringRef;
277bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj
28752f90673ebbb6b2f55fc5e46606dea371313713sewardj//===----------------------------------------------------------------------===//
29f8ed9d874a7b8651654591c68c6d431c758d787csewardj// Code completion string implementation
30f8ed9d874a7b8651654591c68c6d431c758d787csewardj//===----------------------------------------------------------------------===//
31f8ed9d874a7b8651654591c68c6d431c758d787csewardjCodeCompletionString::Chunk::Chunk(ChunkKind Kind, llvm::StringRef Text)
32f8ed9d874a7b8651654591c68c6d431c758d787csewardj  : Kind(Kind), Text("")
33f8ed9d874a7b8651654591c68c6d431c758d787csewardj{
34f8ed9d874a7b8651654591c68c6d431c758d787csewardj  switch (Kind) {
35f8ed9d874a7b8651654591c68c6d431c758d787csewardj  case CK_TypedText:
36887a11a609f3e61d2ae8fe4e67f176207715da7esewardj  case CK_Text:
37887a11a609f3e61d2ae8fe4e67f176207715da7esewardj  case CK_Placeholder:
38ac9af021b93dfe6f35c01d9c6fd15a3d67685843sewardj  case CK_Informative:
39887a11a609f3e61d2ae8fe4e67f176207715da7esewardj  case CK_ResultType:
40ec6ad593611ccd69f797e3add4d23a5f31aa84d6sewardj  case CK_CurrentParameter: {
4157c10c89904f7fdc4244fcbf704625e7169aafe6sewardj    char *New = new char [Text.size() + 1];
42ec6ad593611ccd69f797e3add4d23a5f31aa84d6sewardj    std::memcpy(New, Text.data(), Text.size());
4357c10c89904f7fdc4244fcbf704625e7169aafe6sewardj    New[Text.size()] = '\0';
4457c10c89904f7fdc4244fcbf704625e7169aafe6sewardj    this->Text = New;
4557c10c89904f7fdc4244fcbf704625e7169aafe6sewardj    break;
4657c10c89904f7fdc4244fcbf704625e7169aafe6sewardj  }
4757c10c89904f7fdc4244fcbf704625e7169aafe6sewardj
4857c10c89904f7fdc4244fcbf704625e7169aafe6sewardj  case CK_Optional:
4957c10c89904f7fdc4244fcbf704625e7169aafe6sewardj    llvm_unreachable("Optional strings cannot be created from text");
5057c10c89904f7fdc4244fcbf704625e7169aafe6sewardj    break;
5157c10c89904f7fdc4244fcbf704625e7169aafe6sewardj
5257c10c89904f7fdc4244fcbf704625e7169aafe6sewardj  case CK_LeftParen:
53dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj    this->Text = "(";
54dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj    break;
55dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj
56dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj  case CK_RightParen:
5757c10c89904f7fdc4244fcbf704625e7169aafe6sewardj    this->Text = ")";
58dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj    break;
5957c10c89904f7fdc4244fcbf704625e7169aafe6sewardj
60dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj  case CK_LeftBracket:
6157c10c89904f7fdc4244fcbf704625e7169aafe6sewardj    this->Text = "[";
62dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj    break;
63dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj
64dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj  case CK_RightBracket:
65dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj    this->Text = "]";
6657c10c89904f7fdc4244fcbf704625e7169aafe6sewardj    break;
6757c10c89904f7fdc4244fcbf704625e7169aafe6sewardj
6857c10c89904f7fdc4244fcbf704625e7169aafe6sewardj  case CK_LeftBrace:
6957c10c89904f7fdc4244fcbf704625e7169aafe6sewardj    this->Text = "{";
7057c10c89904f7fdc4244fcbf704625e7169aafe6sewardj    break;
7157c10c89904f7fdc4244fcbf704625e7169aafe6sewardj
7257c10c89904f7fdc4244fcbf704625e7169aafe6sewardj  case CK_RightBrace:
7357c10c89904f7fdc4244fcbf704625e7169aafe6sewardj    this->Text = "}";
7457c10c89904f7fdc4244fcbf704625e7169aafe6sewardj    break;
7557c10c89904f7fdc4244fcbf704625e7169aafe6sewardj
7657c10c89904f7fdc4244fcbf704625e7169aafe6sewardj  case CK_LeftAngle:
7757c10c89904f7fdc4244fcbf704625e7169aafe6sewardj    this->Text = "<";
7857c10c89904f7fdc4244fcbf704625e7169aafe6sewardj    break;
7957c10c89904f7fdc4244fcbf704625e7169aafe6sewardj
8057c10c89904f7fdc4244fcbf704625e7169aafe6sewardj  case CK_RightAngle:
8157c10c89904f7fdc4244fcbf704625e7169aafe6sewardj    this->Text = ">";
8257c10c89904f7fdc4244fcbf704625e7169aafe6sewardj    break;
8357c10c89904f7fdc4244fcbf704625e7169aafe6sewardj
8457c10c89904f7fdc4244fcbf704625e7169aafe6sewardj  case CK_Comma:
8557c10c89904f7fdc4244fcbf704625e7169aafe6sewardj    this->Text = ", ";
8657c10c89904f7fdc4244fcbf704625e7169aafe6sewardj    break;
8757c10c89904f7fdc4244fcbf704625e7169aafe6sewardj
8857c10c89904f7fdc4244fcbf704625e7169aafe6sewardj  case CK_Colon:
8957c10c89904f7fdc4244fcbf704625e7169aafe6sewardj    this->Text = ":";
9057c10c89904f7fdc4244fcbf704625e7169aafe6sewardj    break;
9157c10c89904f7fdc4244fcbf704625e7169aafe6sewardj
9257c10c89904f7fdc4244fcbf704625e7169aafe6sewardj  case CK_SemiColon:
93dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj    this->Text = ";";
94dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj    break;
95dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj
96dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj  case CK_Equal:
97dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj    this->Text = " = ";
9857c10c89904f7fdc4244fcbf704625e7169aafe6sewardj    break;
9957c10c89904f7fdc4244fcbf704625e7169aafe6sewardj
10057c10c89904f7fdc4244fcbf704625e7169aafe6sewardj  case CK_HorizontalSpace:
10157c10c89904f7fdc4244fcbf704625e7169aafe6sewardj    this->Text = " ";
10257c10c89904f7fdc4244fcbf704625e7169aafe6sewardj    break;
10357c10c89904f7fdc4244fcbf704625e7169aafe6sewardj
10457c10c89904f7fdc4244fcbf704625e7169aafe6sewardj  case CK_VerticalSpace:
10557c10c89904f7fdc4244fcbf704625e7169aafe6sewardj    this->Text = "\n";
10657c10c89904f7fdc4244fcbf704625e7169aafe6sewardj    break;
1072f10aa6f4e9ea78030c46cce9b073b19c63c0f60sewardj  }
10857c10c89904f7fdc4244fcbf704625e7169aafe6sewardj}
10957c10c89904f7fdc4244fcbf704625e7169aafe6sewardj
11057c10c89904f7fdc4244fcbf704625e7169aafe6sewardjCodeCompletionString::Chunk
11157c10c89904f7fdc4244fcbf704625e7169aafe6sewardjCodeCompletionString::Chunk::CreateText(StringRef Text) {
11257c10c89904f7fdc4244fcbf704625e7169aafe6sewardj  return Chunk(CK_Text, Text);
11357c10c89904f7fdc4244fcbf704625e7169aafe6sewardj}
11457c10c89904f7fdc4244fcbf704625e7169aafe6sewardj
11557c10c89904f7fdc4244fcbf704625e7169aafe6sewardjCodeCompletionString::Chunk
11657c10c89904f7fdc4244fcbf704625e7169aafe6sewardjCodeCompletionString::Chunk::CreateOptional(
11757c10c89904f7fdc4244fcbf704625e7169aafe6sewardj                                 std::auto_ptr<CodeCompletionString> Optional) {
11857c10c89904f7fdc4244fcbf704625e7169aafe6sewardj  Chunk Result;
11957c10c89904f7fdc4244fcbf704625e7169aafe6sewardj  Result.Kind = CK_Optional;
12057c10c89904f7fdc4244fcbf704625e7169aafe6sewardj  Result.Optional = Optional.release();
12157c10c89904f7fdc4244fcbf704625e7169aafe6sewardj  return Result;
12257c10c89904f7fdc4244fcbf704625e7169aafe6sewardj}
12357c10c89904f7fdc4244fcbf704625e7169aafe6sewardj
12457c10c89904f7fdc4244fcbf704625e7169aafe6sewardjCodeCompletionString::Chunk
12557c10c89904f7fdc4244fcbf704625e7169aafe6sewardjCodeCompletionString::Chunk::CreatePlaceholder(StringRef Placeholder) {
12657c10c89904f7fdc4244fcbf704625e7169aafe6sewardj  return Chunk(CK_Placeholder, Placeholder);
12757c10c89904f7fdc4244fcbf704625e7169aafe6sewardj}
12857c10c89904f7fdc4244fcbf704625e7169aafe6sewardj
12957c10c89904f7fdc4244fcbf704625e7169aafe6sewardjCodeCompletionString::Chunk
13057c10c89904f7fdc4244fcbf704625e7169aafe6sewardjCodeCompletionString::Chunk::CreateInformative(StringRef Informative) {
13157c10c89904f7fdc4244fcbf704625e7169aafe6sewardj  return Chunk(CK_Informative, Informative);
13257c10c89904f7fdc4244fcbf704625e7169aafe6sewardj}
13357c10c89904f7fdc4244fcbf704625e7169aafe6sewardj
13457c10c89904f7fdc4244fcbf704625e7169aafe6sewardjCodeCompletionString::Chunk
13557c10c89904f7fdc4244fcbf704625e7169aafe6sewardjCodeCompletionString::Chunk::CreateResultType(StringRef ResultType) {
13657c10c89904f7fdc4244fcbf704625e7169aafe6sewardj  return Chunk(CK_ResultType, ResultType);
13757c10c89904f7fdc4244fcbf704625e7169aafe6sewardj}
13857c10c89904f7fdc4244fcbf704625e7169aafe6sewardj
13957c10c89904f7fdc4244fcbf704625e7169aafe6sewardjCodeCompletionString::Chunk
14057c10c89904f7fdc4244fcbf704625e7169aafe6sewardjCodeCompletionString::Chunk::CreateCurrentParameter(
14157c10c89904f7fdc4244fcbf704625e7169aafe6sewardj                                                StringRef CurrentParameter) {
14257c10c89904f7fdc4244fcbf704625e7169aafe6sewardj  return Chunk(CK_CurrentParameter, CurrentParameter);
14357c10c89904f7fdc4244fcbf704625e7169aafe6sewardj}
14457c10c89904f7fdc4244fcbf704625e7169aafe6sewardj
14557c10c89904f7fdc4244fcbf704625e7169aafe6sewardjCodeCompletionString::Chunk CodeCompletionString::Chunk::Clone() const {
14657c10c89904f7fdc4244fcbf704625e7169aafe6sewardj  switch (Kind) {
14757c10c89904f7fdc4244fcbf704625e7169aafe6sewardj  case CK_TypedText:
14857c10c89904f7fdc4244fcbf704625e7169aafe6sewardj  case CK_Text:
14957c10c89904f7fdc4244fcbf704625e7169aafe6sewardj  case CK_Placeholder:
1502f10aa6f4e9ea78030c46cce9b073b19c63c0f60sewardj  case CK_Informative:
15157c10c89904f7fdc4244fcbf704625e7169aafe6sewardj  case CK_ResultType:
15257c10c89904f7fdc4244fcbf704625e7169aafe6sewardj  case CK_CurrentParameter:
15357c10c89904f7fdc4244fcbf704625e7169aafe6sewardj  case CK_LeftParen:
15457c10c89904f7fdc4244fcbf704625e7169aafe6sewardj  case CK_RightParen:
15557c10c89904f7fdc4244fcbf704625e7169aafe6sewardj  case CK_LeftBracket:
15657c10c89904f7fdc4244fcbf704625e7169aafe6sewardj  case CK_RightBracket:
15757c10c89904f7fdc4244fcbf704625e7169aafe6sewardj  case CK_LeftBrace:
15857c10c89904f7fdc4244fcbf704625e7169aafe6sewardj  case CK_RightBrace:
15957c10c89904f7fdc4244fcbf704625e7169aafe6sewardj  case CK_LeftAngle:
16057c10c89904f7fdc4244fcbf704625e7169aafe6sewardj  case CK_RightAngle:
16157c10c89904f7fdc4244fcbf704625e7169aafe6sewardj  case CK_Comma:
16257c10c89904f7fdc4244fcbf704625e7169aafe6sewardj  case CK_Colon:
16357c10c89904f7fdc4244fcbf704625e7169aafe6sewardj  case CK_SemiColon:
16457c10c89904f7fdc4244fcbf704625e7169aafe6sewardj  case CK_Equal:
16557c10c89904f7fdc4244fcbf704625e7169aafe6sewardj  case CK_HorizontalSpace:
16657c10c89904f7fdc4244fcbf704625e7169aafe6sewardj  case CK_VerticalSpace:
16757c10c89904f7fdc4244fcbf704625e7169aafe6sewardj    return Chunk(Kind, Text);
16857c10c89904f7fdc4244fcbf704625e7169aafe6sewardj
16957c10c89904f7fdc4244fcbf704625e7169aafe6sewardj  case CK_Optional: {
170dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj    std::auto_ptr<CodeCompletionString> Opt(Optional->Clone());
17157c10c89904f7fdc4244fcbf704625e7169aafe6sewardj    return CreateOptional(Opt);
17257c10c89904f7fdc4244fcbf704625e7169aafe6sewardj  }
17357c10c89904f7fdc4244fcbf704625e7169aafe6sewardj  }
17457c10c89904f7fdc4244fcbf704625e7169aafe6sewardj
17557c10c89904f7fdc4244fcbf704625e7169aafe6sewardj  // Silence GCC warning.
17657c10c89904f7fdc4244fcbf704625e7169aafe6sewardj  return Chunk();
17757c10c89904f7fdc4244fcbf704625e7169aafe6sewardj}
17857c10c89904f7fdc4244fcbf704625e7169aafe6sewardj
17957c10c89904f7fdc4244fcbf704625e7169aafe6sewardjvoid
18057c10c89904f7fdc4244fcbf704625e7169aafe6sewardjCodeCompletionString::Chunk::Destroy() {
18157c10c89904f7fdc4244fcbf704625e7169aafe6sewardj  switch (Kind) {
18257c10c89904f7fdc4244fcbf704625e7169aafe6sewardj  case CK_Optional:
18357c10c89904f7fdc4244fcbf704625e7169aafe6sewardj    delete Optional;
18457c10c89904f7fdc4244fcbf704625e7169aafe6sewardj    break;
18557c10c89904f7fdc4244fcbf704625e7169aafe6sewardj
18657c10c89904f7fdc4244fcbf704625e7169aafe6sewardj  case CK_TypedText:
18757c10c89904f7fdc4244fcbf704625e7169aafe6sewardj  case CK_Text:
188ac6b7121413a24ce2f63727d50ac4f3a1b9027e6sewardj  case CK_Placeholder:
189ec6ad593611ccd69f797e3add4d23a5f31aa84d6sewardj  case CK_Informative:
190ec6ad593611ccd69f797e3add4d23a5f31aa84d6sewardj  case CK_ResultType:
191496a58d130a28ac3a5ba33c9012dabbe61dc852csewardj  case CK_CurrentParameter:
192496a58d130a28ac3a5ba33c9012dabbe61dc852csewardj    delete [] Text;
193496a58d130a28ac3a5ba33c9012dabbe61dc852csewardj    break;
194496a58d130a28ac3a5ba33c9012dabbe61dc852csewardj
195496a58d130a28ac3a5ba33c9012dabbe61dc852csewardj  case CK_LeftParen:
196496a58d130a28ac3a5ba33c9012dabbe61dc852csewardj  case CK_RightParen:
197496a58d130a28ac3a5ba33c9012dabbe61dc852csewardj  case CK_LeftBracket:
198496a58d130a28ac3a5ba33c9012dabbe61dc852csewardj  case CK_RightBracket:
199496a58d130a28ac3a5ba33c9012dabbe61dc852csewardj  case CK_LeftBrace:
200496a58d130a28ac3a5ba33c9012dabbe61dc852csewardj  case CK_RightBrace:
201496a58d130a28ac3a5ba33c9012dabbe61dc852csewardj  case CK_LeftAngle:
202496a58d130a28ac3a5ba33c9012dabbe61dc852csewardj  case CK_RightAngle:
203496a58d130a28ac3a5ba33c9012dabbe61dc852csewardj  case CK_Comma:
204dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj  case CK_Colon:
205496a58d130a28ac3a5ba33c9012dabbe61dc852csewardj  case CK_SemiColon:
206f6c8ebf1294fea43756683ba7089b746168abb8esewardj  case CK_Equal:
207f6c8ebf1294fea43756683ba7089b746168abb8esewardj  case CK_HorizontalSpace:
208496a58d130a28ac3a5ba33c9012dabbe61dc852csewardj  case CK_VerticalSpace:
209dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj    break;
210496a58d130a28ac3a5ba33c9012dabbe61dc852csewardj  }
211f6c8ebf1294fea43756683ba7089b746168abb8esewardj}
212f6c8ebf1294fea43756683ba7089b746168abb8esewardj
213496a58d130a28ac3a5ba33c9012dabbe61dc852csewardjvoid CodeCompletionString::clear() {
214496a58d130a28ac3a5ba33c9012dabbe61dc852csewardj  std::for_each(Chunks.begin(), Chunks.end(),
215c97096c44637ae5775ed305b19f16f0b505f17d8sewardj                std::mem_fun_ref(&Chunk::Destroy));
216e3d0d2ea7b2161ae4f627882be33902ce5f3f8besewardj  Chunks.clear();
21757c10c89904f7fdc4244fcbf704625e7169aafe6sewardj}
21857c10c89904f7fdc4244fcbf704625e7169aafe6sewardj
219e3d0d2ea7b2161ae4f627882be33902ce5f3f8besewardjstd::string CodeCompletionString::getAsString() const {
220c9a43665879a03886b27a65b68af2a2c11b04f59sewardj  std::string Result;
221c4356f0d3c74fc2622dbeed79c6c1045fc519f72sewardj  llvm::raw_string_ostream OS(Result);
222c4356f0d3c74fc2622dbeed79c6c1045fc519f72sewardj
223c9a43665879a03886b27a65b68af2a2c11b04f59sewardj  for (iterator C = begin(), CEnd = end(); C != CEnd; ++C) {
224c9a43665879a03886b27a65b68af2a2c11b04f59sewardj    switch (C->Kind) {
225c9a43665879a03886b27a65b68af2a2c11b04f59sewardj    case CK_Optional: OS << "{#" << C->Optional->getAsString() << "#}"; break;
226c9a43665879a03886b27a65b68af2a2c11b04f59sewardj    case CK_Placeholder: OS << "<#" << C->Text << "#>"; break;
2279b96767debeeb1f78378f0e7e295fe6762c64002sewardj
228c9a43665879a03886b27a65b68af2a2c11b04f59sewardj    case CK_Informative:
229c9a43665879a03886b27a65b68af2a2c11b04f59sewardj    case CK_ResultType:
2302019a976f07ff418dde2dfc7cc74667ef66d7764sewardj      OS << "[#" << C->Text << "#]";
231c9a43665879a03886b27a65b68af2a2c11b04f59sewardj      break;
232d1725d18b61bf7912a9099686179faef5815dba1sewardj
233e3d0d2ea7b2161ae4f627882be33902ce5f3f8besewardj    case CK_CurrentParameter: OS << "<#" << C->Text << "#>"; break;
234e3d0d2ea7b2161ae4f627882be33902ce5f3f8besewardj    default: OS << C->Text; break;
23557c10c89904f7fdc4244fcbf704625e7169aafe6sewardj    }
23635421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj  }
23757c10c89904f7fdc4244fcbf704625e7169aafe6sewardj  return OS.str();
23857c10c89904f7fdc4244fcbf704625e7169aafe6sewardj}
23957c10c89904f7fdc4244fcbf704625e7169aafe6sewardj
240c97096c44637ae5775ed305b19f16f0b505f17d8sewardjconst char *CodeCompletionString::getTypedText() const {
241e3d0d2ea7b2161ae4f627882be33902ce5f3f8besewardj  for (iterator C = begin(), CEnd = end(); C != CEnd; ++C)
242af1cecaf9c96f99381dda16f41d286fc3e4d220asewardj    if (C->Kind == CK_TypedText)
243af1cecaf9c96f99381dda16f41d286fc3e4d220asewardj      return C->Text;
24457c10c89904f7fdc4244fcbf704625e7169aafe6sewardj
245af1cecaf9c96f99381dda16f41d286fc3e4d220asewardj  return 0;
246af1cecaf9c96f99381dda16f41d286fc3e4d220asewardj}
247c4356f0d3c74fc2622dbeed79c6c1045fc519f72sewardj
248c4356f0d3c74fc2622dbeed79c6c1045fc519f72sewardjCodeCompletionString *
249af1cecaf9c96f99381dda16f41d286fc3e4d220asewardjCodeCompletionString::Clone(CodeCompletionString *Result) const {
250af1cecaf9c96f99381dda16f41d286fc3e4d220asewardj  if (!Result)
251af1cecaf9c96f99381dda16f41d286fc3e4d220asewardj    Result = new CodeCompletionString;
252af1cecaf9c96f99381dda16f41d286fc3e4d220asewardj  for (iterator C = begin(), CEnd = end(); C != CEnd; ++C)
253c97096c44637ae5775ed305b19f16f0b505f17d8sewardj    Result->AddChunk(C->Clone());
254ec6ad593611ccd69f797e3add4d23a5f31aa84d6sewardj  return Result;
25557c10c89904f7fdc4244fcbf704625e7169aafe6sewardj}
25657c10c89904f7fdc4244fcbf704625e7169aafe6sewardj
25757c10c89904f7fdc4244fcbf704625e7169aafe6sewardjstatic void WriteUnsigned(llvm::raw_ostream &OS, unsigned Value) {
258ac6b7121413a24ce2f63727d50ac4f3a1b9027e6sewardj  OS.write((const char *)&Value, sizeof(unsigned));
259c9a43665879a03886b27a65b68af2a2c11b04f59sewardj}
260c4356f0d3c74fc2622dbeed79c6c1045fc519f72sewardj
261c9a43665879a03886b27a65b68af2a2c11b04f59sewardjstatic bool ReadUnsigned(const char *&Memory, const char *MemoryEnd,
262c9a43665879a03886b27a65b68af2a2c11b04f59sewardj                         unsigned &Value) {
263c9a43665879a03886b27a65b68af2a2c11b04f59sewardj  if (Memory + sizeof(unsigned) > MemoryEnd)
264c9a43665879a03886b27a65b68af2a2c11b04f59sewardj    return true;
2652019a976f07ff418dde2dfc7cc74667ef66d7764sewardj
2662019a976f07ff418dde2dfc7cc74667ef66d7764sewardj  memmove(&Value, Memory, sizeof(unsigned));
2672019a976f07ff418dde2dfc7cc74667ef66d7764sewardj  Memory += sizeof(unsigned);
2681e6ad745ebafd0524da1da27a4b85524fa84f777sewardj  return false;
2691e6ad745ebafd0524da1da27a4b85524fa84f777sewardj}
2701e6ad745ebafd0524da1da27a4b85524fa84f777sewardj
27157c10c89904f7fdc4244fcbf704625e7169aafe6sewardjvoid CodeCompletionString::Serialize(llvm::raw_ostream &OS) const {
27257c10c89904f7fdc4244fcbf704625e7169aafe6sewardj  // Write the number of chunks.
273207557ab2ea38239b670785c976b89d50bbb0eccsewardj  WriteUnsigned(OS, size());
274ac6b7121413a24ce2f63727d50ac4f3a1b9027e6sewardj
275ec6ad593611ccd69f797e3add4d23a5f31aa84d6sewardj  for (iterator C = begin(), CEnd = end(); C != CEnd; ++C) {
27657c10c89904f7fdc4244fcbf704625e7169aafe6sewardj    WriteUnsigned(OS, C->Kind);
27757c10c89904f7fdc4244fcbf704625e7169aafe6sewardj
27857c10c89904f7fdc4244fcbf704625e7169aafe6sewardj    switch (C->Kind) {
27957c10c89904f7fdc4244fcbf704625e7169aafe6sewardj    case CK_TypedText:
280ac6b7121413a24ce2f63727d50ac4f3a1b9027e6sewardj    case CK_Text:
281e3d0d2ea7b2161ae4f627882be33902ce5f3f8besewardj    case CK_Placeholder:
282ac6b7121413a24ce2f63727d50ac4f3a1b9027e6sewardj    case CK_Informative:
283ac6b7121413a24ce2f63727d50ac4f3a1b9027e6sewardj    case CK_ResultType:
284ba99931f6dfa264d7bc7c3845a46fc955ab56d93sewardj    case CK_CurrentParameter: {
285c97096c44637ae5775ed305b19f16f0b505f17d8sewardj      const char *Text = C->Text;
286c97096c44637ae5775ed305b19f16f0b505f17d8sewardj      unsigned StrLen = strlen(Text);
287c97096c44637ae5775ed305b19f16f0b505f17d8sewardj      WriteUnsigned(OS, StrLen);
288c97096c44637ae5775ed305b19f16f0b505f17d8sewardj      OS.write(Text, StrLen);
2892019a976f07ff418dde2dfc7cc74667ef66d7764sewardj      break;
2902019a976f07ff418dde2dfc7cc74667ef66d7764sewardj    }
291a58ea668d4725b87a146cf43cc48b8ea6ead84casewardj
29217442fe8094d0f82266e5a05509f62cac8f7539esewardj    case CK_Optional:
29357c10c89904f7fdc4244fcbf704625e7169aafe6sewardj      C->Optional->Serialize(OS);
294ac6b7121413a24ce2f63727d50ac4f3a1b9027e6sewardj      break;
295ac6b7121413a24ce2f63727d50ac4f3a1b9027e6sewardj
296ac6b7121413a24ce2f63727d50ac4f3a1b9027e6sewardj    case CK_LeftParen:
297ec6ad593611ccd69f797e3add4d23a5f31aa84d6sewardj    case CK_RightParen:
29857c10c89904f7fdc4244fcbf704625e7169aafe6sewardj    case CK_LeftBracket:
299ba99931f6dfa264d7bc7c3845a46fc955ab56d93sewardj    case CK_RightBracket:
30017442fe8094d0f82266e5a05509f62cac8f7539esewardj    case CK_LeftBrace:
30117442fe8094d0f82266e5a05509f62cac8f7539esewardj    case CK_RightBrace:
30217442fe8094d0f82266e5a05509f62cac8f7539esewardj    case CK_LeftAngle:
30317442fe8094d0f82266e5a05509f62cac8f7539esewardj    case CK_RightAngle:
3042019a976f07ff418dde2dfc7cc74667ef66d7764sewardj    case CK_Comma:
3052019a976f07ff418dde2dfc7cc74667ef66d7764sewardj    case CK_Colon:
30617442fe8094d0f82266e5a05509f62cac8f7539esewardj    case CK_SemiColon:
30717442fe8094d0f82266e5a05509f62cac8f7539esewardj    case CK_Equal:
3081e6ad745ebafd0524da1da27a4b85524fa84f777sewardj    case CK_HorizontalSpace:
309c97096c44637ae5775ed305b19f16f0b505f17d8sewardj    case CK_VerticalSpace:
31057c10c89904f7fdc4244fcbf704625e7169aafe6sewardj      break;
311dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj    }
312695cff9303ef5dc8079117acfd632b44edb1f010sewardj  }
31357c10c89904f7fdc4244fcbf704625e7169aafe6sewardj}
31435421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj
31557c10c89904f7fdc4244fcbf704625e7169aafe6sewardjbool CodeCompletionString::Deserialize(const char *&Str, const char *StrEnd) {
31657c10c89904f7fdc4244fcbf704625e7169aafe6sewardj  if (Str == StrEnd || *Str == 0)
3174345f7a3ecee1dde39b3c9b58372a5af97a06e8csewardj    return false;
318ec6ad593611ccd69f797e3add4d23a5f31aa84d6sewardj
319c97096c44637ae5775ed305b19f16f0b505f17d8sewardj  unsigned NumBlocks;
3208ea867b06de73d909c29e243407713c291c8414esewardj  if (ReadUnsigned(Str, StrEnd, NumBlocks))
3218ea867b06de73d909c29e243407713c291c8414esewardj    return false;
3228ea867b06de73d909c29e243407713c291c8414esewardj
32377352545d8416a36a4e6310aaea6b0205508aea2sewardj  for (unsigned I = 0; I != NumBlocks; ++I) {
3248ea867b06de73d909c29e243407713c291c8414esewardj    if (Str + 1 >= StrEnd)
32503d91140809def2f5afc04b0cc9beb0f4f0a1b13sewardj      break;
32603d91140809def2f5afc04b0cc9beb0f4f0a1b13sewardj
32703d91140809def2f5afc04b0cc9beb0f4f0a1b13sewardj    // Parse the next kind.
32803d91140809def2f5afc04b0cc9beb0f4f0a1b13sewardj    unsigned KindValue;
32943c56461a667ca81fe29f1db01450d6ff1d62949sewardj    if (ReadUnsigned(Str, StrEnd, KindValue))
33043c56461a667ca81fe29f1db01450d6ff1d62949sewardj      return false;
33143c56461a667ca81fe29f1db01450d6ff1d62949sewardj
33243c56461a667ca81fe29f1db01450d6ff1d62949sewardj    switch (ChunkKind Kind = (ChunkKind)KindValue) {
33343c56461a667ca81fe29f1db01450d6ff1d62949sewardj    case CK_TypedText:
33443c56461a667ca81fe29f1db01450d6ff1d62949sewardj    case CK_Text:
33543c56461a667ca81fe29f1db01450d6ff1d62949sewardj    case CK_Placeholder:
3368ea867b06de73d909c29e243407713c291c8414esewardj    case CK_Informative:
3378ea867b06de73d909c29e243407713c291c8414esewardj    case CK_ResultType:
3388ea867b06de73d909c29e243407713c291c8414esewardj    case CK_CurrentParameter: {
3392d49b43ae3dd3756ed6a6d7a66b54c7bd7e03af6sewardj      unsigned StrLen;
3402d49b43ae3dd3756ed6a6d7a66b54c7bd7e03af6sewardj      if (ReadUnsigned(Str, StrEnd, StrLen) || (Str + StrLen > StrEnd))
3412d49b43ae3dd3756ed6a6d7a66b54c7bd7e03af6sewardj        return false;
3422d49b43ae3dd3756ed6a6d7a66b54c7bd7e03af6sewardj
3438ea867b06de73d909c29e243407713c291c8414esewardj      AddChunk(Chunk(Kind, StringRef(Str, StrLen)));
3448ea867b06de73d909c29e243407713c291c8414esewardj      Str += StrLen;
3458ea867b06de73d909c29e243407713c291c8414esewardj      break;
34657c10c89904f7fdc4244fcbf704625e7169aafe6sewardj    }
3472d49b43ae3dd3756ed6a6d7a66b54c7bd7e03af6sewardj
3488ea867b06de73d909c29e243407713c291c8414esewardj    case CK_Optional: {
34957c10c89904f7fdc4244fcbf704625e7169aafe6sewardj      std::auto_ptr<CodeCompletionString> Optional(new CodeCompletionString());
350dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj      if (Optional->Deserialize(Str, StrEnd))
3518ea867b06de73d909c29e243407713c291c8414esewardj        AddOptionalChunk(Optional);
35257c10c89904f7fdc4244fcbf704625e7169aafe6sewardj      break;
3538ea867b06de73d909c29e243407713c291c8414esewardj    }
3548ea867b06de73d909c29e243407713c291c8414esewardj
3558ea867b06de73d909c29e243407713c291c8414esewardj    case CK_LeftParen:
3562d3f77c12d2911173fd182d0b6e954196dee9135sewardj    case CK_RightParen:
3572d3f77c12d2911173fd182d0b6e954196dee9135sewardj    case CK_LeftBracket:
35857c10c89904f7fdc4244fcbf704625e7169aafe6sewardj    case CK_RightBracket:
35957c10c89904f7fdc4244fcbf704625e7169aafe6sewardj    case CK_LeftBrace:
36057c10c89904f7fdc4244fcbf704625e7169aafe6sewardj    case CK_RightBrace:
3612d3f77c12d2911173fd182d0b6e954196dee9135sewardj    case CK_LeftAngle:
3622d3f77c12d2911173fd182d0b6e954196dee9135sewardj    case CK_RightAngle:
36357c10c89904f7fdc4244fcbf704625e7169aafe6sewardj    case CK_Comma:
36457c10c89904f7fdc4244fcbf704625e7169aafe6sewardj    case CK_Colon:
36557c10c89904f7fdc4244fcbf704625e7169aafe6sewardj    case CK_SemiColon:
3662d3f77c12d2911173fd182d0b6e954196dee9135sewardj    case CK_Equal:
367dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj    case CK_HorizontalSpace:
3682d3f77c12d2911173fd182d0b6e954196dee9135sewardj    case CK_VerticalSpace:
369dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj      AddChunk(Chunk(Kind));
3702d3f77c12d2911173fd182d0b6e954196dee9135sewardj      break;
371dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj    }
372695cff9303ef5dc8079117acfd632b44edb1f010sewardj  };
373dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj
374dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj  return true;
3752d3f77c12d2911173fd182d0b6e954196dee9135sewardj}
3762d3f77c12d2911173fd182d0b6e954196dee9135sewardj
377c97096c44637ae5775ed305b19f16f0b505f17d8sewardjvoid CodeCompleteConsumer::Result::Destroy() {
378ec6ad593611ccd69f797e3add4d23a5f31aa84d6sewardj  if (Kind == RK_Pattern) {
37957c10c89904f7fdc4244fcbf704625e7169aafe6sewardj    delete Pattern;
38057c10c89904f7fdc4244fcbf704625e7169aafe6sewardj    Pattern = 0;
38157c10c89904f7fdc4244fcbf704625e7169aafe6sewardj  }
382fbcaf3312f39fb73d54821636c6168db76245f61sewardj}
383ec6ad593611ccd69f797e3add4d23a5f31aa84d6sewardj
38457c10c89904f7fdc4244fcbf704625e7169aafe6sewardjunsigned CodeCompleteConsumer::Result::getPriorityFromDecl(NamedDecl *ND) {
38535421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj  if (!ND)
386c97096c44637ae5775ed305b19f16f0b505f17d8sewardj    return CCP_Unlikely;
38792d168d0f2a985ed9f7ae4e6bba9565a13921b31sewardj
388fbcaf3312f39fb73d54821636c6168db76245f61sewardj  // Context-based decisions.
389ec6ad593611ccd69f797e3add4d23a5f31aa84d6sewardj  DeclContext *DC = ND->getDeclContext()->getLookupContext();
39040c802659108a96bb87cbc1a30b7b77e2abd0829sewardj  if (DC->isFunctionOrMethod() || isa<BlockDecl>(DC))
391ac6b7121413a24ce2f63727d50ac4f3a1b9027e6sewardj    return CCP_LocalDeclaration;
39257c10c89904f7fdc4244fcbf704625e7169aafe6sewardj  if (DC->isRecord() || isa<ObjCContainerDecl>(DC))
39357c10c89904f7fdc4244fcbf704625e7169aafe6sewardj    return CCP_MemberDeclaration;
39457c10c89904f7fdc4244fcbf704625e7169aafe6sewardj
39557c10c89904f7fdc4244fcbf704625e7169aafe6sewardj  // Content-based decisions.
39657c10c89904f7fdc4244fcbf704625e7169aafe6sewardj  if (isa<EnumConstantDecl>(ND))
39757c10c89904f7fdc4244fcbf704625e7169aafe6sewardj    return CCP_Constant;
39857c10c89904f7fdc4244fcbf704625e7169aafe6sewardj  if (isa<TypeDecl>(ND) || isa<ObjCInterfaceDecl>(ND))
39957c10c89904f7fdc4244fcbf704625e7169aafe6sewardj    return CCP_Type;
40057c10c89904f7fdc4244fcbf704625e7169aafe6sewardj  return CCP_Declaration;
40157c10c89904f7fdc4244fcbf704625e7169aafe6sewardj}
402ac6b7121413a24ce2f63727d50ac4f3a1b9027e6sewardj
40341f43bcdee3e150a74a2e8c8e3b5bc5f5fda3215sewardj//===----------------------------------------------------------------------===//
40471a35e7351fc1202ef2960d3f0315d9181624fe2sewardj// Code completion overload candidate implementation
40571a35e7351fc1202ef2960d3f0315d9181624fe2sewardj//===----------------------------------------------------------------------===//
40671a35e7351fc1202ef2960d3f0315d9181624fe2sewardjFunctionDecl *
407c4356f0d3c74fc2622dbeed79c6c1045fc519f72sewardjCodeCompleteConsumer::OverloadCandidate::getFunction() const {
40866de22767fc526eff52133c18d4a42a9b25d5f18sewardj  if (getKind() == CK_Function)
40941f43bcdee3e150a74a2e8c8e3b5bc5f5fda3215sewardj    return Function;
41041f43bcdee3e150a74a2e8c8e3b5bc5f5fda3215sewardj  else if (getKind() == CK_FunctionTemplate)
41141f43bcdee3e150a74a2e8c8e3b5bc5f5fda3215sewardj    return FunctionTemplate->getTemplatedDecl();
41241f43bcdee3e150a74a2e8c8e3b5bc5f5fda3215sewardj  else
41341f43bcdee3e150a74a2e8c8e3b5bc5f5fda3215sewardj    return 0;
41441f43bcdee3e150a74a2e8c8e3b5bc5f5fda3215sewardj}
41541f43bcdee3e150a74a2e8c8e3b5bc5f5fda3215sewardj
41641f43bcdee3e150a74a2e8c8e3b5bc5f5fda3215sewardjconst FunctionType *
41741f43bcdee3e150a74a2e8c8e3b5bc5f5fda3215sewardjCodeCompleteConsumer::OverloadCandidate::getFunctionType() const {
418e90ad6abbe540a5b3ffa68ba0c641ced77c20211sewardj  switch (Kind) {
419e90ad6abbe540a5b3ffa68ba0c641ced77c20211sewardj  case CK_Function:
420e90ad6abbe540a5b3ffa68ba0c641ced77c20211sewardj    return Function->getType()->getAs<FunctionType>();
42141f43bcdee3e150a74a2e8c8e3b5bc5f5fda3215sewardj
42241f43bcdee3e150a74a2e8c8e3b5bc5f5fda3215sewardj  case CK_FunctionTemplate:
42371a35e7351fc1202ef2960d3f0315d9181624fe2sewardj    return FunctionTemplate->getTemplatedDecl()->getType()
4241fb8c92e9b0882ebbd53c04c69ebad7efb1cd3d8sewardj             ->getAs<FunctionType>();
4251fb8c92e9b0882ebbd53c04c69ebad7efb1cd3d8sewardj
4261fb8c92e9b0882ebbd53c04c69ebad7efb1cd3d8sewardj  case CK_FunctionType:
4271fb8c92e9b0882ebbd53c04c69ebad7efb1cd3d8sewardj    return Type;
4281fb8c92e9b0882ebbd53c04c69ebad7efb1cd3d8sewardj  }
4291fb8c92e9b0882ebbd53c04c69ebad7efb1cd3d8sewardj
4301fb8c92e9b0882ebbd53c04c69ebad7efb1cd3d8sewardj  return 0;
4311fb8c92e9b0882ebbd53c04c69ebad7efb1cd3d8sewardj}
43271a35e7351fc1202ef2960d3f0315d9181624fe2sewardj
43371a35e7351fc1202ef2960d3f0315d9181624fe2sewardj//===----------------------------------------------------------------------===//
4349690d927540d730525a5f7f14663f3ceaa7818dasewardj// Code completion consumer implementation
4359b96767debeeb1f78378f0e7e295fe6762c64002sewardj//===----------------------------------------------------------------------===//
4369b96767debeeb1f78378f0e7e295fe6762c64002sewardj
4378f3debf52b76a050bc84997a0358c4aa86dfc88dsewardjCodeCompleteConsumer::~CodeCompleteConsumer() { }
438ce646f23d71ac432c340667387aa4a5ce7d18099sewardj
439f53b7359a342e7d79090615169c6583a1a75fbcesewardjvoid
440f53b7359a342e7d79090615169c6583a1a75fbcesewardjPrintingCodeCompleteConsumer::ProcessCodeCompleteResults(Sema &SemaRef,
441f53b7359a342e7d79090615169c6583a1a75fbcesewardj                                                 CodeCompletionContext Context,
442f53b7359a342e7d79090615169c6583a1a75fbcesewardj                                                         Result *Results,
4438f3debf52b76a050bc84997a0358c4aa86dfc88dsewardj                                                         unsigned NumResults) {
4448f3debf52b76a050bc84997a0358c4aa86dfc88dsewardj  // Print the results.
445b51f0f4f33256638ed953156a2635aa739b232f1sewardj  for (unsigned I = 0; I != NumResults; ++I) {
4469854007808ab24cad3f971eab63face1cb1e6089sewardj    OS << "COMPLETION: ";
4479854007808ab24cad3f971eab63face1cb1e6089sewardj    switch (Results[I].Kind) {
4489854007808ab24cad3f971eab63face1cb1e6089sewardj    case Result::RK_Declaration:
4499854007808ab24cad3f971eab63face1cb1e6089sewardj      OS << Results[I].Declaration;
450343b9d0f6be20948ab2f4fe87de55835f96fe30asewardj      if (Results[I].Hidden)
4510033ddccac6f90789fe2e78e86b8a649931d77b4sewardj        OS << " (Hidden)";
4520033ddccac6f90789fe2e78e86b8a649931d77b4sewardj      if (CodeCompletionString *CCS
453eb17e49565dd7867a56c8ba6e45fdca01a576bb3sewardj            = Results[I].CreateCodeCompletionString(SemaRef)) {
454eb17e49565dd7867a56c8ba6e45fdca01a576bb3sewardj        OS << " : " << CCS->getAsString();
455478646f54befaba01cbceb40fd5e46cdf562fdb5sewardj        delete CCS;
4560033ddccac6f90789fe2e78e86b8a649931d77b4sewardj      }
45757c10c89904f7fdc4244fcbf704625e7169aafe6sewardj
45857c10c89904f7fdc4244fcbf704625e7169aafe6sewardj      OS << '\n';
459b51f0f4f33256638ed953156a2635aa739b232f1sewardj      break;
460b51f0f4f33256638ed953156a2635aa739b232f1sewardj
461b51f0f4f33256638ed953156a2635aa739b232f1sewardj    case Result::RK_Keyword:
462b51f0f4f33256638ed953156a2635aa739b232f1sewardj      OS << Results[I].Keyword << '\n';
4632831b00c4950d6c2b061def05fd67528fe132ececerion      break;
4642831b00c4950d6c2b061def05fd67528fe132ececerion
465b51f0f4f33256638ed953156a2635aa739b232f1sewardj    case Result::RK_Macro: {
4669690d927540d730525a5f7f14663f3ceaa7818dasewardj      OS << Results[I].Macro->getName();
4678f3debf52b76a050bc84997a0358c4aa86dfc88dsewardj      if (CodeCompletionString *CCS
4685c8a0cbfd7fd3b506f6ba1cb25a6aa20efb59dcbcerion            = Results[I].CreateCodeCompletionString(SemaRef)) {
4695c8a0cbfd7fd3b506f6ba1cb25a6aa20efb59dcbcerion        OS << " : " << CCS->getAsString();
470f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion        delete CCS;
471f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion      }
472e71e56a90e91ce37b0ee846a4ff94493d59f2095sewardj      OS << '\n';
473e71e56a90e91ce37b0ee846a4ff94493d59f2095sewardj      break;
4744aa412af1d8166cc11f39a6e721df49431d23618sewardj    }
475e71e56a90e91ce37b0ee846a4ff94493d59f2095sewardj
4765c8a0cbfd7fd3b506f6ba1cb25a6aa20efb59dcbcerion    case Result::RK_Pattern: {
4779690d927540d730525a5f7f14663f3ceaa7818dasewardj      OS << "Pattern : "
4789690d927540d730525a5f7f14663f3ceaa7818dasewardj         << Results[I].Pattern->getAsString() << '\n';
4799690d927540d730525a5f7f14663f3ceaa7818dasewardj      break;
48089d4e9828ce36532c957566ebb46947109a7b53dsewardj    }
481343b9d0f6be20948ab2f4fe87de55835f96fe30asewardj    }
482343b9d0f6be20948ab2f4fe87de55835f96fe30asewardj  }
483343b9d0f6be20948ab2f4fe87de55835f96fe30asewardj}
484343b9d0f6be20948ab2f4fe87de55835f96fe30asewardj
4852019a976f07ff418dde2dfc7cc74667ef66d7764sewardjvoid
4862019a976f07ff418dde2dfc7cc74667ef66d7764sewardjPrintingCodeCompleteConsumer::ProcessOverloadCandidates(Sema &SemaRef,
4872019a976f07ff418dde2dfc7cc74667ef66d7764sewardj                                                        unsigned CurrentArg,
4880033ddccac6f90789fe2e78e86b8a649931d77b4sewardj                                              OverloadCandidate *Candidates,
4890033ddccac6f90789fe2e78e86b8a649931d77b4sewardj                                                     unsigned NumCandidates) {
4900033ddccac6f90789fe2e78e86b8a649931d77b4sewardj  for (unsigned I = 0; I != NumCandidates; ++I) {
4910033ddccac6f90789fe2e78e86b8a649931d77b4sewardj    if (CodeCompletionString *CCS
4920033ddccac6f90789fe2e78e86b8a649931d77b4sewardj          = Candidates[I].CreateSignatureString(CurrentArg, SemaRef)) {
4939690d927540d730525a5f7f14663f3ceaa7818dasewardj      OS << "OVERLOAD: " << CCS->getAsString() << "\n";
4940033ddccac6f90789fe2e78e86b8a649931d77b4sewardj      delete CCS;
4950033ddccac6f90789fe2e78e86b8a649931d77b4sewardj    }
4960033ddccac6f90789fe2e78e86b8a649931d77b4sewardj  }
4970033ddccac6f90789fe2e78e86b8a649931d77b4sewardj}
4980033ddccac6f90789fe2e78e86b8a649931d77b4sewardj
4990033ddccac6f90789fe2e78e86b8a649931d77b4sewardjvoid CodeCompleteConsumer::Result::computeCursorKind() {
5000033ddccac6f90789fe2e78e86b8a649931d77b4sewardj  switch (Kind) {
501a238471814bd386aeb58a76718b41e68b1a794b2sewardj  case RK_Declaration:
5020033ddccac6f90789fe2e78e86b8a649931d77b4sewardj    switch (Declaration->getKind()) {
503b81f8b3e9110a5608094b8ec1a5c6d3c30a8e5aesewardj    case Decl::Record:
504b81f8b3e9110a5608094b8ec1a5c6d3c30a8e5aesewardj    case Decl::CXXRecord:
505b81f8b3e9110a5608094b8ec1a5c6d3c30a8e5aesewardj    case Decl::ClassTemplateSpecialization: {
506b81f8b3e9110a5608094b8ec1a5c6d3c30a8e5aesewardj      RecordDecl *Record = cast<RecordDecl>(Declaration);
5078c7f1abe9e022f6382634efea09c9cac89ec6336sewardj      if (Record->isStruct())
5088c7f1abe9e022f6382634efea09c9cac89ec6336sewardj        CursorKind = CXCursor_StructDecl;
5098c7f1abe9e022f6382634efea09c9cac89ec6336sewardj      else if (Record->isUnion())
5108c7f1abe9e022f6382634efea09c9cac89ec6336sewardj        CursorKind = CXCursor_UnionDecl;
5119690d927540d730525a5f7f14663f3ceaa7818dasewardj      else
5128c7f1abe9e022f6382634efea09c9cac89ec6336sewardj        CursorKind = CXCursor_ClassDecl;
5139690d927540d730525a5f7f14663f3ceaa7818dasewardj      break;
5149690d927540d730525a5f7f14663f3ceaa7818dasewardj    }
5159b96767debeeb1f78378f0e7e295fe6762c64002sewardj
5169b96767debeeb1f78378f0e7e295fe6762c64002sewardj    case Decl::ObjCMethod: {
5179b96767debeeb1f78378f0e7e295fe6762c64002sewardj      ObjCMethodDecl *Method = cast<ObjCMethodDecl>(Declaration);
5189b96767debeeb1f78378f0e7e295fe6762c64002sewardj      if (Method->isInstanceMethod())
519cf780b4c356a274cc48a6829963f8bc79a1b34e8sewardj          CursorKind = CXCursor_ObjCInstanceMethodDecl;
5206e797c5fbd90ecc6531f9d8c4929848664a13714sewardj      else
52184ff0657940e62f38e618ea18bac6f27ce0e741fsewardj        CursorKind = CXCursor_ObjCClassMethodDecl;
522291a7e8fa181da2b707a2a7d51fbdccb17908f87sewardj      break;
523291a7e8fa181da2b707a2a7d51fbdccb17908f87sewardj    }
52484ff0657940e62f38e618ea18bac6f27ce0e741fsewardj
525291a7e8fa181da2b707a2a7d51fbdccb17908f87sewardj    case Decl::Typedef:
526fd33277c458b31596eb4fb15959467ac047c75dasewardj      CursorKind = CXCursor_TypedefDecl;
5278eda6304ecfaa1d0aa70773a2c07f996717f8f54sewardj      break;
528cf7879021370aabcccb1a9347244fcc7d5680141sewardj
529b5874aa03bb38bf754aa8c1cb1e400f3d7e86b9fsewardj    case Decl::Enum:
5308f3debf52b76a050bc84997a0358c4aa86dfc88dsewardj      CursorKind = CXCursor_EnumDecl;
531baf971ad7f6e005109f3301ec9d19c98066b3840sewardj      break;
5328f3debf52b76a050bc84997a0358c4aa86dfc88dsewardj
533b183b8571b4ec98866ce2b3653a9d066cf5f16f4sewardj    case Decl::Field:
534cfded9ab7c059881ecdbe967ddfcc1ce207986casewardj      CursorKind = CXCursor_FieldDecl;
535b183b8571b4ec98866ce2b3653a9d066cf5f16f4sewardj      break;
536b183b8571b4ec98866ce2b3653a9d066cf5f16f4sewardj
537b183b8571b4ec98866ce2b3653a9d066cf5f16f4sewardj    case Decl::EnumConstant:
53852ace3ed99ccb7d0e4c64dc06381e407a8bfcf1dsewardj      CursorKind = CXCursor_EnumConstantDecl;
5396c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      break;
5406c299f3acab617581ea504e45fbb6cab24c2b29fsewardj
5416c299f3acab617581ea504e45fbb6cab24c2b29fsewardj    case Decl::Function:
542b183b8571b4ec98866ce2b3653a9d066cf5f16f4sewardj    case Decl::CXXMethod:
543b183b8571b4ec98866ce2b3653a9d066cf5f16f4sewardj    case Decl::CXXConstructor:
544b183b8571b4ec98866ce2b3653a9d066cf5f16f4sewardj    case Decl::CXXDestructor:
545b183b8571b4ec98866ce2b3653a9d066cf5f16f4sewardj    case Decl::CXXConversion:
54652ace3ed99ccb7d0e4c64dc06381e407a8bfcf1dsewardj      CursorKind = CXCursor_FunctionDecl;
547b183b8571b4ec98866ce2b3653a9d066cf5f16f4sewardj      break;
548b183b8571b4ec98866ce2b3653a9d066cf5f16f4sewardj
549b183b8571b4ec98866ce2b3653a9d066cf5f16f4sewardj    case Decl::Var:
5508f3debf52b76a050bc84997a0358c4aa86dfc88dsewardj      CursorKind = CXCursor_VarDecl;
5516c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      break;
5526c299f3acab617581ea504e45fbb6cab24c2b29fsewardj
5536c299f3acab617581ea504e45fbb6cab24c2b29fsewardj    case Decl::ParmVar:
554b183b8571b4ec98866ce2b3653a9d066cf5f16f4sewardj      CursorKind = CXCursor_ParmDecl;
555b183b8571b4ec98866ce2b3653a9d066cf5f16f4sewardj      break;
556b183b8571b4ec98866ce2b3653a9d066cf5f16f4sewardj
557baf971ad7f6e005109f3301ec9d19c98066b3840sewardj    case Decl::ObjCInterface:
5586c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      CursorKind = CXCursor_ObjCInterfaceDecl;
5596c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      break;
5606c299f3acab617581ea504e45fbb6cab24c2b29fsewardj
5618f3debf52b76a050bc84997a0358c4aa86dfc88dsewardj    case Decl::ObjCCategory:
562883b00b3d97a9873371557d7b1f2ac5db7985e43sewardj      CursorKind = CXCursor_ObjCCategoryDecl;
5638f3debf52b76a050bc84997a0358c4aa86dfc88dsewardj      break;
5648f3debf52b76a050bc84997a0358c4aa86dfc88dsewardj
565883b00b3d97a9873371557d7b1f2ac5db7985e43sewardj    case Decl::ObjCProtocol:
5668f3debf52b76a050bc84997a0358c4aa86dfc88dsewardj      CursorKind = CXCursor_ObjCProtocolDecl;
5678f3debf52b76a050bc84997a0358c4aa86dfc88dsewardj      break;
5688f3debf52b76a050bc84997a0358c4aa86dfc88dsewardj
5696c299f3acab617581ea504e45fbb6cab24c2b29fsewardj    case Decl::ObjCProperty:
5708f3debf52b76a050bc84997a0358c4aa86dfc88dsewardj      CursorKind = CXCursor_ObjCPropertyDecl;
5712019a976f07ff418dde2dfc7cc74667ef66d7764sewardj      break;
5722019a976f07ff418dde2dfc7cc74667ef66d7764sewardj
5738f3debf52b76a050bc84997a0358c4aa86dfc88dsewardj    case Decl::ObjCIvar:
5743bca906f6e715c544eb49c278bedef093c14c0d7sewardj      CursorKind = CXCursor_ObjCIvarDecl;
575b183b8571b4ec98866ce2b3653a9d066cf5f16f4sewardj      break;
5766c299f3acab617581ea504e45fbb6cab24c2b29fsewardj
5776c299f3acab617581ea504e45fbb6cab24c2b29fsewardj    case Decl::ObjCImplementation:
5786c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      CursorKind = CXCursor_ObjCImplementationDecl;
5796c299f3acab617581ea504e45fbb6cab24c2b29fsewardj      break;
5808f3debf52b76a050bc84997a0358c4aa86dfc88dsewardj
5818f3debf52b76a050bc84997a0358c4aa86dfc88dsewardj    case Decl::ObjCCategoryImpl:
5828f3debf52b76a050bc84997a0358c4aa86dfc88dsewardj      CursorKind = CXCursor_ObjCCategoryImplDecl;
5838f3debf52b76a050bc84997a0358c4aa86dfc88dsewardj      break;
5848f3debf52b76a050bc84997a0358c4aa86dfc88dsewardj
5858f3debf52b76a050bc84997a0358c4aa86dfc88dsewardj    default:
5868f3debf52b76a050bc84997a0358c4aa86dfc88dsewardj      CursorKind = CXCursor_NotImplemented;
5878f3debf52b76a050bc84997a0358c4aa86dfc88dsewardj      break;
5888f3debf52b76a050bc84997a0358c4aa86dfc88dsewardj    }
5898f3debf52b76a050bc84997a0358c4aa86dfc88dsewardj    break;
5908f3debf52b76a050bc84997a0358c4aa86dfc88dsewardj
5916c299f3acab617581ea504e45fbb6cab24c2b29fsewardj  case Result::RK_Macro:
5926c299f3acab617581ea504e45fbb6cab24c2b29fsewardj    CursorKind = CXCursor_MacroDefinition;
5936c299f3acab617581ea504e45fbb6cab24c2b29fsewardj    break;
5946c299f3acab617581ea504e45fbb6cab24c2b29fsewardj
5956c299f3acab617581ea504e45fbb6cab24c2b29fsewardj  case Result::RK_Keyword:
5966c299f3acab617581ea504e45fbb6cab24c2b29fsewardj    CursorKind = CXCursor_NotImplemented;
5976c299f3acab617581ea504e45fbb6cab24c2b29fsewardj    break;
5986c299f3acab617581ea504e45fbb6cab24c2b29fsewardj
5996c299f3acab617581ea504e45fbb6cab24c2b29fsewardj  case Result::RK_Pattern:
6008f3debf52b76a050bc84997a0358c4aa86dfc88dsewardj    // Do nothing: Patterns can come with cursor kinds!
6018f3debf52b76a050bc84997a0358c4aa86dfc88dsewardj    break;
6028f3debf52b76a050bc84997a0358c4aa86dfc88dsewardj  }
6036c299f3acab617581ea504e45fbb6cab24c2b29fsewardj}
6046c299f3acab617581ea504e45fbb6cab24c2b29fsewardj
6056c299f3acab617581ea504e45fbb6cab24c2b29fsewardjvoid
6066c299f3acab617581ea504e45fbb6cab24c2b29fsewardjCIndexCodeCompleteConsumer::ProcessCodeCompleteResults(Sema &SemaRef,
6076c299f3acab617581ea504e45fbb6cab24c2b29fsewardj                                                 CodeCompletionContext Context,
6086c299f3acab617581ea504e45fbb6cab24c2b29fsewardj                                                       Result *Results,
6096c299f3acab617581ea504e45fbb6cab24c2b29fsewardj                                                       unsigned NumResults) {
6106c299f3acab617581ea504e45fbb6cab24c2b29fsewardj  // Print the results.
6113bca906f6e715c544eb49c278bedef093c14c0d7sewardj  for (unsigned I = 0; I != NumResults; ++I) {
6123bca906f6e715c544eb49c278bedef093c14c0d7sewardj    WriteUnsigned(OS, Results[I].CursorKind);
6133bca906f6e715c544eb49c278bedef093c14c0d7sewardj    WriteUnsigned(OS, Results[I].Priority);
6148f3debf52b76a050bc84997a0358c4aa86dfc88dsewardj    CodeCompletionString *CCS = Results[I].CreateCodeCompletionString(SemaRef);
6156c299f3acab617581ea504e45fbb6cab24c2b29fsewardj    assert(CCS && "No code-completion string?");
6166c299f3acab617581ea504e45fbb6cab24c2b29fsewardj    CCS->Serialize(OS);
6176c299f3acab617581ea504e45fbb6cab24c2b29fsewardj    delete CCS;
6184aa412af1d8166cc11f39a6e721df49431d23618sewardj  }
6196c299f3acab617581ea504e45fbb6cab24c2b29fsewardj}
6206c299f3acab617581ea504e45fbb6cab24c2b29fsewardj
6216c299f3acab617581ea504e45fbb6cab24c2b29fsewardjvoid
6226c299f3acab617581ea504e45fbb6cab24c2b29fsewardjCIndexCodeCompleteConsumer::ProcessOverloadCandidates(Sema &SemaRef,
6236c299f3acab617581ea504e45fbb6cab24c2b29fsewardj                                                      unsigned CurrentArg,
6246c299f3acab617581ea504e45fbb6cab24c2b29fsewardj                                                OverloadCandidate *Candidates,
62566d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj                                                       unsigned NumCandidates) {
62666d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj  for (unsigned I = 0; I != NumCandidates; ++I) {
62752ace3ed99ccb7d0e4c64dc06381e407a8bfcf1dsewardj    WriteUnsigned(OS, CXCursor_NotImplemented);
6286c299f3acab617581ea504e45fbb6cab24c2b29fsewardj    WriteUnsigned(OS, /*Priority=*/0);
6293bca906f6e715c544eb49c278bedef093c14c0d7sewardj    CodeCompletionString *CCS
6302019a976f07ff418dde2dfc7cc74667ef66d7764sewardj      = Candidates[I].CreateSignatureString(CurrentArg, SemaRef);
6312019a976f07ff418dde2dfc7cc74667ef66d7764sewardj    assert(CCS && "No code-completion string?");
6322019a976f07ff418dde2dfc7cc74667ef66d7764sewardj    CCS->Serialize(OS);
6332019a976f07ff418dde2dfc7cc74667ef66d7764sewardj    delete CCS;
6342019a976f07ff418dde2dfc7cc74667ef66d7764sewardj  }
6352019a976f07ff418dde2dfc7cc74667ef66d7764sewardj}
6362019a976f07ff418dde2dfc7cc74667ef66d7764sewardj