Home | History | Annotate | Download | only in Sema
      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/ADT/Twine.h"
     23 #include "llvm/Support/raw_ostream.h"
     24 #include <algorithm>
     25 #include <cstring>
     26 #include <functional>
     27 
     28 using namespace clang;
     29 
     30 //===----------------------------------------------------------------------===//
     31 // Code completion context implementation
     32 //===----------------------------------------------------------------------===//
     33 
     34 bool CodeCompletionContext::wantConstructorResults() const {
     35   switch (Kind) {
     36   case CCC_Recovery:
     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_DotMemberAccess:
     49   case CCC_ArrowMemberAccess:
     50   case CCC_ObjCPropertyAccess:
     51   case CCC_EnumTag:
     52   case CCC_UnionTag:
     53   case CCC_ClassOrStructTag:
     54   case CCC_ObjCProtocolName:
     55   case CCC_Namespace:
     56   case CCC_Type:
     57   case CCC_Name:
     58   case CCC_PotentiallyQualifiedName:
     59   case CCC_MacroName:
     60   case CCC_MacroNameUse:
     61   case CCC_PreprocessorExpression:
     62   case CCC_PreprocessorDirective:
     63   case CCC_NaturalLanguage:
     64   case CCC_SelectorName:
     65   case CCC_TypeQualifiers:
     66   case CCC_Other:
     67   case CCC_OtherWithMacros:
     68   case CCC_ObjCInstanceMessage:
     69   case CCC_ObjCClassMessage:
     70   case CCC_ObjCInterfaceName:
     71   case CCC_ObjCCategoryName:
     72     return false;
     73   }
     74 
     75   return false;
     76 }
     77 
     78 //===----------------------------------------------------------------------===//
     79 // Code completion string implementation
     80 //===----------------------------------------------------------------------===//
     81 CodeCompletionString::Chunk::Chunk(ChunkKind Kind, const char *Text)
     82   : Kind(Kind), Text("")
     83 {
     84   switch (Kind) {
     85   case CK_TypedText:
     86   case CK_Text:
     87   case CK_Placeholder:
     88   case CK_Informative:
     89   case CK_ResultType:
     90   case CK_CurrentParameter:
     91     this->Text = Text;
     92     break;
     93 
     94   case CK_Optional:
     95     llvm_unreachable("Optional strings cannot be created from text");
     96     break;
     97 
     98   case CK_LeftParen:
     99     this->Text = "(";
    100     break;
    101 
    102   case CK_RightParen:
    103     this->Text = ")";
    104     break;
    105 
    106   case CK_LeftBracket:
    107     this->Text = "[";
    108     break;
    109 
    110   case CK_RightBracket:
    111     this->Text = "]";
    112     break;
    113 
    114   case CK_LeftBrace:
    115     this->Text = "{";
    116     break;
    117 
    118   case CK_RightBrace:
    119     this->Text = "}";
    120     break;
    121 
    122   case CK_LeftAngle:
    123     this->Text = "<";
    124     break;
    125 
    126   case CK_RightAngle:
    127     this->Text = ">";
    128     break;
    129 
    130   case CK_Comma:
    131     this->Text = ", ";
    132     break;
    133 
    134   case CK_Colon:
    135     this->Text = ":";
    136     break;
    137 
    138   case CK_SemiColon:
    139     this->Text = ";";
    140     break;
    141 
    142   case CK_Equal:
    143     this->Text = " = ";
    144     break;
    145 
    146   case CK_HorizontalSpace:
    147     this->Text = " ";
    148     break;
    149 
    150   case CK_VerticalSpace:
    151     this->Text = "\n";
    152     break;
    153   }
    154 }
    155 
    156 CodeCompletionString::Chunk
    157 CodeCompletionString::Chunk::CreateText(const char *Text) {
    158   return Chunk(CK_Text, Text);
    159 }
    160 
    161 CodeCompletionString::Chunk
    162 CodeCompletionString::Chunk::CreateOptional(CodeCompletionString *Optional) {
    163   Chunk Result;
    164   Result.Kind = CK_Optional;
    165   Result.Optional = Optional;
    166   return Result;
    167 }
    168 
    169 CodeCompletionString::Chunk
    170 CodeCompletionString::Chunk::CreatePlaceholder(const char *Placeholder) {
    171   return Chunk(CK_Placeholder, Placeholder);
    172 }
    173 
    174 CodeCompletionString::Chunk
    175 CodeCompletionString::Chunk::CreateInformative(const char *Informative) {
    176   return Chunk(CK_Informative, Informative);
    177 }
    178 
    179 CodeCompletionString::Chunk
    180 CodeCompletionString::Chunk::CreateResultType(const char *ResultType) {
    181   return Chunk(CK_ResultType, ResultType);
    182 }
    183 
    184 CodeCompletionString::Chunk
    185 CodeCompletionString::Chunk::CreateCurrentParameter(
    186                                                 const char *CurrentParameter) {
    187   return Chunk(CK_CurrentParameter, CurrentParameter);
    188 }
    189 
    190 CodeCompletionString::CodeCompletionString(const Chunk *Chunks,
    191                                            unsigned NumChunks,
    192                                            unsigned Priority,
    193                                            CXAvailabilityKind Availability,
    194                                            const char **Annotations,
    195                                            unsigned NumAnnotations)
    196   : NumChunks(NumChunks), NumAnnotations(NumAnnotations)
    197   , Priority(Priority), Availability(Availability)
    198 {
    199   assert(NumChunks <= 0xffff);
    200   assert(NumAnnotations <= 0xffff);
    201 
    202   Chunk *StoredChunks = reinterpret_cast<Chunk *>(this + 1);
    203   for (unsigned I = 0; I != NumChunks; ++I)
    204     StoredChunks[I] = Chunks[I];
    205 
    206   const char **StoredAnnotations = reinterpret_cast<const char **>(StoredChunks + NumChunks);
    207   for (unsigned I = 0; I != NumAnnotations; ++I)
    208     StoredAnnotations[I] = Annotations[I];
    209 }
    210 
    211 unsigned CodeCompletionString::getAnnotationCount() const {
    212   return NumAnnotations;
    213 }
    214 
    215 const char *CodeCompletionString::getAnnotation(unsigned AnnotationNr) const {
    216   if (AnnotationNr < NumAnnotations)
    217     return reinterpret_cast<const char * const*>(end())[AnnotationNr];
    218   else
    219     return 0;
    220 }
    221 
    222 
    223 std::string CodeCompletionString::getAsString() const {
    224   std::string Result;
    225   llvm::raw_string_ostream OS(Result);
    226 
    227   for (iterator C = begin(), CEnd = end(); C != CEnd; ++C) {
    228     switch (C->Kind) {
    229     case CK_Optional: OS << "{#" << C->Optional->getAsString() << "#}"; break;
    230     case CK_Placeholder: OS << "<#" << C->Text << "#>"; break;
    231 
    232     case CK_Informative:
    233     case CK_ResultType:
    234       OS << "[#" << C->Text << "#]";
    235       break;
    236 
    237     case CK_CurrentParameter: OS << "<#" << C->Text << "#>"; break;
    238     default: OS << C->Text; break;
    239     }
    240   }
    241   return OS.str();
    242 }
    243 
    244 const char *CodeCompletionString::getTypedText() const {
    245   for (iterator C = begin(), CEnd = end(); C != CEnd; ++C)
    246     if (C->Kind == CK_TypedText)
    247       return C->Text;
    248 
    249   return 0;
    250 }
    251 
    252 const char *CodeCompletionAllocator::CopyString(StringRef String) {
    253   char *Mem = (char *)Allocate(String.size() + 1, 1);
    254   std::copy(String.begin(), String.end(), Mem);
    255   Mem[String.size()] = 0;
    256   return Mem;
    257 }
    258 
    259 const char *CodeCompletionAllocator::CopyString(Twine String) {
    260   // FIXME: It would be more efficient to teach Twine to tell us its size and
    261   // then add a routine there to fill in an allocated char* with the contents
    262   // of the string.
    263   llvm::SmallString<128> Data;
    264   return CopyString(String.toStringRef(Data));
    265 }
    266 
    267 CodeCompletionString *CodeCompletionBuilder::TakeString() {
    268   void *Mem = Allocator.Allocate(
    269                   sizeof(CodeCompletionString) + sizeof(Chunk) * Chunks.size()
    270                                     + sizeof(const char *) * Annotations.size(),
    271                                  llvm::alignOf<CodeCompletionString>());
    272   CodeCompletionString *Result
    273     = new (Mem) CodeCompletionString(Chunks.data(), Chunks.size(),
    274                                      Priority, Availability,
    275                                      Annotations.data(), Annotations.size());
    276   Chunks.clear();
    277   return Result;
    278 }
    279 
    280 unsigned CodeCompletionResult::getPriorityFromDecl(NamedDecl *ND) {
    281   if (!ND)
    282     return CCP_Unlikely;
    283 
    284   // Context-based decisions.
    285   DeclContext *DC = ND->getDeclContext()->getRedeclContext();
    286   if (DC->isFunctionOrMethod() || isa<BlockDecl>(DC)) {
    287     // _cmd is relatively rare
    288     if (ImplicitParamDecl *ImplicitParam = dyn_cast<ImplicitParamDecl>(ND))
    289       if (ImplicitParam->getIdentifier() &&
    290           ImplicitParam->getIdentifier()->isStr("_cmd"))
    291         return CCP_ObjC_cmd;
    292 
    293     return CCP_LocalDeclaration;
    294   }
    295   if (DC->isRecord() || isa<ObjCContainerDecl>(DC))
    296     return CCP_MemberDeclaration;
    297 
    298   // Content-based decisions.
    299   if (isa<EnumConstantDecl>(ND))
    300     return CCP_Constant;
    301   if (isa<TypeDecl>(ND) || isa<ObjCInterfaceDecl>(ND))
    302     return CCP_Type;
    303 
    304   return CCP_Declaration;
    305 }
    306 
    307 //===----------------------------------------------------------------------===//
    308 // Code completion overload candidate implementation
    309 //===----------------------------------------------------------------------===//
    310 FunctionDecl *
    311 CodeCompleteConsumer::OverloadCandidate::getFunction() const {
    312   if (getKind() == CK_Function)
    313     return Function;
    314   else if (getKind() == CK_FunctionTemplate)
    315     return FunctionTemplate->getTemplatedDecl();
    316   else
    317     return 0;
    318 }
    319 
    320 const FunctionType *
    321 CodeCompleteConsumer::OverloadCandidate::getFunctionType() const {
    322   switch (Kind) {
    323   case CK_Function:
    324     return Function->getType()->getAs<FunctionType>();
    325 
    326   case CK_FunctionTemplate:
    327     return FunctionTemplate->getTemplatedDecl()->getType()
    328              ->getAs<FunctionType>();
    329 
    330   case CK_FunctionType:
    331     return Type;
    332   }
    333 
    334   return 0;
    335 }
    336 
    337 //===----------------------------------------------------------------------===//
    338 // Code completion consumer implementation
    339 //===----------------------------------------------------------------------===//
    340 
    341 CodeCompleteConsumer::~CodeCompleteConsumer() { }
    342 
    343 void
    344 PrintingCodeCompleteConsumer::ProcessCodeCompleteResults(Sema &SemaRef,
    345                                                  CodeCompletionContext Context,
    346                                                  CodeCompletionResult *Results,
    347                                                          unsigned NumResults) {
    348   std::stable_sort(Results, Results + NumResults);
    349 
    350   // Print the results.
    351   for (unsigned I = 0; I != NumResults; ++I) {
    352     OS << "COMPLETION: ";
    353     switch (Results[I].Kind) {
    354     case CodeCompletionResult::RK_Declaration:
    355       OS << *Results[I].Declaration;
    356       if (Results[I].Hidden)
    357         OS << " (Hidden)";
    358       if (CodeCompletionString *CCS
    359             = Results[I].CreateCodeCompletionString(SemaRef, Allocator)) {
    360         OS << " : " << CCS->getAsString();
    361       }
    362 
    363       OS << '\n';
    364       break;
    365 
    366     case CodeCompletionResult::RK_Keyword:
    367       OS << Results[I].Keyword << '\n';
    368       break;
    369 
    370     case CodeCompletionResult::RK_Macro: {
    371       OS << Results[I].Macro->getName();
    372       if (CodeCompletionString *CCS
    373             = Results[I].CreateCodeCompletionString(SemaRef, Allocator)) {
    374         OS << " : " << CCS->getAsString();
    375       }
    376       OS << '\n';
    377       break;
    378     }
    379 
    380     case CodeCompletionResult::RK_Pattern: {
    381       OS << "Pattern : "
    382          << Results[I].Pattern->getAsString() << '\n';
    383       break;
    384     }
    385     }
    386   }
    387 }
    388 
    389 void
    390 PrintingCodeCompleteConsumer::ProcessOverloadCandidates(Sema &SemaRef,
    391                                                         unsigned CurrentArg,
    392                                               OverloadCandidate *Candidates,
    393                                                      unsigned NumCandidates) {
    394   for (unsigned I = 0; I != NumCandidates; ++I) {
    395     if (CodeCompletionString *CCS
    396           = Candidates[I].CreateSignatureString(CurrentArg, SemaRef,
    397                                                 Allocator)) {
    398       OS << "OVERLOAD: " << CCS->getAsString() << "\n";
    399     }
    400   }
    401 }
    402 
    403 void CodeCompletionResult::computeCursorKindAndAvailability(bool Accessible) {
    404   switch (Kind) {
    405   case RK_Declaration:
    406     // Set the availability based on attributes.
    407     switch (Declaration->getAvailability()) {
    408     case AR_Available:
    409     case AR_NotYetIntroduced:
    410       Availability = CXAvailability_Available;
    411       break;
    412 
    413     case AR_Deprecated:
    414       Availability = CXAvailability_Deprecated;
    415       break;
    416 
    417     case AR_Unavailable:
    418       Availability = CXAvailability_NotAvailable;
    419       break;
    420     }
    421 
    422     if (FunctionDecl *Function = dyn_cast<FunctionDecl>(Declaration))
    423       if (Function->isDeleted())
    424         Availability = CXAvailability_NotAvailable;
    425 
    426     CursorKind = getCursorKindForDecl(Declaration);
    427     if (CursorKind == CXCursor_UnexposedDecl)
    428       CursorKind = CXCursor_NotImplemented;
    429     break;
    430 
    431   case RK_Macro:
    432     Availability = CXAvailability_Available;
    433     CursorKind = CXCursor_MacroDefinition;
    434     break;
    435 
    436   case RK_Keyword:
    437     Availability = CXAvailability_Available;
    438     CursorKind = CXCursor_NotImplemented;
    439     break;
    440 
    441   case RK_Pattern:
    442     // Do nothing: Patterns can come with cursor kinds!
    443     break;
    444   }
    445 
    446   if (!Accessible)
    447     Availability = CXAvailability_NotAccessible;
    448 }
    449 
    450 /// \brief Retrieve the name that should be used to order a result.
    451 ///
    452 /// If the name needs to be constructed as a string, that string will be
    453 /// saved into Saved and the returned StringRef will refer to it.
    454 static StringRef getOrderedName(const CodeCompletionResult &R,
    455                                     std::string &Saved) {
    456   switch (R.Kind) {
    457     case CodeCompletionResult::RK_Keyword:
    458       return R.Keyword;
    459 
    460     case CodeCompletionResult::RK_Pattern:
    461       return R.Pattern->getTypedText();
    462 
    463     case CodeCompletionResult::RK_Macro:
    464       return R.Macro->getName();
    465 
    466     case CodeCompletionResult::RK_Declaration:
    467       // Handle declarations below.
    468       break;
    469   }
    470 
    471   DeclarationName Name = R.Declaration->getDeclName();
    472 
    473   // If the name is a simple identifier (by far the common case), or a
    474   // zero-argument selector, just return a reference to that identifier.
    475   if (IdentifierInfo *Id = Name.getAsIdentifierInfo())
    476     return Id->getName();
    477   if (Name.isObjCZeroArgSelector())
    478     if (IdentifierInfo *Id
    479         = Name.getObjCSelector().getIdentifierInfoForSlot(0))
    480       return Id->getName();
    481 
    482   Saved = Name.getAsString();
    483   return Saved;
    484 }
    485 
    486 bool clang::operator<(const CodeCompletionResult &X,
    487                       const CodeCompletionResult &Y) {
    488   std::string XSaved, YSaved;
    489   StringRef XStr = getOrderedName(X, XSaved);
    490   StringRef YStr = getOrderedName(Y, YSaved);
    491   int cmp = XStr.compare_lower(YStr);
    492   if (cmp)
    493     return cmp < 0;
    494 
    495   // If case-insensitive comparison fails, try case-sensitive comparison.
    496   cmp = XStr.compare(YStr);
    497   if (cmp)
    498     return cmp < 0;
    499 
    500   return false;
    501 }
    502