CodeCompleteConsumer.cpp revision 2b4074f1d3919e77cb33ca49c960521dea27afab
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"
1475b7128e93d736331bde659b05cd176f9dd6d047Douglas Gregor#include "clang/AST/DeclCXX.h"
15374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor#include "clang/Parse/Scope.h"
1681b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor#include "clang/Lex/Preprocessor.h"
172b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor#include "clang-c/Index.h"
1881b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor#include "Sema.h"
1981b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor#include "llvm/ADT/STLExtras.h"
200c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor#include "llvm/ADT/StringSwitch.h"
2181b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor#include "llvm/Support/raw_ostream.h"
2281b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor#include <algorithm>
23e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor#include <cstring>
24e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor#include <functional>
2592eff466867fd6a82fb3e245f2091e96a3e9888eDouglas Gregor
2681b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregorusing namespace clang;
2792eff466867fd6a82fb3e245f2091e96a3e9888eDouglas Gregorusing llvm::StringRef;
2881b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor
29e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor//===----------------------------------------------------------------------===//
30e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor// Code completion string implementation
31e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor//===----------------------------------------------------------------------===//
320c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas GregorCodeCompletionString::Chunk::Chunk(ChunkKind Kind, llvm::StringRef Text)
33ad5757f798b08f24942f093c4ac8b9fc2b527d39Daniel Dunbar  : Kind(Kind), Text("")
340563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor{
350c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  switch (Kind) {
360c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  case CK_TypedText:
370c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  case CK_Text:
380c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  case CK_Placeholder:
390c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  case CK_Informative:
400c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  case CK_CurrentParameter: {
410c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    char *New = new char [Text.size() + 1];
420c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    std::memcpy(New, Text.data(), Text.size());
430c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    New[Text.size()] = '\0';
440c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    this->Text = New;
450c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    break;
460c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  }
470c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor
480c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  case CK_Optional:
490c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    llvm::llvm_unreachable("Optional strings cannot be created from text");
500c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    break;
510c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor
520c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  case CK_LeftParen:
530c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    this->Text = "(";
540c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    break;
550c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor
560c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  case CK_RightParen:
570c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    this->Text = ")";
580c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    break;
590c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor
600c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  case CK_LeftBracket:
610c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    this->Text = "[";
620c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    break;
630c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor
640c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  case CK_RightBracket:
650c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    this->Text = "]";
660c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    break;
670c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor
680c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  case CK_LeftBrace:
690c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    this->Text = "{";
700c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    break;
710c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor
720c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  case CK_RightBrace:
730c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    this->Text = "}";
740c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    break;
750c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor
760c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  case CK_LeftAngle:
770c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    this->Text = "<";
780c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    break;
790c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor
800c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  case CK_RightAngle:
810c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    this->Text = ">";
820c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    break;
830c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor
840c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  case CK_Comma:
850c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    this->Text = ", ";
860c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    break;
870c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  }
880563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor}
890563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor
900563c2677cfc20c9450342ddc53aa96971671c71Douglas GregorCodeCompletionString::Chunk
9192eff466867fd6a82fb3e245f2091e96a3e9888eDouglas GregorCodeCompletionString::Chunk::CreateText(StringRef Text) {
920563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor  return Chunk(CK_Text, Text);
93e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor}
94e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor
95e6e0361984b077d205e9a45d64257d41d2c788c8Douglas GregorCodeCompletionString::Chunk
96e6e0361984b077d205e9a45d64257d41d2c788c8Douglas GregorCodeCompletionString::Chunk::CreateOptional(
97e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor                                 std::auto_ptr<CodeCompletionString> Optional) {
98e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor  Chunk Result;
99e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor  Result.Kind = CK_Optional;
100e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor  Result.Optional = Optional.release();
101e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor  return Result;
102e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor}
103e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor
104e6e0361984b077d205e9a45d64257d41d2c788c8Douglas GregorCodeCompletionString::Chunk
10592eff466867fd6a82fb3e245f2091e96a3e9888eDouglas GregorCodeCompletionString::Chunk::CreatePlaceholder(StringRef Placeholder) {
1060563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor  return Chunk(CK_Placeholder, Placeholder);
1070563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor}
1080563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor
1090563c2677cfc20c9450342ddc53aa96971671c71Douglas GregorCodeCompletionString::Chunk
11092eff466867fd6a82fb3e245f2091e96a3e9888eDouglas GregorCodeCompletionString::Chunk::CreateInformative(StringRef Informative) {
1110563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor  return Chunk(CK_Informative, Informative);
112e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor}
113e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor
1140c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas GregorCodeCompletionString::Chunk
1150c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas GregorCodeCompletionString::Chunk::CreateCurrentParameter(
11692eff466867fd6a82fb3e245f2091e96a3e9888eDouglas Gregor                                                StringRef CurrentParameter) {
1170c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  return Chunk(CK_CurrentParameter, CurrentParameter);
1180c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor}
1190c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor
12054f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas GregorCodeCompletionString::Chunk CodeCompletionString::Chunk::Clone() const {
12154f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor  switch (Kind) {
12254f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor  case CK_TypedText:
12354f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor  case CK_Text:
12454f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor  case CK_Placeholder:
12554f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor  case CK_Informative:
12654f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor  case CK_CurrentParameter:
12754f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor  case CK_LeftParen:
12854f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor  case CK_RightParen:
12954f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor  case CK_LeftBracket:
13054f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor  case CK_RightBracket:
13154f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor  case CK_LeftBrace:
13254f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor  case CK_RightBrace:
13354f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor  case CK_LeftAngle:
13454f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor  case CK_RightAngle:
13554f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor  case CK_Comma:
13654f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor    return Chunk(Kind, Text);
13754f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor
13854f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor  case CK_Optional: {
13954f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor    std::auto_ptr<CodeCompletionString> Opt(Optional->Clone());
14054f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor    return CreateOptional(Opt);
14154f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor  }
14254f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor  }
14354f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor
14454f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor  // Silence GCC warning.
14554f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor  return Chunk();
14654f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor}
1470c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor
148e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregorvoid
149e6e0361984b077d205e9a45d64257d41d2c788c8Douglas GregorCodeCompletionString::Chunk::Destroy() {
150e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor  switch (Kind) {
1510563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor  case CK_Optional:
1520563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor    delete Optional;
1530563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor    break;
1540563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor
1550c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  case CK_TypedText:
1560563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor  case CK_Text:
1570563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor  case CK_Placeholder:
1580563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor  case CK_Informative:
1590c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  case CK_CurrentParameter:
1600c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    delete [] Text;
1610c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    break;
1620c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor
1630c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  case CK_LeftParen:
1640c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  case CK_RightParen:
1650c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  case CK_LeftBracket:
1660c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  case CK_RightBracket:
1670c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  case CK_LeftBrace:
1680c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  case CK_RightBrace:
1690c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  case CK_LeftAngle:
1700c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  case CK_RightAngle:
1710c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  case CK_Comma:
1720563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor    break;
173e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor  }
174e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor}
175e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor
176e6e0361984b077d205e9a45d64257d41d2c788c8Douglas GregorCodeCompletionString::~CodeCompletionString() {
177e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor  std::for_each(Chunks.begin(), Chunks.end(),
178e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor                std::mem_fun_ref(&Chunk::Destroy));
179e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor}
180e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor
181e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregorstd::string CodeCompletionString::getAsString() const {
182e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor  std::string Result;
183e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor  llvm::raw_string_ostream OS(Result);
184e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor
185e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor  for (iterator C = begin(), CEnd = end(); C != CEnd; ++C) {
186e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor    switch (C->Kind) {
187e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor    case CK_Optional: OS << "{#" << C->Optional->getAsString() << "#}"; break;
1880563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor    case CK_Placeholder: OS << "<#" << C->Text << "#>"; break;
1890563c2677cfc20c9450342ddc53aa96971671c71Douglas Gregor    case CK_Informative: OS << "[#" << C->Text << "#]"; break;
1900c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    case CK_CurrentParameter: OS << "<#" << C->Text << "#>"; break;
1910c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    default: OS << C->Text; break;
192e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor    }
193e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor  }
194e2b7eea99c0e20fd4712e374c4094a957c236953Douglas Gregor  OS.flush();
195e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor  return Result;
196e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor}
197e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor
19854f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregorconst char *CodeCompletionString::getTypedText() const {
19954f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor  for (iterator C = begin(), CEnd = end(); C != CEnd; ++C)
20054f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor    if (C->Kind == CK_TypedText)
20154f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor      return C->Text;
20254f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor
20354f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor  return 0;
20454f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor}
20554f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor
20654f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas GregorCodeCompletionString *CodeCompletionString::Clone() const {
20754f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor  CodeCompletionString *Result = new CodeCompletionString;
20854f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor  for (iterator C = begin(), CEnd = end(); C != CEnd; ++C)
20954f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor    Result->AddChunk(C->Clone());
21054f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor  return Result;
21154f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor}
2120c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor
2132b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregorstatic void WriteUnsigned(llvm::raw_ostream &OS, unsigned Value) {
2142b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor  OS.write((const char *)&Value, sizeof(unsigned));
2152b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor}
2160c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor
2172b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregorstatic bool ReadUnsigned(const char *&Memory, const char *MemoryEnd,
2182b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor                         unsigned &Value) {
2192b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor  if (Memory + sizeof(unsigned) > MemoryEnd)
2202b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor    return true;
2212b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor
2222b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor  memmove(&Value, Memory, sizeof(unsigned));
2232b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor  Memory += sizeof(unsigned);
2242b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor  return false;
2250c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor}
2260c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor
2270c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregorvoid CodeCompletionString::Serialize(llvm::raw_ostream &OS) const {
2282b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor  // Write the number of chunks.
2292b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor  WriteUnsigned(OS, size());
2302b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor
2310c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  for (iterator C = begin(), CEnd = end(); C != CEnd; ++C) {
2322b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor    WriteUnsigned(OS, C->Kind);
2332b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor
2340c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    switch (C->Kind) {
2350c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    case CK_TypedText:
2360c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    case CK_Text:
2370c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    case CK_Placeholder:
2380c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    case CK_Informative:
2392b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor    case CK_CurrentParameter: {
2402b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor      const char *Text = C->Text;
2412b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor      unsigned StrLen = strlen(Text);
2422b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor      WriteUnsigned(OS, StrLen);
2432b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor      OS.write(Text, StrLen);
2440c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor      break;
2452b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor    }
2462b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor
2472b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor    case CK_Optional:
2482b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor      C->Optional->Serialize(OS);
2490c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor      break;
2502b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor
2510c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    case CK_LeftParen:
2520c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    case CK_RightParen:
2530c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    case CK_LeftBracket:
2540c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    case CK_RightBracket:
2550c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    case CK_LeftBrace:
2560c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    case CK_RightBrace:
2570c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    case CK_LeftAngle:
2580c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    case CK_RightAngle:
2590c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    case CK_Comma:
2600c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor      break;
2612b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor    }
2620c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  }
2630c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor}
2640c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor
2652b4074f1d3919e77cb33ca49c960521dea27afabDouglas GregorCodeCompletionString *CodeCompletionString::Deserialize(const char *&Str,
2662b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor                                                        const char *StrEnd) {
2672b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor  if (Str == StrEnd || *Str == 0)
2682b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor    return 0;
2690c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor
2700c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  CodeCompletionString *Result = new CodeCompletionString;
2712b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor  unsigned NumBlocks;
2722b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor  if (ReadUnsigned(Str, StrEnd, NumBlocks))
2732b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor    return Result;
2742b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor
2752b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor  for (unsigned I = 0; I != NumBlocks; ++I) {
2762b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor    if (Str + 1 >= StrEnd)
2770c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor      break;
2782b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor
2792b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor    // Parse the next kind.
2802b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor    unsigned KindValue;
2812b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor    if (ReadUnsigned(Str, StrEnd, KindValue))
2822b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor      return Result;
2832b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor
2842b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor    switch (ChunkKind Kind = (ChunkKind)KindValue) {
2852b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor    case CK_TypedText:
2862b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor    case CK_Text:
2872b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor    case CK_Placeholder:
2882b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor    case CK_Informative:
2892b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor    case CK_CurrentParameter: {
2902b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor      unsigned StrLen;
2912b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor      if (ReadUnsigned(Str, StrEnd, StrLen) || (Str + StrLen > StrEnd))
2922b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor        return Result;
2932b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor
2942b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor      Result->AddChunk(Chunk(Kind, StringRef(Str, StrLen)));
2952b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor      Str += StrLen;
2960c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor      break;
2970c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    }
2982b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor
2992b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor    case CK_Optional: {
3002b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor      std::auto_ptr<CodeCompletionString> Optional(Deserialize(Str, StrEnd));
3010c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor      Result->AddOptionalChunk(Optional);
3022b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor      break;
3030c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    }
3042b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor
3052b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor    case CK_LeftParen:
3062b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor    case CK_RightParen:
3072b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor    case CK_LeftBracket:
3082b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor    case CK_RightBracket:
3092b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor    case CK_LeftBrace:
3102b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor    case CK_RightBrace:
3112b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor    case CK_LeftAngle:
3122b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor    case CK_RightAngle:
3132b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor    case CK_Comma:
3142b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor      Result->AddChunk(Chunk(Kind));
3152b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor      break;
3160c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    }
3172b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor  };
3180c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor
3190c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  return Result;
3200c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor}
3210c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor
32254f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregorvoid CodeCompleteConsumer::Result::Destroy() {
32354f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor  if (Kind == RK_Pattern) {
32454f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor    delete Pattern;
32554f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor    Pattern = 0;
32654f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor  }
32754f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor}
32854f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor
329e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor//===----------------------------------------------------------------------===//
3300594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor// Code completion overload candidate implementation
3310594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor//===----------------------------------------------------------------------===//
3320594438e06f58ab3798416324780ab39ca9c8f54Douglas GregorFunctionDecl *
3330594438e06f58ab3798416324780ab39ca9c8f54Douglas GregorCodeCompleteConsumer::OverloadCandidate::getFunction() const {
3340594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor  if (getKind() == CK_Function)
3350594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor    return Function;
3360594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor  else if (getKind() == CK_FunctionTemplate)
3370594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor    return FunctionTemplate->getTemplatedDecl();
3380594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor  else
3390594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor    return 0;
3400594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor}
3410594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor
3420594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregorconst FunctionType *
3430594438e06f58ab3798416324780ab39ca9c8f54Douglas GregorCodeCompleteConsumer::OverloadCandidate::getFunctionType() const {
3440594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor  switch (Kind) {
3450594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor  case CK_Function:
3460594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor    return Function->getType()->getAs<FunctionType>();
3470594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor
3480594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor  case CK_FunctionTemplate:
3490594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor    return FunctionTemplate->getTemplatedDecl()->getType()
3500594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor             ->getAs<FunctionType>();
3510594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor
3520594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor  case CK_FunctionType:
3530594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor    return Type;
3540594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor  }
3550594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor
3560594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor  return 0;
3570594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor}
3580594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor
3590594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor//===----------------------------------------------------------------------===//
360e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor// Code completion consumer implementation
361e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor//===----------------------------------------------------------------------===//
362e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor
36386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas GregorCodeCompleteConsumer::~CodeCompleteConsumer() { }
364e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor
36581b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregorvoid
3663a2838d14251427089c39caec90c8abbc27f7a14Daniel DunbarPrintingCodeCompleteConsumer::ProcessCodeCompleteResults(Sema &SemaRef,
3673a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar                                                         Result *Results,
36881b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor                                                         unsigned NumResults) {
36981b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor  // Print the results.
37081b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor  for (unsigned I = 0; I != NumResults; ++I) {
371f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor    OS << "COMPLETION: ";
37281b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor    switch (Results[I].Kind) {
37381b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor    case Result::RK_Declaration:
37481b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor      OS << Results[I].Declaration->getNameAsString() << " : "
37581b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor         << Results[I].Rank;
37681b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor      if (Results[I].Hidden)
37781b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor        OS << " (Hidden)";
37886d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor      if (CodeCompletionString *CCS
37986d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor            = Results[I].CreateCodeCompletionString(SemaRef)) {
380e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor        OS << " : " << CCS->getAsString();
381e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor        delete CCS;
382e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor      }
383e6e0361984b077d205e9a45d64257d41d2c788c8Douglas Gregor
38481b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor      OS << '\n';
38581b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor      break;
38681b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor
38781b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor    case Result::RK_Keyword:
38881b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor      OS << Results[I].Keyword << " : " << Results[I].Rank << '\n';
38981b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor      break;
3903f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor
3913f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor    case Result::RK_Macro: {
3923f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor      OS << Results[I].Macro->getName() << " : " << Results[I].Rank;
3933f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor      if (CodeCompletionString *CCS
3943f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor          = Results[I].CreateCodeCompletionString(SemaRef)) {
3953f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor        OS << " : " << CCS->getAsString();
3963f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor        delete CCS;
3973f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor      }
3983f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor      OS << '\n';
3993f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor      break;
4003f7c7f48654230d8e379214cfe49fcf2fde0a2c6Douglas Gregor    }
40154f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor
40254f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor    case Result::RK_Pattern: {
40354f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor      OS << "Pattern : " << Results[I].Rank << " : "
40454f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor         << Results[I].Pattern->getAsString() << '\n';
40554f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor      break;
40654f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor    }
40781b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor    }
40881b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor  }
40981b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor
41081b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor  // Once we've printed the code-completion results, suppress remaining
41181b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor  // diagnostics.
41281b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor  // FIXME: Move this somewhere else!
41386d9a52c24d390631a888d4ff812e1b15445e0a0Douglas Gregor  SemaRef.PP.getDiagnostics().setSuppressAllDiagnostics();
41481b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor}
4150594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor
4160594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregorvoid
4173a2838d14251427089c39caec90c8abbc27f7a14Daniel DunbarPrintingCodeCompleteConsumer::ProcessOverloadCandidates(Sema &SemaRef,
4183a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar                                                        unsigned CurrentArg,
4190594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor                                              OverloadCandidate *Candidates,
4200594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor                                                     unsigned NumCandidates) {
4210594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor  for (unsigned I = 0; I != NumCandidates; ++I) {
42286d802e03a267af79663990c39865c67e0645238Douglas Gregor    if (CodeCompletionString *CCS
42386d802e03a267af79663990c39865c67e0645238Douglas Gregor          = Candidates[I].CreateSignatureString(CurrentArg, SemaRef)) {
424f52cedee8701dca77bcbba5c705b6e388680ae56Douglas Gregor      OS << "OVERLOAD: " << CCS->getAsString() << "\n";
42586d802e03a267af79663990c39865c67e0645238Douglas Gregor      delete CCS;
4260594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor    }
4270594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor  }
4280594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor
4290594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor  // Once we've printed the code-completion results, suppress remaining
4300594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor  // diagnostics.
4310594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor  // FIXME: Move this somewhere else!
4320594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor  SemaRef.PP.getDiagnostics().setSuppressAllDiagnostics();
4330594438e06f58ab3798416324780ab39ca9c8f54Douglas Gregor}
4340c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor
4350c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregorvoid
4363a2838d14251427089c39caec90c8abbc27f7a14Daniel DunbarCIndexCodeCompleteConsumer::ProcessCodeCompleteResults(Sema &SemaRef,
4373a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar                                                       Result *Results,
4380c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor                                                       unsigned NumResults) {
4390c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  // Print the results.
4400c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  for (unsigned I = 0; I != NumResults; ++I) {
4412b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor    CXCursorKind Kind = CXCursor_NotImplemented;
4422b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor
4430c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    switch (Results[I].Kind) {
4442b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor    case Result::RK_Declaration:
4452b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor      switch (Results[I].Declaration->getKind()) {
4462b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor      case Decl::Record:
4472b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor      case Decl::CXXRecord:
4482b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor      case Decl::ClassTemplateSpecialization: {
4492b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor        RecordDecl *Record = cast<RecordDecl>(Results[I].Declaration);
4502b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor        if (Record->isStruct())
4512b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor          Kind = CXCursor_StructDecl;
4522b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor        else if (Record->isUnion())
4532b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor          Kind = CXCursor_UnionDecl;
4542b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor        else
4552b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor          Kind = CXCursor_ClassDecl;
4562b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor        break;
4572b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor      }
4582b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor
4592b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor      case Decl::ObjCMethod: {
4602b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor        ObjCMethodDecl *Method = cast<ObjCMethodDecl>(Results[I].Declaration);
4612b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor        if (Method->isInstanceMethod())
4622b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor            Kind = CXCursor_ObjCInstanceMethodDecl;
4632b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor        else
4642b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor          Kind = CXCursor_ObjCClassMethodDecl;
4652b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor        break;
4662b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor      }
4670c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor
4682b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor      case Decl::Typedef:
4692b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor        Kind = CXCursor_TypedefDecl;
4700c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor        break;
4710c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor
4722b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor      case Decl::Enum:
4732b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor        Kind = CXCursor_EnumDecl;
4740c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor        break;
4750c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor
4762b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor      case Decl::Field:
4772b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor        Kind = CXCursor_FieldDecl;
4782b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor        break;
4792b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor
4802b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor      case Decl::EnumConstant:
4812b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor        Kind = CXCursor_EnumConstantDecl;
4822b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor        break;
4832b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor
4842b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor      case Decl::Function:
4852b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor      case Decl::CXXMethod:
4862b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor      case Decl::CXXConstructor:
4872b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor      case Decl::CXXDestructor:
4882b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor      case Decl::CXXConversion:
4892b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor        Kind = CXCursor_FunctionDecl;
4902b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor        break;
4912b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor
4922b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor      case Decl::Var:
4932b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor        Kind = CXCursor_VarDecl;
4942b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor        break;
4952b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor
4962b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor      case Decl::ParmVar:
4972b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor        Kind = CXCursor_ParmDecl;
4982b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor        break;
4992b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor
5002b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor      case Decl::ObjCInterface:
5012b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor        Kind = CXCursor_ObjCInterfaceDecl;
5022b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor        break;
5032b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor
5042b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor      case Decl::ObjCCategory:
5052b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor        Kind = CXCursor_ObjCCategoryDecl;
5062b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor        break;
5072b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor
5082b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor      case Decl::ObjCProtocol:
5092b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor        Kind = CXCursor_ObjCProtocolDecl;
5100c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor        break;
51154f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor
5122b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor      case Decl::ObjCProperty:
5132b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor        Kind = CXCursor_ObjCPropertyDecl;
5142b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor        break;
5152b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor
5162b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor      case Decl::ObjCIvar:
5172b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor        Kind = CXCursor_ObjCIvarDecl;
5182b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor        break;
5192b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor
5202b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor      case Decl::ObjCImplementation:
5212b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor        Kind = CXCursor_ObjCClassDefn;
5222b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor        break;
5232b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor
5242b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor      case Decl::ObjCCategoryImpl:
5252b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor        Kind = CXCursor_ObjCCategoryDefn;
5262b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor        break;
5272b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor
5282b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor      default:
52954f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor        break;
53054f016150acf7e0d4dab702d3d7d5e40ba1fdebfDouglas Gregor      }
5312b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor      break;
5322b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor
5332b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor    case Result::RK_Keyword:
5342b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor    case Result::RK_Macro:
5352b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor    case Result::RK_Pattern:
5362b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor      Kind = CXCursor_NotImplemented;
5372b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor      break;
5380c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor    }
5392b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor
5402b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor    WriteUnsigned(OS, Kind);
5412b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor    CodeCompletionString *CCS = Results[I].CreateCodeCompletionString(SemaRef);
5422b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor    assert(CCS && "No code-completion string?");
5432b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor    CCS->Serialize(OS);
5442b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor    delete CCS;
5450c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  }
5460c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor
5470c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  // Once we've printed the code-completion results, suppress remaining
5480c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  // diagnostics.
5490c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  // FIXME: Move this somewhere else!
5500c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  SemaRef.PP.getDiagnostics().setSuppressAllDiagnostics();
5510c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor}
5520c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor
5530c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregorvoid
5543a2838d14251427089c39caec90c8abbc27f7a14Daniel DunbarCIndexCodeCompleteConsumer::ProcessOverloadCandidates(Sema &SemaRef,
5553a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar                                                      unsigned CurrentArg,
5560c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor                                                OverloadCandidate *Candidates,
5570c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor                                                       unsigned NumCandidates) {
5580c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  for (unsigned I = 0; I != NumCandidates; ++I) {
5592b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor    WriteUnsigned(OS, CXCursor_NotImplemented);
5602b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor    CodeCompletionString *CCS
5612b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor      = Candidates[I].CreateSignatureString(CurrentArg, SemaRef);
5622b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor    assert(CCS && "No code-completion string?");
5632b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor    CCS->Serialize(OS);
5642b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor    delete CCS;
5650c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  }
5660c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor
5670c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  // Once we've printed the code-completion results, suppress remaining
5680c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  // diagnostics.
5690c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  // FIXME: Move this somewhere else!
5700c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor  SemaRef.PP.getDiagnostics().setSuppressAllDiagnostics();
5710c8296dfb495f41d6f0de6fe1d03014ffd063674Douglas Gregor}
572