CodeCompleteConsumer.cpp revision 6f942b2cabf32b96f9901b889d8e44a34e0e7c62
1//===--- CodeCompleteConsumer.cpp - Code Completion Interface ---*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10//  This file implements the CodeCompleteConsumer class.
11//
12//===----------------------------------------------------------------------===//
13#include "clang/Sema/CodeCompleteConsumer.h"
14#include "clang/Sema/Scope.h"
15#include "clang/Sema/Sema.h"
16#include "clang/AST/DeclCXX.h"
17#include "clang/AST/DeclObjC.h"
18#include "clang/AST/DeclTemplate.h"
19#include "clang/Lex/Preprocessor.h"
20#include "clang-c/Index.h"
21#include "llvm/ADT/STLExtras.h"
22#include "llvm/Support/raw_ostream.h"
23#include <algorithm>
24#include <cstring>
25#include <functional>
26
27using namespace clang;
28using llvm::StringRef;
29
30//===----------------------------------------------------------------------===//
31// Code completion context implementation
32//===----------------------------------------------------------------------===//
33
34bool CodeCompletionContext::wantConstructorResults() const {
35  switch (Kind) {
36  case CCC_Other:
37  case CCC_Statement:
38  case CCC_Expression:
39  case CCC_ObjCMessageReceiver:
40  case CCC_ParenthesizedExpression:
41    return true;
42
43  case CCC_TopLevel:
44  case CCC_ObjCInterface:
45  case CCC_ObjCImplementation:
46  case CCC_ObjCIvarList:
47  case CCC_ClassStructUnion:
48  case CCC_MemberAccess:
49  case CCC_EnumTag:
50  case CCC_UnionTag:
51  case CCC_ClassOrStructTag:
52  case CCC_ObjCProtocolName:
53  case CCC_Namespace:
54  case CCC_Type:
55  case CCC_Name:
56  case CCC_PotentiallyQualifiedName:
57  case CCC_MacroName:
58  case CCC_MacroNameUse:
59  case CCC_PreprocessorExpression:
60  case CCC_PreprocessorDirective:
61  case CCC_NaturalLanguage:
62  case CCC_SelectorName:
63  case CCC_TypeQualifiers:
64    return false;
65  }
66
67  return false;
68}
69
70//===----------------------------------------------------------------------===//
71// Code completion string implementation
72//===----------------------------------------------------------------------===//
73CodeCompletionString::Chunk::Chunk(ChunkKind Kind, llvm::StringRef Text)
74  : Kind(Kind), Text("")
75{
76  switch (Kind) {
77  case CK_TypedText:
78  case CK_Text:
79  case CK_Placeholder:
80  case CK_Informative:
81  case CK_ResultType:
82  case CK_CurrentParameter: {
83    char *New = new char [Text.size() + 1];
84    std::memcpy(New, Text.data(), Text.size());
85    New[Text.size()] = '\0';
86    this->Text = New;
87    break;
88  }
89
90  case CK_Optional:
91    llvm_unreachable("Optional strings cannot be created from text");
92    break;
93
94  case CK_LeftParen:
95    this->Text = "(";
96    break;
97
98  case CK_RightParen:
99    this->Text = ")";
100    break;
101
102  case CK_LeftBracket:
103    this->Text = "[";
104    break;
105
106  case CK_RightBracket:
107    this->Text = "]";
108    break;
109
110  case CK_LeftBrace:
111    this->Text = "{";
112    break;
113
114  case CK_RightBrace:
115    this->Text = "}";
116    break;
117
118  case CK_LeftAngle:
119    this->Text = "<";
120    break;
121
122  case CK_RightAngle:
123    this->Text = ">";
124    break;
125
126  case CK_Comma:
127    this->Text = ", ";
128    break;
129
130  case CK_Colon:
131    this->Text = ":";
132    break;
133
134  case CK_SemiColon:
135    this->Text = ";";
136    break;
137
138  case CK_Equal:
139    this->Text = " = ";
140    break;
141
142  case CK_HorizontalSpace:
143    this->Text = " ";
144    break;
145
146  case CK_VerticalSpace:
147    this->Text = "\n";
148    break;
149  }
150}
151
152CodeCompletionString::Chunk
153CodeCompletionString::Chunk::CreateText(StringRef Text) {
154  return Chunk(CK_Text, Text);
155}
156
157CodeCompletionString::Chunk
158CodeCompletionString::Chunk::CreateOptional(
159                                 std::auto_ptr<CodeCompletionString> Optional) {
160  Chunk Result;
161  Result.Kind = CK_Optional;
162  Result.Optional = Optional.release();
163  return Result;
164}
165
166CodeCompletionString::Chunk
167CodeCompletionString::Chunk::CreatePlaceholder(StringRef Placeholder) {
168  return Chunk(CK_Placeholder, Placeholder);
169}
170
171CodeCompletionString::Chunk
172CodeCompletionString::Chunk::CreateInformative(StringRef Informative) {
173  return Chunk(CK_Informative, Informative);
174}
175
176CodeCompletionString::Chunk
177CodeCompletionString::Chunk::CreateResultType(StringRef ResultType) {
178  return Chunk(CK_ResultType, ResultType);
179}
180
181CodeCompletionString::Chunk
182CodeCompletionString::Chunk::CreateCurrentParameter(
183                                                StringRef CurrentParameter) {
184  return Chunk(CK_CurrentParameter, CurrentParameter);
185}
186
187CodeCompletionString::Chunk CodeCompletionString::Chunk::Clone() const {
188  switch (Kind) {
189  case CK_TypedText:
190  case CK_Text:
191  case CK_Placeholder:
192  case CK_Informative:
193  case CK_ResultType:
194  case CK_CurrentParameter:
195  case CK_LeftParen:
196  case CK_RightParen:
197  case CK_LeftBracket:
198  case CK_RightBracket:
199  case CK_LeftBrace:
200  case CK_RightBrace:
201  case CK_LeftAngle:
202  case CK_RightAngle:
203  case CK_Comma:
204  case CK_Colon:
205  case CK_SemiColon:
206  case CK_Equal:
207  case CK_HorizontalSpace:
208  case CK_VerticalSpace:
209    return Chunk(Kind, Text);
210
211  case CK_Optional: {
212    std::auto_ptr<CodeCompletionString> Opt(Optional->Clone());
213    return CreateOptional(Opt);
214  }
215  }
216
217  // Silence GCC warning.
218  return Chunk();
219}
220
221void
222CodeCompletionString::Chunk::Destroy() {
223  switch (Kind) {
224  case CK_Optional:
225    delete Optional;
226    break;
227
228  case CK_TypedText:
229  case CK_Text:
230  case CK_Placeholder:
231  case CK_Informative:
232  case CK_ResultType:
233  case CK_CurrentParameter:
234    delete [] Text;
235    break;
236
237  case CK_LeftParen:
238  case CK_RightParen:
239  case CK_LeftBracket:
240  case CK_RightBracket:
241  case CK_LeftBrace:
242  case CK_RightBrace:
243  case CK_LeftAngle:
244  case CK_RightAngle:
245  case CK_Comma:
246  case CK_Colon:
247  case CK_SemiColon:
248  case CK_Equal:
249  case CK_HorizontalSpace:
250  case CK_VerticalSpace:
251    break;
252  }
253}
254
255void CodeCompletionString::clear() {
256  std::for_each(Chunks.begin(), Chunks.end(),
257                std::mem_fun_ref(&Chunk::Destroy));
258  Chunks.clear();
259}
260
261std::string CodeCompletionString::getAsString() const {
262  std::string Result;
263  llvm::raw_string_ostream OS(Result);
264
265  for (iterator C = begin(), CEnd = end(); C != CEnd; ++C) {
266    switch (C->Kind) {
267    case CK_Optional: OS << "{#" << C->Optional->getAsString() << "#}"; break;
268    case CK_Placeholder: OS << "<#" << C->Text << "#>"; break;
269
270    case CK_Informative:
271    case CK_ResultType:
272      OS << "[#" << C->Text << "#]";
273      break;
274
275    case CK_CurrentParameter: OS << "<#" << C->Text << "#>"; break;
276    default: OS << C->Text; break;
277    }
278  }
279  return OS.str();
280}
281
282const char *CodeCompletionString::getTypedText() const {
283  for (iterator C = begin(), CEnd = end(); C != CEnd; ++C)
284    if (C->Kind == CK_TypedText)
285      return C->Text;
286
287  return 0;
288}
289
290CodeCompletionString *
291CodeCompletionString::Clone(CodeCompletionString *Result) const {
292  if (!Result)
293    Result = new CodeCompletionString;
294  for (iterator C = begin(), CEnd = end(); C != CEnd; ++C)
295    Result->AddChunk(C->Clone());
296  return Result;
297}
298
299static void WriteUnsigned(llvm::raw_ostream &OS, unsigned Value) {
300  OS.write((const char *)&Value, sizeof(unsigned));
301}
302
303static bool ReadUnsigned(const char *&Memory, const char *MemoryEnd,
304                         unsigned &Value) {
305  if (Memory + sizeof(unsigned) > MemoryEnd)
306    return true;
307
308  memmove(&Value, Memory, sizeof(unsigned));
309  Memory += sizeof(unsigned);
310  return false;
311}
312
313void CodeCompletionString::Serialize(llvm::raw_ostream &OS) const {
314  // Write the number of chunks.
315  WriteUnsigned(OS, size());
316
317  for (iterator C = begin(), CEnd = end(); C != CEnd; ++C) {
318    WriteUnsigned(OS, C->Kind);
319
320    switch (C->Kind) {
321    case CK_TypedText:
322    case CK_Text:
323    case CK_Placeholder:
324    case CK_Informative:
325    case CK_ResultType:
326    case CK_CurrentParameter: {
327      const char *Text = C->Text;
328      unsigned StrLen = strlen(Text);
329      WriteUnsigned(OS, StrLen);
330      OS.write(Text, StrLen);
331      break;
332    }
333
334    case CK_Optional:
335      C->Optional->Serialize(OS);
336      break;
337
338    case CK_LeftParen:
339    case CK_RightParen:
340    case CK_LeftBracket:
341    case CK_RightBracket:
342    case CK_LeftBrace:
343    case CK_RightBrace:
344    case CK_LeftAngle:
345    case CK_RightAngle:
346    case CK_Comma:
347    case CK_Colon:
348    case CK_SemiColon:
349    case CK_Equal:
350    case CK_HorizontalSpace:
351    case CK_VerticalSpace:
352      break;
353    }
354  }
355}
356
357bool CodeCompletionString::Deserialize(const char *&Str, const char *StrEnd) {
358  if (Str == StrEnd || *Str == 0)
359    return false;
360
361  unsigned NumBlocks;
362  if (ReadUnsigned(Str, StrEnd, NumBlocks))
363    return false;
364
365  for (unsigned I = 0; I != NumBlocks; ++I) {
366    if (Str + 1 >= StrEnd)
367      break;
368
369    // Parse the next kind.
370    unsigned KindValue;
371    if (ReadUnsigned(Str, StrEnd, KindValue))
372      return false;
373
374    switch (ChunkKind Kind = (ChunkKind)KindValue) {
375    case CK_TypedText:
376    case CK_Text:
377    case CK_Placeholder:
378    case CK_Informative:
379    case CK_ResultType:
380    case CK_CurrentParameter: {
381      unsigned StrLen;
382      if (ReadUnsigned(Str, StrEnd, StrLen) || (Str + StrLen > StrEnd))
383        return false;
384
385      AddChunk(Chunk(Kind, StringRef(Str, StrLen)));
386      Str += StrLen;
387      break;
388    }
389
390    case CK_Optional: {
391      std::auto_ptr<CodeCompletionString> Optional(new CodeCompletionString());
392      if (Optional->Deserialize(Str, StrEnd))
393        AddOptionalChunk(Optional);
394      break;
395    }
396
397    case CK_LeftParen:
398    case CK_RightParen:
399    case CK_LeftBracket:
400    case CK_RightBracket:
401    case CK_LeftBrace:
402    case CK_RightBrace:
403    case CK_LeftAngle:
404    case CK_RightAngle:
405    case CK_Comma:
406    case CK_Colon:
407    case CK_SemiColon:
408    case CK_Equal:
409    case CK_HorizontalSpace:
410    case CK_VerticalSpace:
411      AddChunk(Chunk(Kind));
412      break;
413    }
414  };
415
416  return true;
417}
418
419void CodeCompletionResult::Destroy() {
420  if (Kind == RK_Pattern) {
421    delete Pattern;
422    Pattern = 0;
423  }
424}
425
426unsigned CodeCompletionResult::getPriorityFromDecl(NamedDecl *ND) {
427  if (!ND)
428    return CCP_Unlikely;
429
430  // Context-based decisions.
431  DeclContext *DC = ND->getDeclContext()->getRedeclContext();
432  if (DC->isFunctionOrMethod() || isa<BlockDecl>(DC)) {
433    // _cmd is relatively rare
434    if (ImplicitParamDecl *ImplicitParam = dyn_cast<ImplicitParamDecl>(ND))
435      if (ImplicitParam->getIdentifier() &&
436          ImplicitParam->getIdentifier()->isStr("_cmd"))
437        return CCP_ObjC_cmd;
438
439    return CCP_LocalDeclaration;
440  }
441  if (DC->isRecord() || isa<ObjCContainerDecl>(DC))
442    return CCP_MemberDeclaration;
443
444  // Content-based decisions.
445  if (isa<EnumConstantDecl>(ND))
446    return CCP_Constant;
447  if (isa<TypeDecl>(ND) || isa<ObjCInterfaceDecl>(ND))
448    return CCP_Type;
449
450  return CCP_Declaration;
451}
452
453//===----------------------------------------------------------------------===//
454// Code completion overload candidate implementation
455//===----------------------------------------------------------------------===//
456FunctionDecl *
457CodeCompleteConsumer::OverloadCandidate::getFunction() const {
458  if (getKind() == CK_Function)
459    return Function;
460  else if (getKind() == CK_FunctionTemplate)
461    return FunctionTemplate->getTemplatedDecl();
462  else
463    return 0;
464}
465
466const FunctionType *
467CodeCompleteConsumer::OverloadCandidate::getFunctionType() const {
468  switch (Kind) {
469  case CK_Function:
470    return Function->getType()->getAs<FunctionType>();
471
472  case CK_FunctionTemplate:
473    return FunctionTemplate->getTemplatedDecl()->getType()
474             ->getAs<FunctionType>();
475
476  case CK_FunctionType:
477    return Type;
478  }
479
480  return 0;
481}
482
483//===----------------------------------------------------------------------===//
484// Code completion consumer implementation
485//===----------------------------------------------------------------------===//
486
487CodeCompleteConsumer::~CodeCompleteConsumer() { }
488
489void
490PrintingCodeCompleteConsumer::ProcessCodeCompleteResults(Sema &SemaRef,
491                                                 CodeCompletionContext Context,
492                                                 CodeCompletionResult *Results,
493                                                         unsigned NumResults) {
494  std::stable_sort(Results, Results + NumResults);
495
496  // Print the results.
497  for (unsigned I = 0; I != NumResults; ++I) {
498    OS << "COMPLETION: ";
499    switch (Results[I].Kind) {
500    case CodeCompletionResult::RK_Declaration:
501      OS << Results[I].Declaration;
502      if (Results[I].Hidden)
503        OS << " (Hidden)";
504      if (CodeCompletionString *CCS
505            = Results[I].CreateCodeCompletionString(SemaRef)) {
506        OS << " : " << CCS->getAsString();
507        delete CCS;
508      }
509
510      OS << '\n';
511      break;
512
513    case CodeCompletionResult::RK_Keyword:
514      OS << Results[I].Keyword << '\n';
515      break;
516
517    case CodeCompletionResult::RK_Macro: {
518      OS << Results[I].Macro->getName();
519      if (CodeCompletionString *CCS
520            = Results[I].CreateCodeCompletionString(SemaRef)) {
521        OS << " : " << CCS->getAsString();
522        delete CCS;
523      }
524      OS << '\n';
525      break;
526    }
527
528    case CodeCompletionResult::RK_Pattern: {
529      OS << "Pattern : "
530         << Results[I].Pattern->getAsString() << '\n';
531      break;
532    }
533    }
534  }
535}
536
537void
538PrintingCodeCompleteConsumer::ProcessOverloadCandidates(Sema &SemaRef,
539                                                        unsigned CurrentArg,
540                                              OverloadCandidate *Candidates,
541                                                     unsigned NumCandidates) {
542  for (unsigned I = 0; I != NumCandidates; ++I) {
543    if (CodeCompletionString *CCS
544          = Candidates[I].CreateSignatureString(CurrentArg, SemaRef)) {
545      OS << "OVERLOAD: " << CCS->getAsString() << "\n";
546      delete CCS;
547    }
548  }
549}
550
551void CodeCompletionResult::computeCursorKindAndAvailability() {
552  switch (Kind) {
553  case RK_Declaration:
554    // Set the availability based on attributes.
555    Availability = CXAvailability_Available;
556    if (Declaration->getAttr<UnavailableAttr>())
557      Availability = CXAvailability_NotAvailable;
558    else if (Declaration->getAttr<DeprecatedAttr>())
559      Availability = CXAvailability_Deprecated;
560
561    if (FunctionDecl *Function = dyn_cast<FunctionDecl>(Declaration))
562      if (Function->isDeleted())
563        Availability = CXAvailability_NotAvailable;
564
565    CursorKind = getCursorKindForDecl(Declaration);
566    if (CursorKind == CXCursor_UnexposedDecl)
567      CursorKind = CXCursor_NotImplemented;
568    break;
569
570  case RK_Macro:
571    Availability = CXAvailability_Available;
572    CursorKind = CXCursor_MacroDefinition;
573    break;
574
575  case RK_Keyword:
576    Availability = CXAvailability_Available;
577    CursorKind = CXCursor_NotImplemented;
578    break;
579
580  case RK_Pattern:
581    // Do nothing: Patterns can come with cursor kinds!
582    break;
583  }
584}
585
586/// \brief Retrieve the name that should be used to order a result.
587///
588/// If the name needs to be constructed as a string, that string will be
589/// saved into Saved and the returned StringRef will refer to it.
590static llvm::StringRef getOrderedName(const CodeCompletionResult &R,
591                                    std::string &Saved) {
592  switch (R.Kind) {
593    case CodeCompletionResult::RK_Keyword:
594      return R.Keyword;
595
596    case CodeCompletionResult::RK_Pattern:
597      return R.Pattern->getTypedText();
598
599    case CodeCompletionResult::RK_Macro:
600      return R.Macro->getName();
601
602    case CodeCompletionResult::RK_Declaration:
603      // Handle declarations below.
604      break;
605  }
606
607  DeclarationName Name = R.Declaration->getDeclName();
608
609  // If the name is a simple identifier (by far the common case), or a
610  // zero-argument selector, just return a reference to that identifier.
611  if (IdentifierInfo *Id = Name.getAsIdentifierInfo())
612    return Id->getName();
613  if (Name.isObjCZeroArgSelector())
614    if (IdentifierInfo *Id
615        = Name.getObjCSelector().getIdentifierInfoForSlot(0))
616      return Id->getName();
617
618  Saved = Name.getAsString();
619  return Saved;
620}
621
622bool clang::operator<(const CodeCompletionResult &X,
623                      const CodeCompletionResult &Y) {
624  std::string XSaved, YSaved;
625  llvm::StringRef XStr = getOrderedName(X, XSaved);
626  llvm::StringRef YStr = getOrderedName(Y, YSaved);
627  int cmp = XStr.compare_lower(YStr);
628  if (cmp)
629    return cmp < 0;
630
631  // If case-insensitive comparison fails, try case-sensitive comparison.
632  cmp = XStr.compare(YStr);
633  if (cmp)
634    return cmp < 0;
635
636  return false;
637}
638
639void
640CIndexCodeCompleteConsumer::ProcessCodeCompleteResults(Sema &SemaRef,
641                                                 CodeCompletionContext Context,
642                                                 CodeCompletionResult *Results,
643                                                       unsigned NumResults) {
644  // Print the results.
645  for (unsigned I = 0; I != NumResults; ++I) {
646    WriteUnsigned(OS, Results[I].CursorKind);
647    WriteUnsigned(OS, Results[I].Priority);
648    WriteUnsigned(OS, Results[I].Availability);
649    CodeCompletionString *CCS = Results[I].CreateCodeCompletionString(SemaRef);
650    assert(CCS && "No code-completion string?");
651    CCS->Serialize(OS);
652    delete CCS;
653  }
654}
655
656void
657CIndexCodeCompleteConsumer::ProcessOverloadCandidates(Sema &SemaRef,
658                                                      unsigned CurrentArg,
659                                                OverloadCandidate *Candidates,
660                                                       unsigned NumCandidates) {
661  for (unsigned I = 0; I != NumCandidates; ++I) {
662    WriteUnsigned(OS, CXCursor_NotImplemented);
663    WriteUnsigned(OS, /*Priority=*/I);
664    WriteUnsigned(OS, /*Availability=*/CXAvailability_Available);
665    CodeCompletionString *CCS
666      = Candidates[I].CreateSignatureString(CurrentArg, SemaRef);
667    assert(CCS && "No code-completion string?");
668    CCS->Serialize(OS);
669    delete CCS;
670  }
671}
672