CodeCompleteConsumer.cpp revision e8d7bebc0dd037516dd695ee1ac2eb0923753b46
1afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner//===--- CodeCompleteConsumer.cpp - Code Completion Interface ---*- C++ -*-===//
27c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell//
37c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell//                     The LLVM Compiler Infrastructure
47c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell//
57c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell// This file is distributed under the University of Illinois Open Source
67c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell// License. See LICENSE.TXT for details.
77c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell//
87c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell//===----------------------------------------------------------------------===//
9afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner//
10afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner//  This file implements the CodeCompleteConsumer class.
11afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner//
12afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner//===----------------------------------------------------------------------===//
13afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner#include "clang/Sema/CodeCompleteConsumer.h"
14afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner#include "clang/Sema/Scope.h"
15afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner#include "clang/Sema/Sema.h"
16e49603d79d220a795bd50684c8b1f503ee40f97fMisha Brukman#include "clang/AST/DeclCXX.h"
17afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner#include "clang/AST/DeclObjC.h"
18afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner#include "clang/AST/DeclTemplate.h"
19d1a85a744cc1001c2b7fc37cf37aca266964f519Brian Gaeke#include "clang/Lex/Preprocessor.h"
20e49603d79d220a795bd50684c8b1f503ee40f97fMisha Brukman#include "clang-c/Index.h"
21e49603d79d220a795bd50684c8b1f503ee40f97fMisha Brukman#include "llvm/ADT/STLExtras.h"
22afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner#include "llvm/Support/raw_ostream.h"
236520785dcd22012535934098942d57c07c7631c2Chris Lattner#include <algorithm>
24afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner#include <cstring>
255da69c79f9c4490c6657c207430dfeb1060fc4ddChris Lattner#include <functional>
266db70ef879916e6115ac97eb76e4fea973652e2cChris Lattner
27be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattnerusing namespace clang;
281b747167daf07a98f0ec33144b257c987c60e11dChris Lattnerusing llvm::StringRef;
29c6b519d64ef55d39e66a49510d4703a49bf228ccChris Lattner
30d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke//===----------------------------------------------------------------------===//
31d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke// Code completion string implementation
32c6b519d64ef55d39e66a49510d4703a49bf228ccChris Lattner//===----------------------------------------------------------------------===//
33d0fde30ce850b78371fd1386338350591f9ff494Brian GaekeCodeCompletionString::Chunk::Chunk(ChunkKind Kind, llvm::StringRef Text)
34d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke  : Kind(Kind), Text("")
356db70ef879916e6115ac97eb76e4fea973652e2cChris Lattner{
366db70ef879916e6115ac97eb76e4fea973652e2cChris Lattner  switch (Kind) {
376db70ef879916e6115ac97eb76e4fea973652e2cChris Lattner  case CK_TypedText:
386db70ef879916e6115ac97eb76e4fea973652e2cChris Lattner  case CK_Text:
3947ae4a1cee5eec5767a11403c0fac7c91ec45461Chris Lattner  case CK_Placeholder:
4047ae4a1cee5eec5767a11403c0fac7c91ec45461Chris Lattner  case CK_Informative:
416db70ef879916e6115ac97eb76e4fea973652e2cChris Lattner  case CK_ResultType:
426db70ef879916e6115ac97eb76e4fea973652e2cChris Lattner  case CK_CurrentParameter: {
43afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner    char *New = new char [Text.size() + 1];
446520785dcd22012535934098942d57c07c7631c2Chris Lattner    std::memcpy(New, Text.data(), Text.size());
456520785dcd22012535934098942d57c07c7631c2Chris Lattner    New[Text.size()] = '\0';
466520785dcd22012535934098942d57c07c7631c2Chris Lattner    this->Text = New;
476520785dcd22012535934098942d57c07c7631c2Chris Lattner    break;
486520785dcd22012535934098942d57c07c7631c2Chris Lattner  }
490cc8807029f577996a442b96d24c3346ed6de091Chris Lattner
506520785dcd22012535934098942d57c07c7631c2Chris Lattner  case CK_Optional:
516520785dcd22012535934098942d57c07c7631c2Chris Lattner    llvm_unreachable("Optional strings cannot be created from text");
526520785dcd22012535934098942d57c07c7631c2Chris Lattner    break;
530cc8807029f577996a442b96d24c3346ed6de091Chris Lattner
540cc8807029f577996a442b96d24c3346ed6de091Chris Lattner  case CK_LeftParen:
556520785dcd22012535934098942d57c07c7631c2Chris Lattner    this->Text = "(";
566520785dcd22012535934098942d57c07c7631c2Chris Lattner    break;
570cc8807029f577996a442b96d24c3346ed6de091Chris Lattner
580cc8807029f577996a442b96d24c3346ed6de091Chris Lattner  case CK_RightParen:
596520785dcd22012535934098942d57c07c7631c2Chris Lattner    this->Text = ")";
606520785dcd22012535934098942d57c07c7631c2Chris Lattner    break;
610cc8807029f577996a442b96d24c3346ed6de091Chris Lattner
626520785dcd22012535934098942d57c07c7631c2Chris Lattner  case CK_LeftBracket:
636520785dcd22012535934098942d57c07c7631c2Chris Lattner    this->Text = "[";
640cc8807029f577996a442b96d24c3346ed6de091Chris Lattner    break;
650cc8807029f577996a442b96d24c3346ed6de091Chris Lattner
666520785dcd22012535934098942d57c07c7631c2Chris Lattner  case CK_RightBracket:
676520785dcd22012535934098942d57c07c7631c2Chris Lattner    this->Text = "]";
680cc8807029f577996a442b96d24c3346ed6de091Chris Lattner    break;
690cc8807029f577996a442b96d24c3346ed6de091Chris Lattner
706520785dcd22012535934098942d57c07c7631c2Chris Lattner  case CK_LeftBrace:
716520785dcd22012535934098942d57c07c7631c2Chris Lattner    this->Text = "{";
720cc8807029f577996a442b96d24c3346ed6de091Chris Lattner    break;
736520785dcd22012535934098942d57c07c7631c2Chris Lattner
7444be25716628941b4cccccf56a28ee0ba2606850Chris Lattner  case CK_RightBrace:
756520785dcd22012535934098942d57c07c7631c2Chris Lattner    this->Text = "}";
765da69c79f9c4490c6657c207430dfeb1060fc4ddChris Lattner    break;
775da69c79f9c4490c6657c207430dfeb1060fc4ddChris Lattner
785da69c79f9c4490c6657c207430dfeb1060fc4ddChris Lattner  case CK_LeftAngle:
796db70ef879916e6115ac97eb76e4fea973652e2cChris Lattner    this->Text = "<";
806520785dcd22012535934098942d57c07c7631c2Chris Lattner    break;
8147ae4a1cee5eec5767a11403c0fac7c91ec45461Chris Lattner
826520785dcd22012535934098942d57c07c7631c2Chris Lattner  case CK_RightAngle:
8310f22cb1a0f2755050218cd0e07221a0985c6b63Chris Lattner    this->Text = ">";
8410f22cb1a0f2755050218cd0e07221a0985c6b63Chris Lattner    break;
856520785dcd22012535934098942d57c07c7631c2Chris Lattner
866520785dcd22012535934098942d57c07c7631c2Chris Lattner  case CK_Comma:
876520785dcd22012535934098942d57c07c7631c2Chris Lattner    this->Text = ", ";
88ba386d943f4a83095d9c625cb0d46c1afe45ed1fChris Lattner    break;
89fcb6ec0c7e37c2d15ddb04878f05cbd69d1da036Chris Lattner
90fcb6ec0c7e37c2d15ddb04878f05cbd69d1da036Chris Lattner  case CK_Colon:
91fcb6ec0c7e37c2d15ddb04878f05cbd69d1da036Chris Lattner    this->Text = ":";
92fcb6ec0c7e37c2d15ddb04878f05cbd69d1da036Chris Lattner    break;
93fcb6ec0c7e37c2d15ddb04878f05cbd69d1da036Chris Lattner
94fcb6ec0c7e37c2d15ddb04878f05cbd69d1da036Chris Lattner  case CK_SemiColon:
95ba386d943f4a83095d9c625cb0d46c1afe45ed1fChris Lattner    this->Text = ";";
96ba386d943f4a83095d9c625cb0d46c1afe45ed1fChris Lattner    break;
97ba386d943f4a83095d9c625cb0d46c1afe45ed1fChris Lattner
98ba386d943f4a83095d9c625cb0d46c1afe45ed1fChris Lattner  case CK_Equal:
99fcb6ec0c7e37c2d15ddb04878f05cbd69d1da036Chris Lattner    this->Text = " = ";
10028b8ed90c75ce6c271500fa778fef252f267a5ffChris Lattner    break;
10128b8ed90c75ce6c271500fa778fef252f267a5ffChris Lattner
10228b8ed90c75ce6c271500fa778fef252f267a5ffChris Lattner  case CK_HorizontalSpace:
103dbe48dcaec69ff78e39e2d5faf4323ade6fffb04Chris Lattner    this->Text = " ";
104fcb6ec0c7e37c2d15ddb04878f05cbd69d1da036Chris Lattner    break;
105fcb6ec0c7e37c2d15ddb04878f05cbd69d1da036Chris Lattner
106fcb6ec0c7e37c2d15ddb04878f05cbd69d1da036Chris Lattner  case CK_VerticalSpace:
107fcb6ec0c7e37c2d15ddb04878f05cbd69d1da036Chris Lattner    this->Text = "\n";
108fcb6ec0c7e37c2d15ddb04878f05cbd69d1da036Chris Lattner    break;
109c6b519d64ef55d39e66a49510d4703a49bf228ccChris Lattner  }
110c6b519d64ef55d39e66a49510d4703a49bf228ccChris Lattner}
111c6b519d64ef55d39e66a49510d4703a49bf228ccChris Lattner
112c6b519d64ef55d39e66a49510d4703a49bf228ccChris LattnerCodeCompletionString::Chunk
113c6b519d64ef55d39e66a49510d4703a49bf228ccChris LattnerCodeCompletionString::Chunk::CreateText(StringRef Text) {
114fcb6ec0c7e37c2d15ddb04878f05cbd69d1da036Chris Lattner  return Chunk(CK_Text, Text);
115fcb6ec0c7e37c2d15ddb04878f05cbd69d1da036Chris Lattner}
116fcb6ec0c7e37c2d15ddb04878f05cbd69d1da036Chris Lattner
117fcb6ec0c7e37c2d15ddb04878f05cbd69d1da036Chris LattnerCodeCompletionString::Chunk
118fcb6ec0c7e37c2d15ddb04878f05cbd69d1da036Chris LattnerCodeCompletionString::Chunk::CreateOptional(
119fcb6ec0c7e37c2d15ddb04878f05cbd69d1da036Chris Lattner                                 std::auto_ptr<CodeCompletionString> Optional) {
1207546c3884a400b72d10fc19f120c6798b294a39dChris Lattner  Chunk Result;
121fcb6ec0c7e37c2d15ddb04878f05cbd69d1da036Chris Lattner  Result.Kind = CK_Optional;
122fcb6ec0c7e37c2d15ddb04878f05cbd69d1da036Chris Lattner  Result.Optional = Optional.release();
123fcb6ec0c7e37c2d15ddb04878f05cbd69d1da036Chris Lattner  return Result;
124fcb6ec0c7e37c2d15ddb04878f05cbd69d1da036Chris Lattner}
125fcb6ec0c7e37c2d15ddb04878f05cbd69d1da036Chris Lattner
126fcb6ec0c7e37c2d15ddb04878f05cbd69d1da036Chris LattnerCodeCompletionString::Chunk
127fcb6ec0c7e37c2d15ddb04878f05cbd69d1da036Chris LattnerCodeCompletionString::Chunk::CreatePlaceholder(StringRef Placeholder) {
128fcb6ec0c7e37c2d15ddb04878f05cbd69d1da036Chris Lattner  return Chunk(CK_Placeholder, Placeholder);
1291b747167daf07a98f0ec33144b257c987c60e11dChris Lattner}
130fcb6ec0c7e37c2d15ddb04878f05cbd69d1da036Chris Lattner
131fcb6ec0c7e37c2d15ddb04878f05cbd69d1da036Chris LattnerCodeCompletionString::Chunk
132ba386d943f4a83095d9c625cb0d46c1afe45ed1fChris LattnerCodeCompletionString::Chunk::CreateInformative(StringRef Informative) {
133be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner  return Chunk(CK_Informative, Informative);
134be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner}
1357546c3884a400b72d10fc19f120c6798b294a39dChris Lattner
1367546c3884a400b72d10fc19f120c6798b294a39dChris LattnerCodeCompletionString::Chunk
1377546c3884a400b72d10fc19f120c6798b294a39dChris LattnerCodeCompletionString::Chunk::CreateResultType(StringRef ResultType) {
1387546c3884a400b72d10fc19f120c6798b294a39dChris Lattner  return Chunk(CK_ResultType, ResultType);
1397546c3884a400b72d10fc19f120c6798b294a39dChris Lattner}
1407546c3884a400b72d10fc19f120c6798b294a39dChris Lattner
1417546c3884a400b72d10fc19f120c6798b294a39dChris LattnerCodeCompletionString::Chunk
1427546c3884a400b72d10fc19f120c6798b294a39dChris LattnerCodeCompletionString::Chunk::CreateCurrentParameter(
1437546c3884a400b72d10fc19f120c6798b294a39dChris Lattner                                                StringRef CurrentParameter) {
1447546c3884a400b72d10fc19f120c6798b294a39dChris Lattner  return Chunk(CK_CurrentParameter, CurrentParameter);
1457546c3884a400b72d10fc19f120c6798b294a39dChris Lattner}
1467546c3884a400b72d10fc19f120c6798b294a39dChris Lattner
1477546c3884a400b72d10fc19f120c6798b294a39dChris LattnerCodeCompletionString::Chunk CodeCompletionString::Chunk::Clone() const {
1487546c3884a400b72d10fc19f120c6798b294a39dChris Lattner  switch (Kind) {
1497546c3884a400b72d10fc19f120c6798b294a39dChris Lattner  case CK_TypedText:
1507546c3884a400b72d10fc19f120c6798b294a39dChris Lattner  case CK_Text:
1517546c3884a400b72d10fc19f120c6798b294a39dChris Lattner  case CK_Placeholder:
1527546c3884a400b72d10fc19f120c6798b294a39dChris Lattner  case CK_Informative:
1537546c3884a400b72d10fc19f120c6798b294a39dChris Lattner  case CK_ResultType:
1547546c3884a400b72d10fc19f120c6798b294a39dChris Lattner  case CK_CurrentParameter:
1557546c3884a400b72d10fc19f120c6798b294a39dChris Lattner  case CK_LeftParen:
1567546c3884a400b72d10fc19f120c6798b294a39dChris Lattner  case CK_RightParen:
1577546c3884a400b72d10fc19f120c6798b294a39dChris Lattner  case CK_LeftBracket:
1587546c3884a400b72d10fc19f120c6798b294a39dChris Lattner  case CK_RightBracket:
1597546c3884a400b72d10fc19f120c6798b294a39dChris Lattner  case CK_LeftBrace:
1607546c3884a400b72d10fc19f120c6798b294a39dChris Lattner  case CK_RightBrace:
1617546c3884a400b72d10fc19f120c6798b294a39dChris Lattner  case CK_LeftAngle:
1627546c3884a400b72d10fc19f120c6798b294a39dChris Lattner  case CK_RightAngle:
1637546c3884a400b72d10fc19f120c6798b294a39dChris Lattner  case CK_Comma:
1647546c3884a400b72d10fc19f120c6798b294a39dChris Lattner  case CK_Colon:
1657546c3884a400b72d10fc19f120c6798b294a39dChris Lattner  case CK_SemiColon:
1667546c3884a400b72d10fc19f120c6798b294a39dChris Lattner  case CK_Equal:
1677546c3884a400b72d10fc19f120c6798b294a39dChris Lattner  case CK_HorizontalSpace:
1687546c3884a400b72d10fc19f120c6798b294a39dChris Lattner  case CK_VerticalSpace:
1697546c3884a400b72d10fc19f120c6798b294a39dChris Lattner    return Chunk(Kind, Text);
1707546c3884a400b72d10fc19f120c6798b294a39dChris Lattner
171be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner  case CK_Optional: {
172be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner    std::auto_ptr<CodeCompletionString> Opt(Optional->Clone());
173be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner    return CreateOptional(Opt);
174be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner  }
175be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner  }
176be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner
177be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner  // Silence GCC warning.
178be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner  return Chunk();
179be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner}
180be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner
181be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattnervoid
182be21ca54e08339ede5dd4bbb882182d22e274988Chris LattnerCodeCompletionString::Chunk::Destroy() {
1835eda1f2f65941a24ef9a5a85addf4d90eb13fa9dChris Lattner  switch (Kind) {
1845eda1f2f65941a24ef9a5a85addf4d90eb13fa9dChris Lattner  case CK_Optional:
1855eda1f2f65941a24ef9a5a85addf4d90eb13fa9dChris Lattner    delete Optional;
1865eda1f2f65941a24ef9a5a85addf4d90eb13fa9dChris Lattner    break;
1875eda1f2f65941a24ef9a5a85addf4d90eb13fa9dChris Lattner
188be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner  case CK_TypedText:
189be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner  case CK_Text:
190be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner  case CK_Placeholder:
191be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner  case CK_Informative:
192be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner  case CK_ResultType:
193be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner  case CK_CurrentParameter:
194be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner    delete [] Text;
195be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner    break;
196be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner
197be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner  case CK_LeftParen:
198be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner  case CK_RightParen:
199be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner  case CK_LeftBracket:
200be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner  case CK_RightBracket:
201be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner  case CK_LeftBrace:
202be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner  case CK_RightBrace:
203be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner  case CK_LeftAngle:
204be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner  case CK_RightAngle:
205be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner  case CK_Comma:
206be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner  case CK_Colon:
207be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner  case CK_SemiColon:
208be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner  case CK_Equal:
209be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner  case CK_HorizontalSpace:
210be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner  case CK_VerticalSpace:
211be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner    break;
212be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner  }
213be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner}
214be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner
215be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattnervoid CodeCompletionString::clear() {
216be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner  std::for_each(Chunks.begin(), Chunks.end(),
217be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner                std::mem_fun_ref(&Chunk::Destroy));
218be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner  Chunks.clear();
219be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner}
220be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner
221be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattnerstd::string CodeCompletionString::getAsString() const {
222be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner  std::string Result;
223  llvm::raw_string_ostream OS(Result);
224
225  for (iterator C = begin(), CEnd = end(); C != CEnd; ++C) {
226    switch (C->Kind) {
227    case CK_Optional: OS << "{#" << C->Optional->getAsString() << "#}"; break;
228    case CK_Placeholder: OS << "<#" << C->Text << "#>"; break;
229
230    case CK_Informative:
231    case CK_ResultType:
232      OS << "[#" << C->Text << "#]";
233      break;
234
235    case CK_CurrentParameter: OS << "<#" << C->Text << "#>"; break;
236    default: OS << C->Text; break;
237    }
238  }
239  return OS.str();
240}
241
242const char *CodeCompletionString::getTypedText() const {
243  for (iterator C = begin(), CEnd = end(); C != CEnd; ++C)
244    if (C->Kind == CK_TypedText)
245      return C->Text;
246
247  return 0;
248}
249
250CodeCompletionString *
251CodeCompletionString::Clone(CodeCompletionString *Result) const {
252  if (!Result)
253    Result = new CodeCompletionString;
254  for (iterator C = begin(), CEnd = end(); C != CEnd; ++C)
255    Result->AddChunk(C->Clone());
256  return Result;
257}
258
259static void WriteUnsigned(llvm::raw_ostream &OS, unsigned Value) {
260  OS.write((const char *)&Value, sizeof(unsigned));
261}
262
263static bool ReadUnsigned(const char *&Memory, const char *MemoryEnd,
264                         unsigned &Value) {
265  if (Memory + sizeof(unsigned) > MemoryEnd)
266    return true;
267
268  memmove(&Value, Memory, sizeof(unsigned));
269  Memory += sizeof(unsigned);
270  return false;
271}
272
273void CodeCompletionString::Serialize(llvm::raw_ostream &OS) const {
274  // Write the number of chunks.
275  WriteUnsigned(OS, size());
276
277  for (iterator C = begin(), CEnd = end(); C != CEnd; ++C) {
278    WriteUnsigned(OS, C->Kind);
279
280    switch (C->Kind) {
281    case CK_TypedText:
282    case CK_Text:
283    case CK_Placeholder:
284    case CK_Informative:
285    case CK_ResultType:
286    case CK_CurrentParameter: {
287      const char *Text = C->Text;
288      unsigned StrLen = strlen(Text);
289      WriteUnsigned(OS, StrLen);
290      OS.write(Text, StrLen);
291      break;
292    }
293
294    case CK_Optional:
295      C->Optional->Serialize(OS);
296      break;
297
298    case CK_LeftParen:
299    case CK_RightParen:
300    case CK_LeftBracket:
301    case CK_RightBracket:
302    case CK_LeftBrace:
303    case CK_RightBrace:
304    case CK_LeftAngle:
305    case CK_RightAngle:
306    case CK_Comma:
307    case CK_Colon:
308    case CK_SemiColon:
309    case CK_Equal:
310    case CK_HorizontalSpace:
311    case CK_VerticalSpace:
312      break;
313    }
314  }
315}
316
317bool CodeCompletionString::Deserialize(const char *&Str, const char *StrEnd) {
318  if (Str == StrEnd || *Str == 0)
319    return false;
320
321  unsigned NumBlocks;
322  if (ReadUnsigned(Str, StrEnd, NumBlocks))
323    return false;
324
325  for (unsigned I = 0; I != NumBlocks; ++I) {
326    if (Str + 1 >= StrEnd)
327      break;
328
329    // Parse the next kind.
330    unsigned KindValue;
331    if (ReadUnsigned(Str, StrEnd, KindValue))
332      return false;
333
334    switch (ChunkKind Kind = (ChunkKind)KindValue) {
335    case CK_TypedText:
336    case CK_Text:
337    case CK_Placeholder:
338    case CK_Informative:
339    case CK_ResultType:
340    case CK_CurrentParameter: {
341      unsigned StrLen;
342      if (ReadUnsigned(Str, StrEnd, StrLen) || (Str + StrLen > StrEnd))
343        return false;
344
345      AddChunk(Chunk(Kind, StringRef(Str, StrLen)));
346      Str += StrLen;
347      break;
348    }
349
350    case CK_Optional: {
351      std::auto_ptr<CodeCompletionString> Optional(new CodeCompletionString());
352      if (Optional->Deserialize(Str, StrEnd))
353        AddOptionalChunk(Optional);
354      break;
355    }
356
357    case CK_LeftParen:
358    case CK_RightParen:
359    case CK_LeftBracket:
360    case CK_RightBracket:
361    case CK_LeftBrace:
362    case CK_RightBrace:
363    case CK_LeftAngle:
364    case CK_RightAngle:
365    case CK_Comma:
366    case CK_Colon:
367    case CK_SemiColon:
368    case CK_Equal:
369    case CK_HorizontalSpace:
370    case CK_VerticalSpace:
371      AddChunk(Chunk(Kind));
372      break;
373    }
374  };
375
376  return true;
377}
378
379void CodeCompletionResult::Destroy() {
380  if (Kind == RK_Pattern) {
381    delete Pattern;
382    Pattern = 0;
383  }
384}
385
386unsigned CodeCompletionResult::getPriorityFromDecl(NamedDecl *ND) {
387  if (!ND)
388    return CCP_Unlikely;
389
390  // Context-based decisions.
391  DeclContext *DC = ND->getDeclContext()->getRedeclContext();
392  if (DC->isFunctionOrMethod() || isa<BlockDecl>(DC))
393    return CCP_LocalDeclaration;
394  if (DC->isRecord() || isa<ObjCContainerDecl>(DC))
395    return CCP_MemberDeclaration;
396
397  // Content-based decisions.
398  if (isa<EnumConstantDecl>(ND))
399    return CCP_Constant;
400  if (isa<TypeDecl>(ND) || isa<ObjCInterfaceDecl>(ND))
401    return CCP_Type;
402  return CCP_Declaration;
403}
404
405//===----------------------------------------------------------------------===//
406// Code completion overload candidate implementation
407//===----------------------------------------------------------------------===//
408FunctionDecl *
409CodeCompleteConsumer::OverloadCandidate::getFunction() const {
410  if (getKind() == CK_Function)
411    return Function;
412  else if (getKind() == CK_FunctionTemplate)
413    return FunctionTemplate->getTemplatedDecl();
414  else
415    return 0;
416}
417
418const FunctionType *
419CodeCompleteConsumer::OverloadCandidate::getFunctionType() const {
420  switch (Kind) {
421  case CK_Function:
422    return Function->getType()->getAs<FunctionType>();
423
424  case CK_FunctionTemplate:
425    return FunctionTemplate->getTemplatedDecl()->getType()
426             ->getAs<FunctionType>();
427
428  case CK_FunctionType:
429    return Type;
430  }
431
432  return 0;
433}
434
435//===----------------------------------------------------------------------===//
436// Code completion consumer implementation
437//===----------------------------------------------------------------------===//
438
439CodeCompleteConsumer::~CodeCompleteConsumer() { }
440
441void
442PrintingCodeCompleteConsumer::ProcessCodeCompleteResults(Sema &SemaRef,
443                                                 CodeCompletionContext Context,
444                                                 CodeCompletionResult *Results,
445                                                         unsigned NumResults) {
446  std::stable_sort(Results, Results + NumResults);
447
448  // Print the results.
449  for (unsigned I = 0; I != NumResults; ++I) {
450    OS << "COMPLETION: ";
451    switch (Results[I].Kind) {
452    case CodeCompletionResult::RK_Declaration:
453      OS << Results[I].Declaration;
454      if (Results[I].Hidden)
455        OS << " (Hidden)";
456      if (CodeCompletionString *CCS
457            = Results[I].CreateCodeCompletionString(SemaRef)) {
458        OS << " : " << CCS->getAsString();
459        delete CCS;
460      }
461
462      OS << '\n';
463      break;
464
465    case CodeCompletionResult::RK_Keyword:
466      OS << Results[I].Keyword << '\n';
467      break;
468
469    case CodeCompletionResult::RK_Macro: {
470      OS << Results[I].Macro->getName();
471      if (CodeCompletionString *CCS
472            = Results[I].CreateCodeCompletionString(SemaRef)) {
473        OS << " : " << CCS->getAsString();
474        delete CCS;
475      }
476      OS << '\n';
477      break;
478    }
479
480    case CodeCompletionResult::RK_Pattern: {
481      OS << "Pattern : "
482         << Results[I].Pattern->getAsString() << '\n';
483      break;
484    }
485    }
486  }
487}
488
489void
490PrintingCodeCompleteConsumer::ProcessOverloadCandidates(Sema &SemaRef,
491                                                        unsigned CurrentArg,
492                                              OverloadCandidate *Candidates,
493                                                     unsigned NumCandidates) {
494  for (unsigned I = 0; I != NumCandidates; ++I) {
495    if (CodeCompletionString *CCS
496          = Candidates[I].CreateSignatureString(CurrentArg, SemaRef)) {
497      OS << "OVERLOAD: " << CCS->getAsString() << "\n";
498      delete CCS;
499    }
500  }
501}
502
503void CodeCompletionResult::computeCursorKindAndAvailability() {
504  switch (Kind) {
505  case RK_Declaration:
506    // Set the availability based on attributes.
507    Availability = CXAvailability_Available;
508    if (Declaration->getAttr<UnavailableAttr>())
509      Availability = CXAvailability_NotAvailable;
510    else if (Declaration->getAttr<DeprecatedAttr>())
511      Availability = CXAvailability_Deprecated;
512
513    if (FunctionDecl *Function = dyn_cast<FunctionDecl>(Declaration))
514      if (Function->isDeleted())
515        Availability = CXAvailability_NotAvailable;
516
517    CursorKind = getCursorKindForDecl(Declaration);
518    if (CursorKind == CXCursor_UnexposedDecl)
519      CursorKind = CXCursor_NotImplemented;
520    break;
521
522  case RK_Macro:
523    Availability = CXAvailability_Available;
524    CursorKind = CXCursor_MacroDefinition;
525    break;
526
527  case RK_Keyword:
528    Availability = CXAvailability_Available;
529    CursorKind = CXCursor_NotImplemented;
530    break;
531
532  case RK_Pattern:
533    // Do nothing: Patterns can come with cursor kinds!
534    break;
535  }
536}
537
538/// \brief Retrieve the name that should be used to order a result.
539///
540/// If the name needs to be constructed as a string, that string will be
541/// saved into Saved and the returned StringRef will refer to it.
542static llvm::StringRef getOrderedName(const CodeCompletionResult &R,
543                                    std::string &Saved) {
544  switch (R.Kind) {
545    case CodeCompletionResult::RK_Keyword:
546      return R.Keyword;
547
548    case CodeCompletionResult::RK_Pattern:
549      return R.Pattern->getTypedText();
550
551    case CodeCompletionResult::RK_Macro:
552      return R.Macro->getName();
553
554    case CodeCompletionResult::RK_Declaration:
555      // Handle declarations below.
556      break;
557  }
558
559  DeclarationName Name = R.Declaration->getDeclName();
560
561  // If the name is a simple identifier (by far the common case), or a
562  // zero-argument selector, just return a reference to that identifier.
563  if (IdentifierInfo *Id = Name.getAsIdentifierInfo())
564    return Id->getName();
565  if (Name.isObjCZeroArgSelector())
566    if (IdentifierInfo *Id
567        = Name.getObjCSelector().getIdentifierInfoForSlot(0))
568      return Id->getName();
569
570  Saved = Name.getAsString();
571  return Saved;
572}
573
574bool clang::operator<(const CodeCompletionResult &X,
575                      const CodeCompletionResult &Y) {
576  std::string XSaved, YSaved;
577  llvm::StringRef XStr = getOrderedName(X, XSaved);
578  llvm::StringRef YStr = getOrderedName(Y, YSaved);
579  int cmp = XStr.compare_lower(YStr);
580  if (cmp)
581    return cmp < 0;
582
583  // If case-insensitive comparison fails, try case-sensitive comparison.
584  cmp = XStr.compare(YStr);
585  if (cmp)
586    return cmp < 0;
587
588  return false;
589}
590
591void
592CIndexCodeCompleteConsumer::ProcessCodeCompleteResults(Sema &SemaRef,
593                                                 CodeCompletionContext Context,
594                                                 CodeCompletionResult *Results,
595                                                       unsigned NumResults) {
596  // Print the results.
597  for (unsigned I = 0; I != NumResults; ++I) {
598    WriteUnsigned(OS, Results[I].CursorKind);
599    WriteUnsigned(OS, Results[I].Priority);
600    WriteUnsigned(OS, Results[I].Availability);
601    CodeCompletionString *CCS = Results[I].CreateCodeCompletionString(SemaRef);
602    assert(CCS && "No code-completion string?");
603    CCS->Serialize(OS);
604    delete CCS;
605  }
606}
607
608void
609CIndexCodeCompleteConsumer::ProcessOverloadCandidates(Sema &SemaRef,
610                                                      unsigned CurrentArg,
611                                                OverloadCandidate *Candidates,
612                                                       unsigned NumCandidates) {
613  for (unsigned I = 0; I != NumCandidates; ++I) {
614    WriteUnsigned(OS, CXCursor_NotImplemented);
615    WriteUnsigned(OS, /*Priority=*/I);
616    WriteUnsigned(OS, /*Availability=*/CXAvailability_Available);
617    CodeCompletionString *CCS
618      = Candidates[I].CreateSignatureString(CurrentArg, SemaRef);
619    assert(CCS && "No code-completion string?");
620    CCS->Serialize(OS);
621    delete CCS;
622  }
623}
624