Handle member initializer in C++ ctor.
[clang.git] / lib / Sema / CodeCompleteConsumer.cpp
blobee6fb3bf0e194fe7cb7f29356863de96394ba8a0
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.
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>
27 using namespace clang;
28 using llvm::StringRef;
30 //===----------------------------------------------------------------------===//
31 // Code completion context implementation
32 //===----------------------------------------------------------------------===//
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;
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 case CCC_Other:
65 return false;
68 return false;
71 //===----------------------------------------------------------------------===//
72 // Code completion string implementation
73 //===----------------------------------------------------------------------===//
74 CodeCompletionString::Chunk::Chunk(ChunkKind Kind, llvm::StringRef Text)
75 : Kind(Kind), Text("")
77 switch (Kind) {
78 case CK_TypedText:
79 case CK_Text:
80 case CK_Placeholder:
81 case CK_Informative:
82 case CK_ResultType:
83 case CK_CurrentParameter: {
84 char *New = new char [Text.size() + 1];
85 std::memcpy(New, Text.data(), Text.size());
86 New[Text.size()] = '\0';
87 this->Text = New;
88 break;
91 case CK_Optional:
92 llvm_unreachable("Optional strings cannot be created from text");
93 break;
95 case CK_LeftParen:
96 this->Text = "(";
97 break;
99 case CK_RightParen:
100 this->Text = ")";
101 break;
103 case CK_LeftBracket:
104 this->Text = "[";
105 break;
107 case CK_RightBracket:
108 this->Text = "]";
109 break;
111 case CK_LeftBrace:
112 this->Text = "{";
113 break;
115 case CK_RightBrace:
116 this->Text = "}";
117 break;
119 case CK_LeftAngle:
120 this->Text = "<";
121 break;
123 case CK_RightAngle:
124 this->Text = ">";
125 break;
127 case CK_Comma:
128 this->Text = ", ";
129 break;
131 case CK_Colon:
132 this->Text = ":";
133 break;
135 case CK_SemiColon:
136 this->Text = ";";
137 break;
139 case CK_Equal:
140 this->Text = " = ";
141 break;
143 case CK_HorizontalSpace:
144 this->Text = " ";
145 break;
147 case CK_VerticalSpace:
148 this->Text = "\n";
149 break;
153 CodeCompletionString::Chunk
154 CodeCompletionString::Chunk::CreateText(StringRef Text) {
155 return Chunk(CK_Text, Text);
158 CodeCompletionString::Chunk
159 CodeCompletionString::Chunk::CreateOptional(
160 std::auto_ptr<CodeCompletionString> Optional) {
161 Chunk Result;
162 Result.Kind = CK_Optional;
163 Result.Optional = Optional.release();
164 return Result;
167 CodeCompletionString::Chunk
168 CodeCompletionString::Chunk::CreatePlaceholder(StringRef Placeholder) {
169 return Chunk(CK_Placeholder, Placeholder);
172 CodeCompletionString::Chunk
173 CodeCompletionString::Chunk::CreateInformative(StringRef Informative) {
174 return Chunk(CK_Informative, Informative);
177 CodeCompletionString::Chunk
178 CodeCompletionString::Chunk::CreateResultType(StringRef ResultType) {
179 return Chunk(CK_ResultType, ResultType);
182 CodeCompletionString::Chunk
183 CodeCompletionString::Chunk::CreateCurrentParameter(
184 StringRef CurrentParameter) {
185 return Chunk(CK_CurrentParameter, CurrentParameter);
188 CodeCompletionString::Chunk CodeCompletionString::Chunk::Clone() const {
189 switch (Kind) {
190 case CK_TypedText:
191 case CK_Text:
192 case CK_Placeholder:
193 case CK_Informative:
194 case CK_ResultType:
195 case CK_CurrentParameter:
196 case CK_LeftParen:
197 case CK_RightParen:
198 case CK_LeftBracket:
199 case CK_RightBracket:
200 case CK_LeftBrace:
201 case CK_RightBrace:
202 case CK_LeftAngle:
203 case CK_RightAngle:
204 case CK_Comma:
205 case CK_Colon:
206 case CK_SemiColon:
207 case CK_Equal:
208 case CK_HorizontalSpace:
209 case CK_VerticalSpace:
210 return Chunk(Kind, Text);
212 case CK_Optional: {
213 std::auto_ptr<CodeCompletionString> Opt(Optional->Clone());
214 return CreateOptional(Opt);
218 // Silence GCC warning.
219 return Chunk();
222 void
223 CodeCompletionString::Chunk::Destroy() {
224 switch (Kind) {
225 case CK_Optional:
226 delete Optional;
227 break;
229 case CK_TypedText:
230 case CK_Text:
231 case CK_Placeholder:
232 case CK_Informative:
233 case CK_ResultType:
234 case CK_CurrentParameter:
235 delete [] Text;
236 break;
238 case CK_LeftParen:
239 case CK_RightParen:
240 case CK_LeftBracket:
241 case CK_RightBracket:
242 case CK_LeftBrace:
243 case CK_RightBrace:
244 case CK_LeftAngle:
245 case CK_RightAngle:
246 case CK_Comma:
247 case CK_Colon:
248 case CK_SemiColon:
249 case CK_Equal:
250 case CK_HorizontalSpace:
251 case CK_VerticalSpace:
252 break;
256 void CodeCompletionString::clear() {
257 std::for_each(Chunks.begin(), Chunks.end(),
258 std::mem_fun_ref(&Chunk::Destroy));
259 Chunks.clear();
262 std::string CodeCompletionString::getAsString() const {
263 std::string Result;
264 llvm::raw_string_ostream OS(Result);
266 for (iterator C = begin(), CEnd = end(); C != CEnd; ++C) {
267 switch (C->Kind) {
268 case CK_Optional: OS << "{#" << C->Optional->getAsString() << "#}"; break;
269 case CK_Placeholder: OS << "<#" << C->Text << "#>"; break;
271 case CK_Informative:
272 case CK_ResultType:
273 OS << "[#" << C->Text << "#]";
274 break;
276 case CK_CurrentParameter: OS << "<#" << C->Text << "#>"; break;
277 default: OS << C->Text; break;
280 return OS.str();
283 const char *CodeCompletionString::getTypedText() const {
284 for (iterator C = begin(), CEnd = end(); C != CEnd; ++C)
285 if (C->Kind == CK_TypedText)
286 return C->Text;
288 return 0;
291 CodeCompletionString *
292 CodeCompletionString::Clone(CodeCompletionString *Result) const {
293 if (!Result)
294 Result = new CodeCompletionString;
295 for (iterator C = begin(), CEnd = end(); C != CEnd; ++C)
296 Result->AddChunk(C->Clone());
297 return Result;
300 void CodeCompletionResult::Destroy() {
301 if (Kind == RK_Pattern) {
302 delete Pattern;
303 Pattern = 0;
307 unsigned CodeCompletionResult::getPriorityFromDecl(NamedDecl *ND) {
308 if (!ND)
309 return CCP_Unlikely;
311 // Context-based decisions.
312 DeclContext *DC = ND->getDeclContext()->getRedeclContext();
313 if (DC->isFunctionOrMethod() || isa<BlockDecl>(DC)) {
314 // _cmd is relatively rare
315 if (ImplicitParamDecl *ImplicitParam = dyn_cast<ImplicitParamDecl>(ND))
316 if (ImplicitParam->getIdentifier() &&
317 ImplicitParam->getIdentifier()->isStr("_cmd"))
318 return CCP_ObjC_cmd;
320 return CCP_LocalDeclaration;
322 if (DC->isRecord() || isa<ObjCContainerDecl>(DC))
323 return CCP_MemberDeclaration;
325 // Content-based decisions.
326 if (isa<EnumConstantDecl>(ND))
327 return CCP_Constant;
328 if (isa<TypeDecl>(ND) || isa<ObjCInterfaceDecl>(ND))
329 return CCP_Type;
331 return CCP_Declaration;
334 //===----------------------------------------------------------------------===//
335 // Code completion overload candidate implementation
336 //===----------------------------------------------------------------------===//
337 FunctionDecl *
338 CodeCompleteConsumer::OverloadCandidate::getFunction() const {
339 if (getKind() == CK_Function)
340 return Function;
341 else if (getKind() == CK_FunctionTemplate)
342 return FunctionTemplate->getTemplatedDecl();
343 else
344 return 0;
347 const FunctionType *
348 CodeCompleteConsumer::OverloadCandidate::getFunctionType() const {
349 switch (Kind) {
350 case CK_Function:
351 return Function->getType()->getAs<FunctionType>();
353 case CK_FunctionTemplate:
354 return FunctionTemplate->getTemplatedDecl()->getType()
355 ->getAs<FunctionType>();
357 case CK_FunctionType:
358 return Type;
361 return 0;
364 //===----------------------------------------------------------------------===//
365 // Code completion consumer implementation
366 //===----------------------------------------------------------------------===//
368 CodeCompleteConsumer::~CodeCompleteConsumer() { }
370 void
371 PrintingCodeCompleteConsumer::ProcessCodeCompleteResults(Sema &SemaRef,
372 CodeCompletionContext Context,
373 CodeCompletionResult *Results,
374 unsigned NumResults) {
375 std::stable_sort(Results, Results + NumResults);
377 // Print the results.
378 for (unsigned I = 0; I != NumResults; ++I) {
379 OS << "COMPLETION: ";
380 switch (Results[I].Kind) {
381 case CodeCompletionResult::RK_Declaration:
382 OS << Results[I].Declaration;
383 if (Results[I].Hidden)
384 OS << " (Hidden)";
385 if (CodeCompletionString *CCS
386 = Results[I].CreateCodeCompletionString(SemaRef)) {
387 OS << " : " << CCS->getAsString();
388 delete CCS;
391 OS << '\n';
392 break;
394 case CodeCompletionResult::RK_Keyword:
395 OS << Results[I].Keyword << '\n';
396 break;
398 case CodeCompletionResult::RK_Macro: {
399 OS << Results[I].Macro->getName();
400 if (CodeCompletionString *CCS
401 = Results[I].CreateCodeCompletionString(SemaRef)) {
402 OS << " : " << CCS->getAsString();
403 delete CCS;
405 OS << '\n';
406 break;
409 case CodeCompletionResult::RK_Pattern: {
410 OS << "Pattern : "
411 << Results[I].Pattern->getAsString() << '\n';
412 break;
418 void
419 PrintingCodeCompleteConsumer::ProcessOverloadCandidates(Sema &SemaRef,
420 unsigned CurrentArg,
421 OverloadCandidate *Candidates,
422 unsigned NumCandidates) {
423 for (unsigned I = 0; I != NumCandidates; ++I) {
424 if (CodeCompletionString *CCS
425 = Candidates[I].CreateSignatureString(CurrentArg, SemaRef)) {
426 OS << "OVERLOAD: " << CCS->getAsString() << "\n";
427 delete CCS;
432 void CodeCompletionResult::computeCursorKindAndAvailability() {
433 switch (Kind) {
434 case RK_Declaration:
435 // Set the availability based on attributes.
436 Availability = CXAvailability_Available;
437 if (Declaration->getAttr<UnavailableAttr>())
438 Availability = CXAvailability_NotAvailable;
439 else if (Declaration->getAttr<DeprecatedAttr>())
440 Availability = CXAvailability_Deprecated;
442 if (FunctionDecl *Function = dyn_cast<FunctionDecl>(Declaration))
443 if (Function->isDeleted())
444 Availability = CXAvailability_NotAvailable;
446 CursorKind = getCursorKindForDecl(Declaration);
447 if (CursorKind == CXCursor_UnexposedDecl)
448 CursorKind = CXCursor_NotImplemented;
449 break;
451 case RK_Macro:
452 Availability = CXAvailability_Available;
453 CursorKind = CXCursor_MacroDefinition;
454 break;
456 case RK_Keyword:
457 Availability = CXAvailability_Available;
458 CursorKind = CXCursor_NotImplemented;
459 break;
461 case RK_Pattern:
462 // Do nothing: Patterns can come with cursor kinds!
463 break;
467 /// \brief Retrieve the name that should be used to order a result.
469 /// If the name needs to be constructed as a string, that string will be
470 /// saved into Saved and the returned StringRef will refer to it.
471 static llvm::StringRef getOrderedName(const CodeCompletionResult &R,
472 std::string &Saved) {
473 switch (R.Kind) {
474 case CodeCompletionResult::RK_Keyword:
475 return R.Keyword;
477 case CodeCompletionResult::RK_Pattern:
478 return R.Pattern->getTypedText();
480 case CodeCompletionResult::RK_Macro:
481 return R.Macro->getName();
483 case CodeCompletionResult::RK_Declaration:
484 // Handle declarations below.
485 break;
488 DeclarationName Name = R.Declaration->getDeclName();
490 // If the name is a simple identifier (by far the common case), or a
491 // zero-argument selector, just return a reference to that identifier.
492 if (IdentifierInfo *Id = Name.getAsIdentifierInfo())
493 return Id->getName();
494 if (Name.isObjCZeroArgSelector())
495 if (IdentifierInfo *Id
496 = Name.getObjCSelector().getIdentifierInfoForSlot(0))
497 return Id->getName();
499 Saved = Name.getAsString();
500 return Saved;
503 bool clang::operator<(const CodeCompletionResult &X,
504 const CodeCompletionResult &Y) {
505 std::string XSaved, YSaved;
506 llvm::StringRef XStr = getOrderedName(X, XSaved);
507 llvm::StringRef YStr = getOrderedName(Y, YSaved);
508 int cmp = XStr.compare_lower(YStr);
509 if (cmp)
510 return cmp < 0;
512 // If case-insensitive comparison fails, try case-sensitive comparison.
513 cmp = XStr.compare(YStr);
514 if (cmp)
515 return cmp < 0;
517 return false;