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/SmallString.h" 22 #include "llvm/ADT/STLExtras.h" 23 #include "llvm/ADT/Twine.h" 24 #include "llvm/Support/raw_ostream.h" 25 #include <algorithm> 26 #include <cstring> 27 #include <functional> 28 29 using namespace clang; 30 31 //===----------------------------------------------------------------------===// 32 // Code completion context implementation 33 //===----------------------------------------------------------------------===// 34 wantConstructorResults() const35 bool CodeCompletionContext::wantConstructorResults() const { 36 switch (Kind) { 37 case CCC_Recovery: 38 case CCC_Statement: 39 case CCC_Expression: 40 case CCC_ObjCMessageReceiver: 41 case CCC_ParenthesizedExpression: 42 return true; 43 44 case CCC_TopLevel: 45 case CCC_ObjCInterface: 46 case CCC_ObjCImplementation: 47 case CCC_ObjCIvarList: 48 case CCC_ClassStructUnion: 49 case CCC_DotMemberAccess: 50 case CCC_ArrowMemberAccess: 51 case CCC_ObjCPropertyAccess: 52 case CCC_EnumTag: 53 case CCC_UnionTag: 54 case CCC_ClassOrStructTag: 55 case CCC_ObjCProtocolName: 56 case CCC_Namespace: 57 case CCC_Type: 58 case CCC_Name: 59 case CCC_PotentiallyQualifiedName: 60 case CCC_MacroName: 61 case CCC_MacroNameUse: 62 case CCC_PreprocessorExpression: 63 case CCC_PreprocessorDirective: 64 case CCC_NaturalLanguage: 65 case CCC_SelectorName: 66 case CCC_TypeQualifiers: 67 case CCC_Other: 68 case CCC_OtherWithMacros: 69 case CCC_ObjCInstanceMessage: 70 case CCC_ObjCClassMessage: 71 case CCC_ObjCInterfaceName: 72 case CCC_ObjCCategoryName: 73 return false; 74 } 75 76 llvm_unreachable("Invalid CodeCompletionContext::Kind!"); 77 } 78 79 //===----------------------------------------------------------------------===// 80 // Code completion string implementation 81 //===----------------------------------------------------------------------===// Chunk(ChunkKind Kind,const char * Text)82 CodeCompletionString::Chunk::Chunk(ChunkKind Kind, const char *Text) 83 : Kind(Kind), Text("") 84 { 85 switch (Kind) { 86 case CK_TypedText: 87 case CK_Text: 88 case CK_Placeholder: 89 case CK_Informative: 90 case CK_ResultType: 91 case CK_CurrentParameter: 92 this->Text = Text; 93 break; 94 95 case CK_Optional: 96 llvm_unreachable("Optional strings cannot be created from text"); 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 CreateText(const char * Text)157 CodeCompletionString::Chunk::CreateText(const char *Text) { 158 return Chunk(CK_Text, Text); 159 } 160 161 CodeCompletionString::Chunk CreateOptional(CodeCompletionString * Optional)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 CreatePlaceholder(const char * Placeholder)170 CodeCompletionString::Chunk::CreatePlaceholder(const char *Placeholder) { 171 return Chunk(CK_Placeholder, Placeholder); 172 } 173 174 CodeCompletionString::Chunk CreateInformative(const char * Informative)175 CodeCompletionString::Chunk::CreateInformative(const char *Informative) { 176 return Chunk(CK_Informative, Informative); 177 } 178 179 CodeCompletionString::Chunk CreateResultType(const char * ResultType)180 CodeCompletionString::Chunk::CreateResultType(const char *ResultType) { 181 return Chunk(CK_ResultType, ResultType); 182 } 183 184 CodeCompletionString::Chunk CreateCurrentParameter(const char * CurrentParameter)185 CodeCompletionString::Chunk::CreateCurrentParameter( 186 const char *CurrentParameter) { 187 return Chunk(CK_CurrentParameter, CurrentParameter); 188 } 189 CodeCompletionString(const Chunk * Chunks,unsigned NumChunks,unsigned Priority,CXAvailabilityKind Availability,const char ** Annotations,unsigned NumAnnotations,CXCursorKind ParentKind,StringRef ParentName,const char * BriefComment)190 CodeCompletionString::CodeCompletionString(const Chunk *Chunks, 191 unsigned NumChunks, 192 unsigned Priority, 193 CXAvailabilityKind Availability, 194 const char **Annotations, 195 unsigned NumAnnotations, 196 CXCursorKind ParentKind, 197 StringRef ParentName, 198 const char *BriefComment) 199 : NumChunks(NumChunks), NumAnnotations(NumAnnotations), 200 Priority(Priority), Availability(Availability), ParentKind(ParentKind), 201 ParentName(ParentName), BriefComment(BriefComment) 202 { 203 assert(NumChunks <= 0xffff); 204 assert(NumAnnotations <= 0xffff); 205 206 Chunk *StoredChunks = reinterpret_cast<Chunk *>(this + 1); 207 for (unsigned I = 0; I != NumChunks; ++I) 208 StoredChunks[I] = Chunks[I]; 209 210 const char **StoredAnnotations = reinterpret_cast<const char **>(StoredChunks + NumChunks); 211 for (unsigned I = 0; I != NumAnnotations; ++I) 212 StoredAnnotations[I] = Annotations[I]; 213 } 214 getAnnotationCount() const215 unsigned CodeCompletionString::getAnnotationCount() const { 216 return NumAnnotations; 217 } 218 getAnnotation(unsigned AnnotationNr) const219 const char *CodeCompletionString::getAnnotation(unsigned AnnotationNr) const { 220 if (AnnotationNr < NumAnnotations) 221 return reinterpret_cast<const char * const*>(end())[AnnotationNr]; 222 else 223 return 0; 224 } 225 226 getAsString() const227 std::string CodeCompletionString::getAsString() const { 228 std::string Result; 229 llvm::raw_string_ostream OS(Result); 230 231 for (iterator C = begin(), CEnd = end(); C != CEnd; ++C) { 232 switch (C->Kind) { 233 case CK_Optional: OS << "{#" << C->Optional->getAsString() << "#}"; break; 234 case CK_Placeholder: OS << "<#" << C->Text << "#>"; break; 235 236 case CK_Informative: 237 case CK_ResultType: 238 OS << "[#" << C->Text << "#]"; 239 break; 240 241 case CK_CurrentParameter: OS << "<#" << C->Text << "#>"; break; 242 default: OS << C->Text; break; 243 } 244 } 245 return OS.str(); 246 } 247 getTypedText() const248 const char *CodeCompletionString::getTypedText() const { 249 for (iterator C = begin(), CEnd = end(); C != CEnd; ++C) 250 if (C->Kind == CK_TypedText) 251 return C->Text; 252 253 return 0; 254 } 255 CopyString(StringRef String)256 const char *CodeCompletionAllocator::CopyString(StringRef String) { 257 char *Mem = (char *)Allocate(String.size() + 1, 1); 258 std::copy(String.begin(), String.end(), Mem); 259 Mem[String.size()] = 0; 260 return Mem; 261 } 262 CopyString(Twine String)263 const char *CodeCompletionAllocator::CopyString(Twine String) { 264 // FIXME: It would be more efficient to teach Twine to tell us its size and 265 // then add a routine there to fill in an allocated char* with the contents 266 // of the string. 267 SmallString<128> Data; 268 return CopyString(String.toStringRef(Data)); 269 } 270 getParentName(DeclContext * DC)271 StringRef CodeCompletionTUInfo::getParentName(DeclContext *DC) { 272 NamedDecl *ND = dyn_cast<NamedDecl>(DC); 273 if (!ND) 274 return StringRef(); 275 276 // Check whether we've already cached the parent name. 277 StringRef &CachedParentName = ParentNames[DC]; 278 if (!CachedParentName.empty()) 279 return CachedParentName; 280 281 // If we already processed this DeclContext and assigned empty to it, the 282 // data pointer will be non-null. 283 if (CachedParentName.data() != 0) 284 return StringRef(); 285 286 // Find the interesting names. 287 llvm::SmallVector<DeclContext *, 2> Contexts; 288 while (DC && !DC->isFunctionOrMethod()) { 289 if (NamedDecl *ND = dyn_cast<NamedDecl>(DC)) { 290 if (ND->getIdentifier()) 291 Contexts.push_back(DC); 292 } 293 294 DC = DC->getParent(); 295 } 296 297 { 298 llvm::SmallString<128> S; 299 llvm::raw_svector_ostream OS(S); 300 bool First = true; 301 for (unsigned I = Contexts.size(); I != 0; --I) { 302 if (First) 303 First = false; 304 else { 305 OS << "::"; 306 } 307 308 DeclContext *CurDC = Contexts[I-1]; 309 if (ObjCCategoryImplDecl *CatImpl = dyn_cast<ObjCCategoryImplDecl>(CurDC)) 310 CurDC = CatImpl->getCategoryDecl(); 311 312 if (ObjCCategoryDecl *Cat = dyn_cast<ObjCCategoryDecl>(CurDC)) { 313 ObjCInterfaceDecl *Interface = Cat->getClassInterface(); 314 if (!Interface) { 315 // Assign an empty StringRef but with non-null data to distinguish 316 // between empty because we didn't process the DeclContext yet. 317 CachedParentName = StringRef((const char *)~0U, 0); 318 return StringRef(); 319 } 320 321 OS << Interface->getName() << '(' << Cat->getName() << ')'; 322 } else { 323 OS << cast<NamedDecl>(CurDC)->getName(); 324 } 325 } 326 327 CachedParentName = AllocatorRef->CopyString(OS.str()); 328 } 329 330 return CachedParentName; 331 } 332 TakeString()333 CodeCompletionString *CodeCompletionBuilder::TakeString() { 334 void *Mem = getAllocator().Allocate( 335 sizeof(CodeCompletionString) + sizeof(Chunk) * Chunks.size() 336 + sizeof(const char *) * Annotations.size(), 337 llvm::alignOf<CodeCompletionString>()); 338 CodeCompletionString *Result 339 = new (Mem) CodeCompletionString(Chunks.data(), Chunks.size(), 340 Priority, Availability, 341 Annotations.data(), Annotations.size(), 342 ParentKind, ParentName, BriefComment); 343 Chunks.clear(); 344 return Result; 345 } 346 AddTypedTextChunk(const char * Text)347 void CodeCompletionBuilder::AddTypedTextChunk(const char *Text) { 348 Chunks.push_back(Chunk(CodeCompletionString::CK_TypedText, Text)); 349 } 350 AddTextChunk(const char * Text)351 void CodeCompletionBuilder::AddTextChunk(const char *Text) { 352 Chunks.push_back(Chunk::CreateText(Text)); 353 } 354 AddOptionalChunk(CodeCompletionString * Optional)355 void CodeCompletionBuilder::AddOptionalChunk(CodeCompletionString *Optional) { 356 Chunks.push_back(Chunk::CreateOptional(Optional)); 357 } 358 AddPlaceholderChunk(const char * Placeholder)359 void CodeCompletionBuilder::AddPlaceholderChunk(const char *Placeholder) { 360 Chunks.push_back(Chunk::CreatePlaceholder(Placeholder)); 361 } 362 AddInformativeChunk(const char * Text)363 void CodeCompletionBuilder::AddInformativeChunk(const char *Text) { 364 Chunks.push_back(Chunk::CreateInformative(Text)); 365 } 366 AddResultTypeChunk(const char * ResultType)367 void CodeCompletionBuilder::AddResultTypeChunk(const char *ResultType) { 368 Chunks.push_back(Chunk::CreateResultType(ResultType)); 369 } 370 371 void AddCurrentParameterChunk(const char * CurrentParameter)372 CodeCompletionBuilder::AddCurrentParameterChunk(const char *CurrentParameter) { 373 Chunks.push_back(Chunk::CreateCurrentParameter(CurrentParameter)); 374 } 375 AddChunk(CodeCompletionString::ChunkKind CK,const char * Text)376 void CodeCompletionBuilder::AddChunk(CodeCompletionString::ChunkKind CK, 377 const char *Text) { 378 Chunks.push_back(Chunk(CK, Text)); 379 } 380 addParentContext(DeclContext * DC)381 void CodeCompletionBuilder::addParentContext(DeclContext *DC) { 382 if (DC->isTranslationUnit()) { 383 ParentKind = CXCursor_TranslationUnit; 384 return; 385 } 386 387 if (DC->isFunctionOrMethod()) 388 return; 389 390 NamedDecl *ND = dyn_cast<NamedDecl>(DC); 391 if (!ND) 392 return; 393 394 ParentKind = getCursorKindForDecl(ND); 395 ParentName = getCodeCompletionTUInfo().getParentName(DC); 396 } 397 addBriefComment(StringRef Comment)398 void CodeCompletionBuilder::addBriefComment(StringRef Comment) { 399 BriefComment = Allocator.CopyString(Comment); 400 } 401 getPriorityFromDecl(NamedDecl * ND)402 unsigned CodeCompletionResult::getPriorityFromDecl(NamedDecl *ND) { 403 if (!ND) 404 return CCP_Unlikely; 405 406 // Context-based decisions. 407 DeclContext *DC = ND->getDeclContext()->getRedeclContext(); 408 if (DC->isFunctionOrMethod() || isa<BlockDecl>(DC)) { 409 // _cmd is relatively rare 410 if (ImplicitParamDecl *ImplicitParam = dyn_cast<ImplicitParamDecl>(ND)) 411 if (ImplicitParam->getIdentifier() && 412 ImplicitParam->getIdentifier()->isStr("_cmd")) 413 return CCP_ObjC_cmd; 414 415 return CCP_LocalDeclaration; 416 } 417 if (DC->isRecord() || isa<ObjCContainerDecl>(DC)) 418 return CCP_MemberDeclaration; 419 420 // Content-based decisions. 421 if (isa<EnumConstantDecl>(ND)) 422 return CCP_Constant; 423 if (isa<TypeDecl>(ND) || isa<ObjCInterfaceDecl>(ND)) 424 return CCP_Type; 425 426 return CCP_Declaration; 427 } 428 429 //===----------------------------------------------------------------------===// 430 // Code completion overload candidate implementation 431 //===----------------------------------------------------------------------===// 432 FunctionDecl * getFunction() const433 CodeCompleteConsumer::OverloadCandidate::getFunction() const { 434 if (getKind() == CK_Function) 435 return Function; 436 else if (getKind() == CK_FunctionTemplate) 437 return FunctionTemplate->getTemplatedDecl(); 438 else 439 return 0; 440 } 441 442 const FunctionType * getFunctionType() const443 CodeCompleteConsumer::OverloadCandidate::getFunctionType() const { 444 switch (Kind) { 445 case CK_Function: 446 return Function->getType()->getAs<FunctionType>(); 447 448 case CK_FunctionTemplate: 449 return FunctionTemplate->getTemplatedDecl()->getType() 450 ->getAs<FunctionType>(); 451 452 case CK_FunctionType: 453 return Type; 454 } 455 456 llvm_unreachable("Invalid CandidateKind!"); 457 } 458 459 //===----------------------------------------------------------------------===// 460 // Code completion consumer implementation 461 //===----------------------------------------------------------------------===// 462 ~CodeCompleteConsumer()463 CodeCompleteConsumer::~CodeCompleteConsumer() { } 464 465 void ProcessCodeCompleteResults(Sema & SemaRef,CodeCompletionContext Context,CodeCompletionResult * Results,unsigned NumResults)466 PrintingCodeCompleteConsumer::ProcessCodeCompleteResults(Sema &SemaRef, 467 CodeCompletionContext Context, 468 CodeCompletionResult *Results, 469 unsigned NumResults) { 470 std::stable_sort(Results, Results + NumResults); 471 472 // Print the results. 473 for (unsigned I = 0; I != NumResults; ++I) { 474 OS << "COMPLETION: "; 475 switch (Results[I].Kind) { 476 case CodeCompletionResult::RK_Declaration: 477 OS << *Results[I].Declaration; 478 if (Results[I].Hidden) 479 OS << " (Hidden)"; 480 if (CodeCompletionString *CCS 481 = Results[I].CreateCodeCompletionString(SemaRef, getAllocator(), 482 CCTUInfo, 483 includeBriefComments())) { 484 OS << " : " << CCS->getAsString(); 485 if (const char *BriefComment = CCS->getBriefComment()) 486 OS << " : " << BriefComment; 487 } 488 489 OS << '\n'; 490 break; 491 492 case CodeCompletionResult::RK_Keyword: 493 OS << Results[I].Keyword << '\n'; 494 break; 495 496 case CodeCompletionResult::RK_Macro: { 497 OS << Results[I].Macro->getName(); 498 if (CodeCompletionString *CCS 499 = Results[I].CreateCodeCompletionString(SemaRef, getAllocator(), 500 CCTUInfo, 501 includeBriefComments())) { 502 OS << " : " << CCS->getAsString(); 503 } 504 OS << '\n'; 505 break; 506 } 507 508 case CodeCompletionResult::RK_Pattern: { 509 OS << "Pattern : " 510 << Results[I].Pattern->getAsString() << '\n'; 511 break; 512 } 513 } 514 } 515 } 516 517 void ProcessOverloadCandidates(Sema & SemaRef,unsigned CurrentArg,OverloadCandidate * Candidates,unsigned NumCandidates)518 PrintingCodeCompleteConsumer::ProcessOverloadCandidates(Sema &SemaRef, 519 unsigned CurrentArg, 520 OverloadCandidate *Candidates, 521 unsigned NumCandidates) { 522 for (unsigned I = 0; I != NumCandidates; ++I) { 523 if (CodeCompletionString *CCS 524 = Candidates[I].CreateSignatureString(CurrentArg, SemaRef, 525 getAllocator(), CCTUInfo)) { 526 OS << "OVERLOAD: " << CCS->getAsString() << "\n"; 527 } 528 } 529 } 530 531 /// \brief Retrieve the effective availability of the given declaration. getDeclAvailability(Decl * D)532 static AvailabilityResult getDeclAvailability(Decl *D) { 533 AvailabilityResult AR = D->getAvailability(); 534 if (isa<EnumConstantDecl>(D)) 535 AR = std::max(AR, cast<Decl>(D->getDeclContext())->getAvailability()); 536 return AR; 537 } 538 computeCursorKindAndAvailability(bool Accessible)539 void CodeCompletionResult::computeCursorKindAndAvailability(bool Accessible) { 540 switch (Kind) { 541 case RK_Pattern: 542 if (!Declaration) { 543 // Do nothing: Patterns can come with cursor kinds! 544 break; 545 } 546 // Fall through 547 548 case RK_Declaration: { 549 // Set the availability based on attributes. 550 switch (getDeclAvailability(Declaration)) { 551 case AR_Available: 552 case AR_NotYetIntroduced: 553 Availability = CXAvailability_Available; 554 break; 555 556 case AR_Deprecated: 557 Availability = CXAvailability_Deprecated; 558 break; 559 560 case AR_Unavailable: 561 Availability = CXAvailability_NotAvailable; 562 break; 563 } 564 565 if (FunctionDecl *Function = dyn_cast<FunctionDecl>(Declaration)) 566 if (Function->isDeleted()) 567 Availability = CXAvailability_NotAvailable; 568 569 CursorKind = getCursorKindForDecl(Declaration); 570 if (CursorKind == CXCursor_UnexposedDecl) { 571 // FIXME: Forward declarations of Objective-C classes and protocols 572 // are not directly exposed, but we want code completion to treat them 573 // like a definition. 574 if (isa<ObjCInterfaceDecl>(Declaration)) 575 CursorKind = CXCursor_ObjCInterfaceDecl; 576 else if (isa<ObjCProtocolDecl>(Declaration)) 577 CursorKind = CXCursor_ObjCProtocolDecl; 578 else 579 CursorKind = CXCursor_NotImplemented; 580 } 581 break; 582 } 583 584 case RK_Macro: 585 case RK_Keyword: 586 llvm_unreachable("Macro and keyword kinds are handled by the constructors"); 587 } 588 589 if (!Accessible) 590 Availability = CXAvailability_NotAccessible; 591 } 592 593 /// \brief Retrieve the name that should be used to order a result. 594 /// 595 /// If the name needs to be constructed as a string, that string will be 596 /// saved into Saved and the returned StringRef will refer to it. getOrderedName(const CodeCompletionResult & R,std::string & Saved)597 static StringRef getOrderedName(const CodeCompletionResult &R, 598 std::string &Saved) { 599 switch (R.Kind) { 600 case CodeCompletionResult::RK_Keyword: 601 return R.Keyword; 602 603 case CodeCompletionResult::RK_Pattern: 604 return R.Pattern->getTypedText(); 605 606 case CodeCompletionResult::RK_Macro: 607 return R.Macro->getName(); 608 609 case CodeCompletionResult::RK_Declaration: 610 // Handle declarations below. 611 break; 612 } 613 614 DeclarationName Name = R.Declaration->getDeclName(); 615 616 // If the name is a simple identifier (by far the common case), or a 617 // zero-argument selector, just return a reference to that identifier. 618 if (IdentifierInfo *Id = Name.getAsIdentifierInfo()) 619 return Id->getName(); 620 if (Name.isObjCZeroArgSelector()) 621 if (IdentifierInfo *Id 622 = Name.getObjCSelector().getIdentifierInfoForSlot(0)) 623 return Id->getName(); 624 625 Saved = Name.getAsString(); 626 return Saved; 627 } 628 operator <(const CodeCompletionResult & X,const CodeCompletionResult & Y)629 bool clang::operator<(const CodeCompletionResult &X, 630 const CodeCompletionResult &Y) { 631 std::string XSaved, YSaved; 632 StringRef XStr = getOrderedName(X, XSaved); 633 StringRef YStr = getOrderedName(Y, YSaved); 634 int cmp = XStr.compare_lower(YStr); 635 if (cmp) 636 return cmp < 0; 637 638 // If case-insensitive comparison fails, try case-sensitive comparison. 639 cmp = XStr.compare(YStr); 640 if (cmp) 641 return cmp < 0; 642 643 return false; 644 } 645