1 //===--- CodeCompleteConsumer.cpp - Code Completion Interface ---*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file implements the CodeCompleteConsumer class.
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"
28 using namespace clang;
29 using llvm::StringRef;
31 //===----------------------------------------------------------------------===//
32 // Code completion context implementation
33 //===----------------------------------------------------------------------===//
35 bool CodeCompletionContext::wantConstructorResults() const {
40 case CCC_ObjCMessageReceiver:
41 case CCC_ParenthesizedExpression:
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:
54 case CCC_ClassOrStructTag:
55 case CCC_ObjCProtocolName:
59 case CCC_PotentiallyQualifiedName:
61 case CCC_MacroNameUse:
62 case CCC_PreprocessorExpression:
63 case CCC_PreprocessorDirective:
64 case CCC_NaturalLanguage:
65 case CCC_SelectorName:
66 case CCC_TypeQualifiers:
68 case CCC_OtherWithMacros:
69 case CCC_ObjCInstanceMessage:
70 case CCC_ObjCClassMessage:
71 case CCC_ObjCSuperclass:
72 case CCC_ObjCCategoryName:
79 //===----------------------------------------------------------------------===//
80 // Code completion string implementation
81 //===----------------------------------------------------------------------===//
82 CodeCompletionString::Chunk::Chunk(ChunkKind Kind, const char *Text)
83 : Kind(Kind), Text("")
91 case CK_CurrentParameter:
96 llvm_unreachable("Optional strings cannot be created from text");
111 case CK_RightBracket:
147 case CK_HorizontalSpace:
151 case CK_VerticalSpace:
157 CodeCompletionString::Chunk
158 CodeCompletionString::Chunk::CreateText(const char *Text) {
159 return Chunk(CK_Text, Text);
162 CodeCompletionString::Chunk
163 CodeCompletionString::Chunk::CreateOptional(CodeCompletionString *Optional) {
165 Result.Kind = CK_Optional;
166 Result.Optional = Optional;
170 CodeCompletionString::Chunk
171 CodeCompletionString::Chunk::CreatePlaceholder(const char *Placeholder) {
172 return Chunk(CK_Placeholder, Placeholder);
175 CodeCompletionString::Chunk
176 CodeCompletionString::Chunk::CreateInformative(const char *Informative) {
177 return Chunk(CK_Informative, Informative);
180 CodeCompletionString::Chunk
181 CodeCompletionString::Chunk::CreateResultType(const char *ResultType) {
182 return Chunk(CK_ResultType, ResultType);
185 CodeCompletionString::Chunk
186 CodeCompletionString::Chunk::CreateCurrentParameter(
187 const char *CurrentParameter) {
188 return Chunk(CK_CurrentParameter, CurrentParameter);
191 CodeCompletionString::CodeCompletionString(const Chunk *Chunks,
194 CXAvailabilityKind Availability)
195 : NumChunks(NumChunks), Priority(Priority), Availability(Availability)
197 Chunk *StoredChunks = reinterpret_cast<Chunk *>(this + 1);
198 for (unsigned I = 0; I != NumChunks; ++I)
199 StoredChunks[I] = Chunks[I];
202 std::string CodeCompletionString::getAsString() const {
204 llvm::raw_string_ostream OS(Result);
206 for (iterator C = begin(), CEnd = end(); C != CEnd; ++C) {
208 case CK_Optional: OS << "{#" << C->Optional->getAsString() << "#}"; break;
209 case CK_Placeholder: OS << "<#" << C->Text << "#>"; break;
213 OS << "[#" << C->Text << "#]";
216 case CK_CurrentParameter: OS << "<#" << C->Text << "#>"; break;
217 default: OS << C->Text; break;
223 const char *CodeCompletionString::getTypedText() const {
224 for (iterator C = begin(), CEnd = end(); C != CEnd; ++C)
225 if (C->Kind == CK_TypedText)
231 const char *CodeCompletionAllocator::CopyString(llvm::StringRef String) {
232 char *Mem = (char *)Allocate(String.size() + 1, 1);
233 std::copy(String.begin(), String.end(), Mem);
234 Mem[String.size()] = 0;
238 const char *CodeCompletionAllocator::CopyString(llvm::Twine String) {
239 // FIXME: It would be more efficient to teach Twine to tell us its size and
240 // then add a routine there to fill in an allocated char* with the contents
242 llvm::SmallString<128> Data;
243 return CopyString(String.toStringRef(Data));
246 CodeCompletionString *CodeCompletionBuilder::TakeString() {
247 void *Mem = Allocator.Allocate(
248 sizeof(CodeCompletionString) + sizeof(Chunk) * Chunks.size(),
249 llvm::alignOf<CodeCompletionString>());
250 CodeCompletionString *Result
251 = new (Mem) CodeCompletionString(Chunks.data(), Chunks.size(),
252 Priority, Availability);
257 unsigned CodeCompletionResult::getPriorityFromDecl(NamedDecl *ND) {
261 // Context-based decisions.
262 DeclContext *DC = ND->getDeclContext()->getRedeclContext();
263 if (DC->isFunctionOrMethod() || isa<BlockDecl>(DC)) {
264 // _cmd is relatively rare
265 if (ImplicitParamDecl *ImplicitParam = dyn_cast<ImplicitParamDecl>(ND))
266 if (ImplicitParam->getIdentifier() &&
267 ImplicitParam->getIdentifier()->isStr("_cmd"))
270 return CCP_LocalDeclaration;
272 if (DC->isRecord() || isa<ObjCContainerDecl>(DC))
273 return CCP_MemberDeclaration;
275 // Content-based decisions.
276 if (isa<EnumConstantDecl>(ND))
278 if (isa<TypeDecl>(ND) || isa<ObjCInterfaceDecl>(ND))
281 return CCP_Declaration;
284 //===----------------------------------------------------------------------===//
285 // Code completion overload candidate implementation
286 //===----------------------------------------------------------------------===//
288 CodeCompleteConsumer::OverloadCandidate::getFunction() const {
289 if (getKind() == CK_Function)
291 else if (getKind() == CK_FunctionTemplate)
292 return FunctionTemplate->getTemplatedDecl();
298 CodeCompleteConsumer::OverloadCandidate::getFunctionType() const {
301 return Function->getType()->getAs<FunctionType>();
303 case CK_FunctionTemplate:
304 return FunctionTemplate->getTemplatedDecl()->getType()
305 ->getAs<FunctionType>();
307 case CK_FunctionType:
314 //===----------------------------------------------------------------------===//
315 // Code completion consumer implementation
316 //===----------------------------------------------------------------------===//
318 CodeCompleteConsumer::~CodeCompleteConsumer() { }
321 PrintingCodeCompleteConsumer::ProcessCodeCompleteResults(Sema &SemaRef,
322 CodeCompletionContext Context,
323 CodeCompletionResult *Results,
324 unsigned NumResults) {
325 std::stable_sort(Results, Results + NumResults);
327 // Print the results.
328 for (unsigned I = 0; I != NumResults; ++I) {
329 OS << "COMPLETION: ";
330 switch (Results[I].Kind) {
331 case CodeCompletionResult::RK_Declaration:
332 OS << Results[I].Declaration;
333 if (Results[I].Hidden)
335 if (CodeCompletionString *CCS
336 = Results[I].CreateCodeCompletionString(SemaRef, Allocator)) {
337 OS << " : " << CCS->getAsString();
343 case CodeCompletionResult::RK_Keyword:
344 OS << Results[I].Keyword << '\n';
347 case CodeCompletionResult::RK_Macro: {
348 OS << Results[I].Macro->getName();
349 if (CodeCompletionString *CCS
350 = Results[I].CreateCodeCompletionString(SemaRef, Allocator)) {
351 OS << " : " << CCS->getAsString();
357 case CodeCompletionResult::RK_Pattern: {
359 << Results[I].Pattern->getAsString() << '\n';
367 PrintingCodeCompleteConsumer::ProcessOverloadCandidates(Sema &SemaRef,
369 OverloadCandidate *Candidates,
370 unsigned NumCandidates) {
371 for (unsigned I = 0; I != NumCandidates; ++I) {
372 if (CodeCompletionString *CCS
373 = Candidates[I].CreateSignatureString(CurrentArg, SemaRef,
375 OS << "OVERLOAD: " << CCS->getAsString() << "\n";
380 void CodeCompletionResult::computeCursorKindAndAvailability() {
383 // Set the availability based on attributes.
384 switch (Declaration->getAvailability()) {
386 case AR_NotYetIntroduced:
387 Availability = CXAvailability_Available;
391 Availability = CXAvailability_Deprecated;
395 Availability = CXAvailability_NotAvailable;
399 if (FunctionDecl *Function = dyn_cast<FunctionDecl>(Declaration))
400 if (Function->isDeleted())
401 Availability = CXAvailability_NotAvailable;
403 CursorKind = getCursorKindForDecl(Declaration);
404 if (CursorKind == CXCursor_UnexposedDecl)
405 CursorKind = CXCursor_NotImplemented;
409 Availability = CXAvailability_Available;
410 CursorKind = CXCursor_MacroDefinition;
414 Availability = CXAvailability_Available;
415 CursorKind = CXCursor_NotImplemented;
419 // Do nothing: Patterns can come with cursor kinds!
424 /// \brief Retrieve the name that should be used to order a result.
426 /// If the name needs to be constructed as a string, that string will be
427 /// saved into Saved and the returned StringRef will refer to it.
428 static llvm::StringRef getOrderedName(const CodeCompletionResult &R,
429 std::string &Saved) {
431 case CodeCompletionResult::RK_Keyword:
434 case CodeCompletionResult::RK_Pattern:
435 return R.Pattern->getTypedText();
437 case CodeCompletionResult::RK_Macro:
438 return R.Macro->getName();
440 case CodeCompletionResult::RK_Declaration:
441 // Handle declarations below.
445 DeclarationName Name = R.Declaration->getDeclName();
447 // If the name is a simple identifier (by far the common case), or a
448 // zero-argument selector, just return a reference to that identifier.
449 if (IdentifierInfo *Id = Name.getAsIdentifierInfo())
450 return Id->getName();
451 if (Name.isObjCZeroArgSelector())
452 if (IdentifierInfo *Id
453 = Name.getObjCSelector().getIdentifierInfoForSlot(0))
454 return Id->getName();
456 Saved = Name.getAsString();
460 bool clang::operator<(const CodeCompletionResult &X,
461 const CodeCompletionResult &Y) {
462 std::string XSaved, YSaved;
463 llvm::StringRef XStr = getOrderedName(X, XSaved);
464 llvm::StringRef YStr = getOrderedName(Y, YSaved);
465 int cmp = XStr.compare_lower(YStr);
469 // If case-insensitive comparison fails, try case-sensitive comparison.
470 cmp = XStr.compare(YStr);