CodeCompleteConsumer.cpp revision 221345
160484Sobrien//===--- CodeCompleteConsumer.cpp - Code Completion Interface ---*- C++ -*-===//
2130561Sobrien//
378828Sobrien//                     The LLVM Compiler Infrastructure
460484Sobrien//
560484Sobrien// This file is distributed under the University of Illinois Open Source
660484Sobrien// License. See LICENSE.TXT for details.
7130561Sobrien//
860484Sobrien//===----------------------------------------------------------------------===//
9130561Sobrien//
10130561Sobrien//  This file implements the CodeCompleteConsumer class.
11130561Sobrien//
12130561Sobrien//===----------------------------------------------------------------------===//
1360484Sobrien#include "clang/Sema/CodeCompleteConsumer.h"
14130561Sobrien#include "clang/Sema/Scope.h"
15130561Sobrien#include "clang/Sema/Sema.h"
16130561Sobrien#include "clang/AST/DeclCXX.h"
17130561Sobrien#include "clang/AST/DeclObjC.h"
1860484Sobrien#include "clang/AST/DeclTemplate.h"
19130561Sobrien#include "clang/Lex/Preprocessor.h"
20130561Sobrien#include "clang-c/Index.h"
21130561Sobrien#include "llvm/ADT/STLExtras.h"
2260484Sobrien#include "llvm/ADT/Twine.h"
2360484Sobrien#include "llvm/Support/raw_ostream.h"
2460484Sobrien#include <algorithm>
2560484Sobrien#include <cstring>
2660484Sobrien#include <functional>
2760484Sobrien
2860484Sobrienusing namespace clang;
2960484Sobrienusing llvm::StringRef;
30130561Sobrien
3160484Sobrien//===----------------------------------------------------------------------===//
32104834Sobrien// Code completion context implementation
3360484Sobrien//===----------------------------------------------------------------------===//
3460484Sobrien
3560484Sobrienbool CodeCompletionContext::wantConstructorResults() const {
3660484Sobrien  switch (Kind) {
3760484Sobrien  case CCC_Recovery:
3860484Sobrien  case CCC_Statement:
3960484Sobrien  case CCC_Expression:
4060484Sobrien  case CCC_ObjCMessageReceiver:
4160484Sobrien  case CCC_ParenthesizedExpression:
4260484Sobrien    return true;
4360484Sobrien
4460484Sobrien  case CCC_TopLevel:
4560484Sobrien  case CCC_ObjCInterface:
4660484Sobrien  case CCC_ObjCImplementation:
4760484Sobrien  case CCC_ObjCIvarList:
4860484Sobrien  case CCC_ClassStructUnion:
4960484Sobrien  case CCC_MemberAccess:
5060484Sobrien  case CCC_EnumTag:
5160484Sobrien  case CCC_UnionTag:
5260484Sobrien  case CCC_ClassOrStructTag:
5360484Sobrien  case CCC_ObjCProtocolName:
5460484Sobrien  case CCC_Namespace:
5560484Sobrien  case CCC_Type:
5660484Sobrien  case CCC_Name:
5760484Sobrien  case CCC_PotentiallyQualifiedName:
5860484Sobrien  case CCC_MacroName:
5960484Sobrien  case CCC_MacroNameUse:
6060484Sobrien  case CCC_PreprocessorExpression:
6160484Sobrien  case CCC_PreprocessorDirective:
6260484Sobrien  case CCC_NaturalLanguage:
6360484Sobrien  case CCC_SelectorName:
6460484Sobrien  case CCC_TypeQualifiers:
6577298Sobrien  case CCC_Other:
6677298Sobrien  case CCC_OtherWithMacros:
6760484Sobrien    return false;
6860484Sobrien  }
6960484Sobrien
7060484Sobrien  return false;
7160484Sobrien}
7260484Sobrien
7360484Sobrien//===----------------------------------------------------------------------===//
74130561Sobrien// Code completion string implementation
75130561Sobrien//===----------------------------------------------------------------------===//
76130561SobrienCodeCompletionString::Chunk::Chunk(ChunkKind Kind, const char *Text)
77130561Sobrien  : Kind(Kind), Text("")
78130561Sobrien{
7960484Sobrien  switch (Kind) {
8060484Sobrien  case CK_TypedText:
81130561Sobrien  case CK_Text:
82130561Sobrien  case CK_Placeholder:
83130561Sobrien  case CK_Informative:
84130561Sobrien  case CK_ResultType:
85130561Sobrien  case CK_CurrentParameter:
86130561Sobrien    this->Text = Text;
87130561Sobrien    break;
88130561Sobrien
89130561Sobrien  case CK_Optional:
90130561Sobrien    llvm_unreachable("Optional strings cannot be created from text");
9177298Sobrien    break;
9260484Sobrien
9360484Sobrien  case CK_LeftParen:
9460484Sobrien    this->Text = "(";
9560484Sobrien    break;
9660484Sobrien
97130561Sobrien  case CK_RightParen:
9860484Sobrien    this->Text = ")";
9960484Sobrien    break;
10060484Sobrien
10160484Sobrien  case CK_LeftBracket:
102130561Sobrien    this->Text = "[";
10360484Sobrien    break;
10460484Sobrien
10560484Sobrien  case CK_RightBracket:
106130561Sobrien    this->Text = "]";
107130561Sobrien    break;
108130561Sobrien
109130561Sobrien  case CK_LeftBrace:
110130561Sobrien    this->Text = "{";
111130561Sobrien    break;
112130561Sobrien
113130561Sobrien  case CK_RightBrace:
114130561Sobrien    this->Text = "}";
115130561Sobrien    break;
116130561Sobrien
117130561Sobrien  case CK_LeftAngle:
118130561Sobrien    this->Text = "<";
119130561Sobrien    break;
120130561Sobrien
121130561Sobrien  case CK_RightAngle:
122130561Sobrien    this->Text = ">";
123130561Sobrien    break;
124130561Sobrien
12560484Sobrien  case CK_Comma:
126104834Sobrien    this->Text = ", ";
12760484Sobrien    break;
128104834Sobrien
12960484Sobrien  case CK_Colon:
13060484Sobrien    this->Text = ":";
13160484Sobrien    break;
13260484Sobrien
13360484Sobrien  case CK_SemiColon:
134104834Sobrien    this->Text = ";";
135104834Sobrien    break;
13660484Sobrien
13760484Sobrien  case CK_Equal:
13860484Sobrien    this->Text = " = ";
13960484Sobrien    break;
14060484Sobrien
14160484Sobrien  case CK_HorizontalSpace:
14260484Sobrien    this->Text = " ";
143104834Sobrien    break;
144104834Sobrien
145104834Sobrien  case CK_VerticalSpace:
146104834Sobrien    this->Text = "\n";
147104834Sobrien    break;
14860484Sobrien  }
14960484Sobrien}
15060484Sobrien
15160484SobrienCodeCompletionString::Chunk
15260484SobrienCodeCompletionString::Chunk::CreateText(const char *Text) {
15360484Sobrien  return Chunk(CK_Text, Text);
15460484Sobrien}
15560484Sobrien
15660484SobrienCodeCompletionString::Chunk
15760484SobrienCodeCompletionString::Chunk::CreateOptional(CodeCompletionString *Optional) {
15860484Sobrien  Chunk Result;
15960484Sobrien  Result.Kind = CK_Optional;
16060484Sobrien  Result.Optional = Optional;
16160484Sobrien  return Result;
162130561Sobrien}
16360484Sobrien
16460484SobrienCodeCompletionString::Chunk
16560484SobrienCodeCompletionString::Chunk::CreatePlaceholder(const char *Placeholder) {
16660484Sobrien  return Chunk(CK_Placeholder, Placeholder);
16760484Sobrien}
16860484Sobrien
169130561SobrienCodeCompletionString::Chunk
17060484SobrienCodeCompletionString::Chunk::CreateInformative(const char *Informative) {
17160484Sobrien  return Chunk(CK_Informative, Informative);
17260484Sobrien}
17360484Sobrien
17460484SobrienCodeCompletionString::Chunk
17560484SobrienCodeCompletionString::Chunk::CreateResultType(const char *ResultType) {
17660484Sobrien  return Chunk(CK_ResultType, ResultType);
177130561Sobrien}
17860484Sobrien
17960484SobrienCodeCompletionString::Chunk
180130561SobrienCodeCompletionString::Chunk::CreateCurrentParameter(
18160484Sobrien                                                const char *CurrentParameter) {
18260484Sobrien  return Chunk(CK_CurrentParameter, CurrentParameter);
18360484Sobrien}
18460484Sobrien
18560484SobrienCodeCompletionString::CodeCompletionString(const Chunk *Chunks,
18660484Sobrien                                           unsigned NumChunks,
18760484Sobrien                                           unsigned Priority,
18860484Sobrien                                           CXAvailabilityKind Availability)
189130561Sobrien  : NumChunks(NumChunks), Priority(Priority), Availability(Availability)
190130561Sobrien{
191130561Sobrien  Chunk *StoredChunks = reinterpret_cast<Chunk *>(this + 1);
192130561Sobrien  for (unsigned I = 0; I != NumChunks; ++I)
193130561Sobrien    StoredChunks[I] = Chunks[I];
194130561Sobrien}
195130561Sobrien
196130561Sobrienstd::string CodeCompletionString::getAsString() const {
197130561Sobrien  std::string Result;
198130561Sobrien  llvm::raw_string_ostream OS(Result);
199130561Sobrien
200130561Sobrien  for (iterator C = begin(), CEnd = end(); C != CEnd; ++C) {
201130561Sobrien    switch (C->Kind) {
202130561Sobrien    case CK_Optional: OS << "{#" << C->Optional->getAsString() << "#}"; break;
203130561Sobrien    case CK_Placeholder: OS << "<#" << C->Text << "#>"; break;
204130561Sobrien
205130561Sobrien    case CK_Informative:
206130561Sobrien    case CK_ResultType:
20760484Sobrien      OS << "[#" << C->Text << "#]";
20860484Sobrien      break;
209104834Sobrien
21060484Sobrien    case CK_CurrentParameter: OS << "<#" << C->Text << "#>"; break;
21160484Sobrien    default: OS << C->Text; break;
212130561Sobrien    }
213130561Sobrien  }
214130561Sobrien  return OS.str();
21560484Sobrien}
216130561Sobrien
217130561Sobrienconst char *CodeCompletionString::getTypedText() const {
218130561Sobrien  for (iterator C = begin(), CEnd = end(); C != CEnd; ++C)
219130561Sobrien    if (C->Kind == CK_TypedText)
22060484Sobrien      return C->Text;
22160484Sobrien
22260484Sobrien  return 0;
223130561Sobrien}
224130561Sobrien
225130561Sobrienconst char *CodeCompletionAllocator::CopyString(llvm::StringRef String) {
226130561Sobrien  char *Mem = (char *)Allocate(String.size() + 1, 1);
227130561Sobrien  std::copy(String.begin(), String.end(), Mem);
22860484Sobrien  Mem[String.size()] = 0;
22960484Sobrien  return Mem;
23060484Sobrien}
231130561Sobrien
23260484Sobrienconst char *CodeCompletionAllocator::CopyString(llvm::Twine String) {
23360484Sobrien  // FIXME: It would be more efficient to teach Twine to tell us its size and
23460484Sobrien  // then add a routine there to fill in an allocated char* with the contents
23560484Sobrien  // of the string.
23660484Sobrien  llvm::SmallString<128> Data;
23760484Sobrien  return CopyString(String.toStringRef(Data));
23860484Sobrien}
23960484Sobrien
24060484SobrienCodeCompletionString *CodeCompletionBuilder::TakeString() {
24160484Sobrien  void *Mem = Allocator.Allocate(
24260484Sobrien                  sizeof(CodeCompletionString) + sizeof(Chunk) * Chunks.size(),
24360484Sobrien                                 llvm::alignOf<CodeCompletionString>());
24460484Sobrien  CodeCompletionString *Result
24560484Sobrien    = new (Mem) CodeCompletionString(Chunks.data(), Chunks.size(),
24660484Sobrien                               Priority, Availability);
247130561Sobrien  Chunks.clear();
24860484Sobrien  return Result;
249130561Sobrien}
25060484Sobrien
25160484Sobrienunsigned CodeCompletionResult::getPriorityFromDecl(NamedDecl *ND) {
25260484Sobrien  if (!ND)
25360484Sobrien    return CCP_Unlikely;
254130561Sobrien
255104834Sobrien  // Context-based decisions.
25680016Sobrien  DeclContext *DC = ND->getDeclContext()->getRedeclContext();
25760484Sobrien  if (DC->isFunctionOrMethod() || isa<BlockDecl>(DC)) {
25860484Sobrien    // _cmd is relatively rare
25960484Sobrien    if (ImplicitParamDecl *ImplicitParam = dyn_cast<ImplicitParamDecl>(ND))
26060484Sobrien      if (ImplicitParam->getIdentifier() &&
26160484Sobrien          ImplicitParam->getIdentifier()->isStr("_cmd"))
26260484Sobrien        return CCP_ObjC_cmd;
26360484Sobrien
26460484Sobrien    return CCP_LocalDeclaration;
26560484Sobrien  }
26660484Sobrien  if (DC->isRecord() || isa<ObjCContainerDecl>(DC))
26760484Sobrien    return CCP_MemberDeclaration;
26860484Sobrien
26960484Sobrien  // Content-based decisions.
27080016Sobrien  if (isa<EnumConstantDecl>(ND))
27160484Sobrien    return CCP_Constant;
272104834Sobrien  if (isa<TypeDecl>(ND) || isa<ObjCInterfaceDecl>(ND))
273104834Sobrien    return CCP_Type;
27460484Sobrien
275130561Sobrien  return CCP_Declaration;
27660484Sobrien}
27760484Sobrien
27860484Sobrien//===----------------------------------------------------------------------===//
27960484Sobrien// Code completion overload candidate implementation
28060484Sobrien//===----------------------------------------------------------------------===//
281130561SobrienFunctionDecl *
28260484SobrienCodeCompleteConsumer::OverloadCandidate::getFunction() const {
28360484Sobrien  if (getKind() == CK_Function)
28460484Sobrien    return Function;
28560484Sobrien  else if (getKind() == CK_FunctionTemplate)
28660484Sobrien    return FunctionTemplate->getTemplatedDecl();
28760484Sobrien  else
28860484Sobrien    return 0;
289130561Sobrien}
29060484Sobrien
29160484Sobrienconst FunctionType *
29260484SobrienCodeCompleteConsumer::OverloadCandidate::getFunctionType() const {
29360484Sobrien  switch (Kind) {
29460484Sobrien  case CK_Function:
29560484Sobrien    return Function->getType()->getAs<FunctionType>();
29660484Sobrien
29760484Sobrien  case CK_FunctionTemplate:
29860484Sobrien    return FunctionTemplate->getTemplatedDecl()->getType()
29960484Sobrien             ->getAs<FunctionType>();
30060484Sobrien
301130561Sobrien  case CK_FunctionType:
30260484Sobrien    return Type;
30360484Sobrien  }
30460484Sobrien
30560484Sobrien  return 0;
30660484Sobrien}
30760484Sobrien
30860484Sobrien//===----------------------------------------------------------------------===//
30960484Sobrien// Code completion consumer implementation
310130561Sobrien//===----------------------------------------------------------------------===//
31160484Sobrien
31260484SobrienCodeCompleteConsumer::~CodeCompleteConsumer() { }
313130561Sobrien
31460484Sobrienvoid
31560484SobrienPrintingCodeCompleteConsumer::ProcessCodeCompleteResults(Sema &SemaRef,
31660484Sobrien                                                 CodeCompletionContext Context,
31760484Sobrien                                                 CodeCompletionResult *Results,
31860484Sobrien                                                         unsigned NumResults) {
319130561Sobrien  std::stable_sort(Results, Results + NumResults);
32060484Sobrien
32160484Sobrien  // Print the results.
32260484Sobrien  for (unsigned I = 0; I != NumResults; ++I) {
32360484Sobrien    OS << "COMPLETION: ";
32460484Sobrien    switch (Results[I].Kind) {
32560484Sobrien    case CodeCompletionResult::RK_Declaration:
32660484Sobrien      OS << Results[I].Declaration;
32760484Sobrien      if (Results[I].Hidden)
32860484Sobrien        OS << " (Hidden)";
32960484Sobrien      if (CodeCompletionString *CCS
33060484Sobrien            = Results[I].CreateCodeCompletionString(SemaRef, Allocator)) {
33160484Sobrien        OS << " : " << CCS->getAsString();
332130561Sobrien      }
33360484Sobrien
33460484Sobrien      OS << '\n';
335130561Sobrien      break;
33680016Sobrien
337130561Sobrien    case CodeCompletionResult::RK_Keyword:
33860484Sobrien      OS << Results[I].Keyword << '\n';
33960484Sobrien      break;
34060484Sobrien
34160484Sobrien    case CodeCompletionResult::RK_Macro: {
34260484Sobrien      OS << Results[I].Macro->getName();
343130561Sobrien      if (CodeCompletionString *CCS
34460484Sobrien            = Results[I].CreateCodeCompletionString(SemaRef, Allocator)) {
34560484Sobrien        OS << " : " << CCS->getAsString();
34660484Sobrien      }
34760484Sobrien      OS << '\n';
34860484Sobrien      break;
34960484Sobrien    }
35060484Sobrien
35160484Sobrien    case CodeCompletionResult::RK_Pattern: {
35260484Sobrien      OS << "Pattern : "
353130561Sobrien         << Results[I].Pattern->getAsString() << '\n';
35460484Sobrien      break;
35560484Sobrien    }
35660484Sobrien    }
35760484Sobrien  }
35860484Sobrien}
35960484Sobrien
36060484Sobrienvoid
36160484SobrienPrintingCodeCompleteConsumer::ProcessOverloadCandidates(Sema &SemaRef,
36260484Sobrien                                                        unsigned CurrentArg,
36360484Sobrien                                              OverloadCandidate *Candidates,
36460484Sobrien                                                     unsigned NumCandidates) {
36560484Sobrien  for (unsigned I = 0; I != NumCandidates; ++I) {
366130561Sobrien    if (CodeCompletionString *CCS
36760484Sobrien          = Candidates[I].CreateSignatureString(CurrentArg, SemaRef,
36860484Sobrien                                                Allocator)) {
36960484Sobrien      OS << "OVERLOAD: " << CCS->getAsString() << "\n";
37060484Sobrien    }
37160484Sobrien  }
37260484Sobrien}
37360484Sobrien
37460484Sobrienvoid CodeCompletionResult::computeCursorKindAndAvailability() {
37560484Sobrien  switch (Kind) {
37660484Sobrien  case RK_Declaration:
377130561Sobrien    // Set the availability based on attributes.
37860484Sobrien    switch (Declaration->getAvailability()) {
37960484Sobrien    case AR_Available:
380130561Sobrien    case AR_NotYetIntroduced:
38160484Sobrien      Availability = CXAvailability_Available;
38260484Sobrien      break;
38360484Sobrien
38460484Sobrien    case AR_Deprecated:
38560484Sobrien      Availability = CXAvailability_Deprecated;
38660484Sobrien      break;
38760484Sobrien
38860484Sobrien    case AR_Unavailable:
38960484Sobrien      Availability = CXAvailability_NotAvailable;
39060484Sobrien      break;
39160484Sobrien    }
39260484Sobrien
39360484Sobrien    if (FunctionDecl *Function = dyn_cast<FunctionDecl>(Declaration))
394130561Sobrien      if (Function->isDeleted())
39560484Sobrien        Availability = CXAvailability_NotAvailable;
39660484Sobrien
39760484Sobrien    CursorKind = getCursorKindForDecl(Declaration);
39860484Sobrien    if (CursorKind == CXCursor_UnexposedDecl)
39960484Sobrien      CursorKind = CXCursor_NotImplemented;
40060484Sobrien    break;
40160484Sobrien
40260484Sobrien  case RK_Macro:
40360484Sobrien    Availability = CXAvailability_Available;
40460484Sobrien    CursorKind = CXCursor_MacroDefinition;
40560484Sobrien    break;
40660484Sobrien
40760484Sobrien  case RK_Keyword:
40860484Sobrien    Availability = CXAvailability_Available;
40960484Sobrien    CursorKind = CXCursor_NotImplemented;
41060484Sobrien    break;
41160484Sobrien
41260484Sobrien  case RK_Pattern:
41360484Sobrien    // Do nothing: Patterns can come with cursor kinds!
41460484Sobrien    break;
41560484Sobrien  }
41660484Sobrien}
41760484Sobrien
41860484Sobrien/// \brief Retrieve the name that should be used to order a result.
41960484Sobrien///
42060484Sobrien/// If the name needs to be constructed as a string, that string will be
42160484Sobrien/// saved into Saved and the returned StringRef will refer to it.
42260484Sobrienstatic llvm::StringRef getOrderedName(const CodeCompletionResult &R,
42360484Sobrien                                    std::string &Saved) {
42460484Sobrien  switch (R.Kind) {
42560484Sobrien    case CodeCompletionResult::RK_Keyword:
42660484Sobrien      return R.Keyword;
42760484Sobrien
42860484Sobrien    case CodeCompletionResult::RK_Pattern:
42960484Sobrien      return R.Pattern->getTypedText();
43060484Sobrien
43160484Sobrien    case CodeCompletionResult::RK_Macro:
43260484Sobrien      return R.Macro->getName();
43360484Sobrien
43460484Sobrien    case CodeCompletionResult::RK_Declaration:
43560484Sobrien      // Handle declarations below.
43660484Sobrien      break;
43760484Sobrien  }
43860484Sobrien
43960484Sobrien  DeclarationName Name = R.Declaration->getDeclName();
44060484Sobrien
44160484Sobrien  // If the name is a simple identifier (by far the common case), or a
44260484Sobrien  // zero-argument selector, just return a reference to that identifier.
44360484Sobrien  if (IdentifierInfo *Id = Name.getAsIdentifierInfo())
44460484Sobrien    return Id->getName();
44560484Sobrien  if (Name.isObjCZeroArgSelector())
44660484Sobrien    if (IdentifierInfo *Id
44760484Sobrien        = Name.getObjCSelector().getIdentifierInfoForSlot(0))
448130561Sobrien      return Id->getName();
449130561Sobrien
45060484Sobrien  Saved = Name.getAsString();
45160484Sobrien  return Saved;
452130561Sobrien}
45360484Sobrien
454130561Sobrienbool clang::operator<(const CodeCompletionResult &X,
45560484Sobrien                      const CodeCompletionResult &Y) {
45660484Sobrien  std::string XSaved, YSaved;
45760484Sobrien  llvm::StringRef XStr = getOrderedName(X, XSaved);
45860484Sobrien  llvm::StringRef YStr = getOrderedName(Y, YSaved);
45960484Sobrien  int cmp = XStr.compare_lower(YStr);
46060484Sobrien  if (cmp)
46160484Sobrien    return cmp < 0;
46260484Sobrien
46360484Sobrien  // If case-insensitive comparison fails, try case-sensitive comparison.
464130561Sobrien  cmp = XStr.compare(YStr);
465130561Sobrien  if (cmp)
466130561Sobrien    return cmp < 0;
467130561Sobrien
468130561Sobrien  return false;
469130561Sobrien}
470130561Sobrien