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